You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iggy.apache.org by ma...@apache.org on 2026/02/19 21:58:19 UTC

(iggy) branch master updated: refactor(csharp): rewrite integration tests to remove DependsOn (#2710)

This is an automated email from the ASF dual-hosted git repository.

maciej pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iggy.git


The following commit(s) were added to refs/heads/master by this push:
     new d75aa865d refactor(csharp): rewrite integration tests to remove DependsOn (#2710)
d75aa865d is described below

commit d75aa865decb9f248d0e813edea1bb40c4ff09ee
Author: Atharva Lade <92...@users.noreply.github.com>
AuthorDate: Thu Feb 19 14:58:14 2026 -0700

    refactor(csharp): rewrite integration tests to remove DependsOn (#2710)
    
    Remove all DependsOn attributes from 11 test files. Each test now
    creates its own resources with unique names via Guid.NewGuid(), ensuring
    full isolation and eliminating ordering dependencies.
    
    Delete 16 unused fixture, helper, and model files that were only needed
    by the old DependsOn-based test structure.
    
    Closes #2654
---
 .../ConsumerGroupTests.cs                          | 186 ++++++++------
 .../FetchMessagesTests.cs                          | 102 ++++++--
 .../Fixtures/ConsumerGroupFixture.cs               |  47 ----
 .../Fixtures/FetchMessagesFixture.cs               | 105 --------
 .../Fixtures/FlushMessageFixture.cs                |  57 -----
 .../Fixtures/IggyServerFixture.cs                  |   8 +
 .../Fixtures/OffsetFixtures.cs                     |  57 -----
 .../Fixtures/PartitionsFixture.cs                  |  46 ----
 .../Fixtures/PersonalAccessTokenFixture.cs         |  44 ----
 .../Fixtures/SegmentsFixture.cs                    |  46 ----
 .../Fixtures/SendMessageFixture.cs                 |  46 ----
 .../Fixtures/StreamsFixture.cs                     |  35 ---
 .../Fixtures/SystemFixture.cs                      |  78 ------
 .../Fixtures/TopicsFixture.cs                      |  43 ----
 .../Fixtures/UsersFixture.cs                       |  35 ---
 .../FlushMessagesTests.cs                          |  60 +++--
 .../Helpers/NameIdHelpers.cs                       |  33 ---
 .../Helpers/TopicFactory.cs                        |  34 ---
 .../Models/CreateTestTopic.cs                      |  51 ----
 .../Models/DummyMessage.cs                         |  49 ----
 .../Models/UpdateTestTopic.cs                      |  27 --
 .../Iggy_SDK.Tests.Integration/OffsetTests.cs      | 165 +++++++++---
 .../Iggy_SDK.Tests.Integration/PartitionsTests.cs  |  67 ++---
 .../PersonalAccessTokenTests.cs                    |  54 ++--
 .../Iggy_SDK.Tests.Integration/SegmentsTests.cs    |  54 ++--
 .../SendMessagesTests.cs                           | 131 ++++++----
 .../Iggy_SDK.Tests.Integration/StreamsTests.cs     | 178 +++++++------
 .../Iggy_SDK.Tests.Integration/SystemTests.cs      | 151 +++++------
 .../Iggy_SDK.Tests.Integration/TopicsTests.cs      | 279 ++++++++++-----------
 .../Iggy_SDK.Tests.Integration/UsersTests.cs       | 130 ++++++----
 30 files changed, 936 insertions(+), 1462 deletions(-)

diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/ConsumerGroupTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/ConsumerGroupTests.cs
index 7e11092b2..aaf516140 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/ConsumerGroupTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/ConsumerGroupTests.cs
@@ -21,195 +21,235 @@ using Apache.Iggy.Exceptions;
 using Apache.Iggy.IggyClient;
 using Apache.Iggy.Tests.Integrations.Attributes;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
 using Shouldly;
 
 namespace Apache.Iggy.Tests.Integrations;
 
 public class ConsumerGroupTests
 {
-    private static readonly uint GroupId = 0;
-    private static readonly string GroupName = "test_consumer_group";
-    private Identifier TopicId => Identifier.String(Fixture.TopicId);
+    private const uint PartitionsCount = 10;
+    private const string TopicName = "cg-topic";
+    private const string GroupName = "test_consumer_group";
 
-    [ClassDataSource<ConsumerGroupFixture>(Shared = SharedType.PerClass)]
-    public required ConsumerGroupFixture Fixture { get; init; }
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
+
+    private async Task<(IIggyClient client, string streamName)> CreateStreamAndTopic(Protocol protocol)
+    {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"cg-stream-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), TopicName, PartitionsCount);
+        return (client, streamName);
+    }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task CreateConsumerGroup_HappyPath_Should_CreateConsumerGroup_Successfully(Protocol protocol)
     {
-        var consumerGroup
-            = await Fixture.Clients[protocol]
-                .CreateConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId,
-                    GroupName);
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+
+        var consumerGroup = await client.CreateConsumerGroupAsync(
+            Identifier.String(streamName), Identifier.String(TopicName), GroupName);
 
         consumerGroup.ShouldNotBeNull();
-        consumerGroup.Id.ShouldBe(GroupId);
-        consumerGroup.PartitionsCount.ShouldBe(Fixture.PartitionsCount);
+        consumerGroup.Id.ShouldBeGreaterThanOrEqualTo(0u);
+        consumerGroup.PartitionsCount.ShouldBe(PartitionsCount);
         consumerGroup.MembersCount.ShouldBe(0u);
         consumerGroup.Name.ShouldBe(GroupName);
     }
 
     [Test]
-    [DependsOn(nameof(CreateConsumerGroup_HappyPath_Should_CreateConsumerGroup_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task CreateConsumerGroup_Should_Throw_InvalidResponse(Protocol protocol)
     {
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+        await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), GroupName);
+
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol]
-                .CreateConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId,
-                    GroupName));
+            client.CreateConsumerGroupAsync(Identifier.String(streamName),
+                Identifier.String(TopicName), GroupName));
     }
 
     [Test]
-    [DependsOn(nameof(CreateConsumerGroup_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetConsumerGroupById_Should_Return_ValidResponse(Protocol protocol)
     {
-        var response = await Fixture.Clients[protocol]
-            .GetConsumerGroupByIdAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId,
-                Identifier.Numeric(GroupId));
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+        var cg = await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), GroupName);
+
+        var response = await client.GetConsumerGroupByIdAsync(
+            Identifier.String(streamName), Identifier.String(TopicName),
+            Identifier.Numeric(cg!.Id));
 
         response.ShouldNotBeNull();
-        response.Id.ShouldBe(GroupId);
+        response.Id.ShouldBe(cg.Id);
         response.Name.ShouldBe(GroupName);
-        response.PartitionsCount.ShouldBe(Fixture.PartitionsCount);
+        response.PartitionsCount.ShouldBe(PartitionsCount);
         response.MembersCount.ShouldBe(0u);
     }
 
     [Test]
-    [DependsOn(nameof(GetConsumerGroupById_Should_Return_ValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetConsumerGroups_Should_Return_ValidResponse(Protocol protocol)
     {
-        IReadOnlyList<ConsumerGroupResponse> response
-            = await Fixture.Clients[protocol]
-                .GetConsumerGroupsAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId);
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+        await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), GroupName);
+
+        IReadOnlyList<ConsumerGroupResponse> response = await client.GetConsumerGroupsAsync(
+            Identifier.String(streamName), Identifier.String(TopicName));
 
         response.ShouldNotBeNull();
         response.Count.ShouldBe(1);
 
         var group = response.FirstOrDefault();
         group.ShouldNotBeNull();
-        group.Id.ShouldBe(GroupId);
         group.Name.ShouldBe(GroupName);
-        group.PartitionsCount.ShouldBe(Fixture.PartitionsCount);
+        group.PartitionsCount.ShouldBe(PartitionsCount);
         group.MembersCount.ShouldBe(0u);
     }
 
     [Test]
     [SkipHttp]
-    [DependsOn(nameof(GetConsumerGroups_Should_Return_ValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task JoinConsumerGroup_Tcp_Should_JoinConsumerGroup_Successfully(Protocol protocol)
     {
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+        var cg = await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), GroupName);
+
         await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol]
-                .JoinConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId,
-                    Identifier.Numeric(GroupId)));
+            client.JoinConsumerGroupAsync(Identifier.String(streamName),
+                Identifier.String(TopicName), Identifier.Numeric(cg!.Id)));
+
+        // Verify via GetMe that the client is now a member of the consumer group
+        var me = await client.GetMeAsync();
+        me.ShouldNotBeNull();
+        me.ConsumerGroupsCount.ShouldBe(1);
+        me.ConsumerGroups.ShouldContain(x => x.GroupId == (int)cg!.Id);
     }
 
     [Test]
     [SkipTcp]
-    [DependsOn(nameof(GetConsumerGroups_Should_Return_ValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task JoinConsumerGroup_Http_Should_Throw_FeatureUnavailable(Protocol protocol)
     {
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+        var cg = await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), GroupName);
+
         await Should.ThrowAsync<FeatureUnavailableException>(() =>
-            Fixture.Clients[protocol]
-                .JoinConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId,
-                    Identifier.Numeric(GroupId)));
+            client.JoinConsumerGroupAsync(Identifier.String(streamName),
+                Identifier.String(TopicName), Identifier.Numeric(cg!.Id)));
     }
 
     [Test]
     [SkipHttp]
-    [DependsOn(nameof(JoinConsumerGroup_Tcp_Should_JoinConsumerGroup_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task LeaveConsumerGroup_Tcp_Should_LeaveConsumerGroup_Successfully(Protocol protocol)
     {
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+        var cg = await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), GroupName);
+        await client.JoinConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), Identifier.Numeric(cg!.Id));
+
         await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol]
-                .LeaveConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId,
-                    Identifier.Numeric(GroupId)));
+            client.LeaveConsumerGroupAsync(Identifier.String(streamName),
+                Identifier.String(TopicName), Identifier.Numeric(cg.Id)));
+
+        // Verify via GetMe that the client is no longer a member of the consumer group
+        var me = await client.GetMeAsync();
+        me.ShouldNotBeNull();
+        me.ConsumerGroupsCount.ShouldBe(0);
+        me.ConsumerGroups.ShouldNotContain(x => x.GroupId == (int)cg.Id);
     }
 
     [Test]
     [SkipTcp]
-    [DependsOn(nameof(JoinConsumerGroup_Http_Should_Throw_FeatureUnavailable))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task LeaveConsumerGroup_Http_Should_Throw_FeatureUnavailable(Protocol protocol)
     {
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+        var cg = await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), GroupName);
+
         await Should.ThrowAsync<FeatureUnavailableException>(() =>
-            Fixture.Clients[protocol]
-                .LeaveConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId,
-                    Identifier.Numeric(GroupId)));
+            client.LeaveConsumerGroupAsync(Identifier.String(streamName),
+                Identifier.String(TopicName), Identifier.Numeric(cg!.Id)));
     }
 
     [Test]
-    [DependsOn(nameof(LeaveConsumerGroup_Http_Should_Throw_FeatureUnavailable))]
-    [DependsOn(nameof(LeaveConsumerGroup_Tcp_Should_LeaveConsumerGroup_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetConsumerGroupById_WithMembers_Should_Return_ValidResponse(Protocol protocol)
     {
-        var clientIds = new List<uint>();
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+        var cg = await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), GroupName);
+
         var clients = new List<IIggyClient>();
         for (var i = 0; i < 2; i++)
         {
-            var client = await Fixture.IggyServerFixture.CreateClient(Protocol.Tcp, protocol);
-            clients.Add(client);
-            await client.LoginUser("iggy", "iggy");
-            var me = await client.GetMeAsync();
-            clientIds.Add(me!.ClientId);
-            await client.JoinConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId,
-                Identifier.Numeric(GroupId));
+            var memberClient = await Fixture.CreateClient(Protocol.Tcp);
+            clients.Add(memberClient);
+            await memberClient.LoginUser("iggy", "iggy");
+            await memberClient.JoinConsumerGroupAsync(Identifier.String(streamName),
+                Identifier.String(TopicName), Identifier.Numeric(cg!.Id));
         }
 
-        var response = await Fixture.Clients[protocol]
-            .GetConsumerGroupByIdAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId,
-                Identifier.Numeric(GroupId));
+        var response = await client.GetConsumerGroupByIdAsync(
+            Identifier.String(streamName), Identifier.String(TopicName),
+            Identifier.Numeric(cg!.Id));
 
         response.ShouldNotBeNull();
-        response.Id.ShouldBe(GroupId);
-        response.PartitionsCount.ShouldBe(Fixture.PartitionsCount);
+        response.Id.ShouldBe(cg.Id);
+        response.PartitionsCount.ShouldBe(PartitionsCount);
         response.MembersCount.ShouldBe(2u);
         response.Members.ShouldNotBeNull();
         response.Members.Count.ShouldBe(2);
-        response.Members.ShouldAllBe(x => x.PartitionsCount >= 1 && x.PartitionsCount < (int)Fixture.PartitionsCount);
-        response.Members.ShouldAllBe(x => x.Partitions.Count >= 1 && x.Partitions.Count < (int)Fixture.PartitionsCount);
-        response.Members.Sum(x => x.PartitionsCount).ShouldBe((int)Fixture.PartitionsCount);
+        response.Members.ShouldAllBe(x => x.PartitionsCount >= 1 && x.PartitionsCount < (int)PartitionsCount);
+        response.Members.ShouldAllBe(x => x.Partitions.Count >= 1 && x.Partitions.Count < (int)PartitionsCount);
+        response.Members.Sum(x => x.PartitionsCount).ShouldBe((int)PartitionsCount);
     }
 
     [Test]
-    [DependsOn(nameof(GetConsumerGroupById_WithMembers_Should_Return_ValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeleteConsumerGroup_Should_DeleteConsumerGroup_Successfully(Protocol protocol)
     {
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+        var cg = await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), GroupName);
+
         await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol].DeleteConsumerGroupAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId, Identifier.Numeric(GroupId)));
+            client.DeleteConsumerGroupAsync(Identifier.String(streamName),
+                Identifier.String(TopicName), Identifier.Numeric(cg!.Id)));
     }
 
     [Test]
     [SkipHttp]
-    [DependsOn(nameof(DeleteConsumerGroup_Should_DeleteConsumerGroup_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task JoinConsumerGroup_Tcp_Should_Throw_InvalidResponse(Protocol protocol)
     {
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+
+        // Try to join a consumer group that doesn't exist
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol]
-                .JoinConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId,
-                    Identifier.Numeric(GroupId)));
+            client.JoinConsumerGroupAsync(Identifier.String(streamName),
+                Identifier.String(TopicName), Identifier.Numeric(99999)));
     }
 
-
     [Test]
-    [DependsOn(nameof(JoinConsumerGroup_Tcp_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeleteConsumerGroup_Should_Throw_InvalidResponse(Protocol protocol)
     {
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol].DeleteConsumerGroupAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId, Identifier.Numeric(GroupId)));
+            client.DeleteConsumerGroupAsync(Identifier.String(streamName),
+                Identifier.String(TopicName), Identifier.Numeric(99999)));
     }
 }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/FetchMessagesTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/FetchMessagesTests.cs
index b5d0fae1e..4a32eff1f 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/FetchMessagesTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/FetchMessagesTests.cs
@@ -15,37 +15,65 @@
 // // specific language governing permissions and limitations
 // // under the License.
 
+using System.Text;
 using Apache.Iggy.Contracts;
 using Apache.Iggy.Enums;
 using Apache.Iggy.Exceptions;
 using Apache.Iggy.Headers;
+using Apache.Iggy.IggyClient;
 using Apache.Iggy.Kinds;
-using Apache.Iggy.Tests.Integrations.Attributes;
+using Apache.Iggy.Messages;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
 using Shouldly;
+using Partitioning = Apache.Iggy.Kinds.Partitioning;
 
 namespace Apache.Iggy.Tests.Integrations;
 
 public class FetchMessagesTests
 {
-    [ClassDataSource<FetchMessagesFixture>(Shared = SharedType.PerClass)]
-    public required FetchMessagesFixture Fixture { get; init; }
+    private const int MessageCount = 20;
+    private const string TopicName = "topic";
+    private const string HeadersTopicName = "headers-topic";
 
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
+
+    private async Task<(IIggyClient client, string streamName)> CreateStreamWithMessages(Protocol protocol)
+    {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"fetch-msg-{Guid.NewGuid():N}";
+
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), TopicName, 1);
+        await client.CreateTopicAsync(Identifier.String(streamName), HeadersTopicName, 1);
+
+        await client.SendMessagesAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), Partitioning.None(),
+            CreateMessagesWithoutHeader(MessageCount));
+
+        await client.SendMessagesAsync(Identifier.String(streamName),
+            Identifier.String(HeadersTopicName), Partitioning.None(),
+            CreateMessagesWithHeader(MessageCount));
+
+        return (client, streamName);
+    }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task PollMessages_WithNoHeaders_Should_PollMessages_Successfully(Protocol protocol)
     {
-        var response = await Fixture.Clients[protocol].PollMessagesAsync(new MessageFetchRequest
+        var (client, streamName) = await CreateStreamWithMessages(protocol);
+
+        var response = await client.PollMessagesAsync(new MessageFetchRequest
         {
             Count = 10,
             AutoCommit = true,
             Consumer = Consumer.New(1),
             PartitionId = 0,
             PollingStrategy = PollingStrategy.Next(),
-            StreamId = Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            TopicId = Identifier.String(Fixture.TopicRequest.Name)
+            StreamId = Identifier.String(streamName),
+            TopicId = Identifier.String(TopicName)
         });
 
         response.Messages.Count.ShouldBe(10);
@@ -61,10 +89,11 @@ public class FetchMessagesTests
     }
 
     [Test]
-    [DependsOn(nameof(PollMessages_WithNoHeaders_Should_PollMessages_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task PollMessages_InvalidTopic_Should_Throw_InvalidResponse(Protocol protocol)
     {
+        var (client, streamName) = await CreateStreamWithMessages(protocol);
+
         var invalidFetchRequest = new MessageFetchRequest
         {
             Count = 10,
@@ -72,19 +101,20 @@ public class FetchMessagesTests
             Consumer = Consumer.New(1),
             PartitionId = 0,
             PollingStrategy = PollingStrategy.Next(),
-            StreamId = Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
+            StreamId = Identifier.String(streamName),
             TopicId = Identifier.Numeric(2137)
         };
 
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol].PollMessagesAsync(invalidFetchRequest));
+            client.PollMessagesAsync(invalidFetchRequest));
     }
 
     [Test]
-    [DependsOn(nameof(PollMessages_InvalidTopic_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task PollMessages_WithHeaders_Should_PollMessages_Successfully(Protocol protocol)
     {
+        var (client, streamName) = await CreateStreamWithMessages(protocol);
+
         var headersMessageFetchRequest = new MessageFetchRequest
         {
             Count = 10,
@@ -92,12 +122,11 @@ public class FetchMessagesTests
             Consumer = Consumer.New(1),
             PartitionId = 0,
             PollingStrategy = PollingStrategy.Next(),
-            StreamId = Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            TopicId = Identifier.String(Fixture.TopicHeadersRequest.Name)
+            StreamId = Identifier.String(streamName),
+            TopicId = Identifier.String(HeadersTopicName)
         };
 
-
-        var response = await Fixture.Clients[protocol].PollMessagesAsync(headersMessageFetchRequest);
+        var response = await client.PollMessagesAsync(headersMessageFetchRequest);
         response.Messages.Count.ShouldBe(10);
         response.PartitionId.ShouldBe(0);
         response.CurrentOffset.ShouldBe(19u);
@@ -109,4 +138,47 @@ public class FetchMessagesTests
             responseMessage.UserHeaders[HeaderKey.FromString("header2")].ToInt32().ShouldBeGreaterThan(0);
         }
     }
+
+    private static Message[] CreateMessagesWithoutHeader(int count)
+    {
+        var messages = new List<Message>();
+        for (var i = 0; i < count; i++)
+        {
+            var dummyJson = $$"""
+                              {
+                                "userId": {{i + 1}},
+                                "id": {{i + 1}},
+                                "title": "delete",
+                                "completed": false
+                              }
+                              """;
+            messages.Add(new Message(Guid.NewGuid(), Encoding.UTF8.GetBytes(dummyJson)));
+        }
+
+        return messages.ToArray();
+    }
+
+    private static Message[] CreateMessagesWithHeader(int count)
+    {
+        var messages = new List<Message>();
+        for (var i = 0; i < count; i++)
+        {
+            var dummyJson = $$"""
+                              {
+                                "userId": {{i + 1}},
+                                "id": {{i + 1}},
+                                "title": "delete",
+                                "completed": false
+                              }
+                              """;
+            messages.Add(new Message(Guid.NewGuid(), Encoding.UTF8.GetBytes(dummyJson),
+                new Dictionary<HeaderKey, HeaderValue>
+                {
+                    { HeaderKey.FromString("header1"), HeaderValue.FromString("value1") },
+                    { HeaderKey.FromString("header2"), HeaderValue.FromInt32(14 + i) }
+                }));
+        }
+
+        return messages.ToArray();
+    }
 }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/ConsumerGroupFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/ConsumerGroupFixture.cs
deleted file mode 100644
index f8425565e..000000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/ConsumerGroupFixture.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using Apache.Iggy.Tests.Integrations.Helpers;
-using TUnit.Core.Interfaces;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class ConsumerGroupFixture : IAsyncInitializer
-{
-    internal readonly uint PartitionsCount = 10;
-    internal readonly string StreamId = "ConsumerGroupStream";
-    internal readonly string TopicId = "ConsumerGroupTopic";
-
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-
-        foreach (KeyValuePair<Protocol, IIggyClient> client in Clients)
-        {
-            await client.Value.CreateStreamAsync(StreamId.GetWithProtocol(client.Key));
-            await client.Value.CreateTopicAsync(Identifier.String(StreamId.GetWithProtocol(client.Key)), TopicId,
-                PartitionsCount);
-        }
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/FetchMessagesFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/FetchMessagesFixture.cs
deleted file mode 100644
index 5b2dd71a0..000000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/FetchMessagesFixture.cs
+++ /dev/null
@@ -1,105 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using System.Text;
-using Apache.Iggy.Enums;
-using Apache.Iggy.Headers;
-using Apache.Iggy.IggyClient;
-using Apache.Iggy.Messages;
-using Apache.Iggy.Tests.Integrations.Helpers;
-using Apache.Iggy.Tests.Integrations.Models;
-using TUnit.Core.Interfaces;
-using Partitioning = Apache.Iggy.Kinds.Partitioning;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class FetchMessagesFixture : IAsyncInitializer
-{
-    internal readonly int MessageCount = 20;
-    internal readonly string StreamId = "FetchMessagesStream";
-    internal readonly CreateTestTopic TopicHeadersRequest = TopicFactory.CreateTopic("HeadersTopic");
-    internal readonly CreateTestTopic TopicRequest = TopicFactory.CreateTopic("Topic");
-
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-        foreach (KeyValuePair<Protocol, IIggyClient> client in Clients)
-        {
-            var streamId = Identifier.String(StreamId.GetWithProtocol(client.Key));
-
-            await client.Value.CreateStreamAsync(streamId.GetString());
-            await client.Value.CreateTopicAsync(streamId, TopicRequest.Name,
-                TopicRequest.PartitionsCount);
-            await client.Value.CreateTopicAsync(streamId, TopicHeadersRequest.Name,
-                TopicHeadersRequest.PartitionsCount);
-
-            await client.Value.SendMessagesAsync(streamId, Identifier.String(TopicRequest.Name), Partitioning.None(),
-                CreateMessagesWithoutHeader(MessageCount));
-
-            await client.Value.SendMessagesAsync(streamId, Identifier.String(TopicHeadersRequest.Name),
-                Partitioning.None(), CreateMessagesWithHeader(MessageCount));
-        }
-    }
-
-    private static Message[] CreateMessagesWithoutHeader(int count)
-    {
-        var messages = new List<Message>();
-        for (var i = 0; i < count; i++)
-        {
-            var dummyJson = $$"""
-                              {
-                                "userId": {{i + 1}},
-                                "id": {{i + 1}},
-                                "title": "delete",
-                                "completed": false
-                              }
-                              """;
-            messages.Add(new Message(Guid.NewGuid(), Encoding.UTF8.GetBytes(dummyJson)));
-        }
-
-        return messages.ToArray();
-    }
-
-    private static Message[] CreateMessagesWithHeader(int count)
-    {
-        var messages = new List<Message>();
-        for (var i = 0; i < count; i++)
-        {
-            var dummyJson = $$"""
-                              {
-                                "userId": {{i + 1}},
-                                "id": {{i + 1}},
-                                "title": "delete",
-                                "completed": false
-                              }
-                              """;
-            messages.Add(new Message(Guid.NewGuid(), Encoding.UTF8.GetBytes(dummyJson),
-                new Dictionary<HeaderKey, HeaderValue>
-                {
-                    { HeaderKey.FromString("header1"), HeaderValue.FromString("value1") },
-                    { HeaderKey.FromString("header2"), HeaderValue.FromInt32(14 + i) }
-                }));
-        }
-
-        return messages.ToArray();
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/FlushMessageFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/FlushMessageFixture.cs
deleted file mode 100644
index 511a4bcd5..000000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/FlushMessageFixture.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using Apache.Iggy.Messages;
-using Apache.Iggy.Tests.Integrations.Helpers;
-using Apache.Iggy.Tests.Integrations.Models;
-using TUnit.Core.Interfaces;
-using Partitioning = Apache.Iggy.Kinds.Partitioning;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class FlushMessageFixture : IAsyncInitializer
-{
-    internal readonly string StreamId = "FlushMessageStream";
-    internal readonly CreateTestTopic TopicRequest = TopicFactory.CreateTopic("Topic");
-
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-        foreach (KeyValuePair<Protocol, IIggyClient> client in Clients)
-        {
-            await client.Value.CreateStreamAsync(StreamId.GetWithProtocol(client.Key));
-            await client.Value.CreateTopicAsync(Identifier.String(StreamId.GetWithProtocol(client.Key)),
-                TopicRequest.Name, TopicRequest.PartitionsCount);
-
-            var messages = new Message[]
-            {
-                new(Guid.NewGuid(), "Test message 1"u8.ToArray()),
-                new(Guid.NewGuid(), "Test message 2"u8.ToArray()),
-                new(Guid.NewGuid(), "Test message 3"u8.ToArray()), new(Guid.NewGuid(), "Test message 4"u8.ToArray())
-            };
-            await client.Value.SendMessagesAsync(Identifier.String(StreamId.GetWithProtocol(client.Key)),
-                Identifier.String(TopicRequest.Name), Partitioning.None(), messages);
-        }
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/IggyServerFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/IggyServerFixture.cs
index 1c2fc9b47..b3f41dfcf 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/IggyServerFixture.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/IggyServerFixture.cs
@@ -159,6 +159,14 @@ public class IggyServerFixture : IAsyncInitializer, IAsyncDisposable
         return dictionary;
     }
 
+    public async Task<IIggyClient> CreateAuthenticatedClient(Protocol protocol, string userName = "iggy",
+        string password = "iggy")
+    {
+        return protocol == Protocol.Tcp
+            ? await CreateTcpClient(userName, password)
+            : await CreateHttpClient(userName, password);
+    }
+
     public async Task<IIggyClient> CreateTcpClient(string userName = "iggy", string password = "iggy",
         bool connect = true)
     {
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/OffsetFixtures.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/OffsetFixtures.cs
deleted file mode 100644
index 6e33f8ced..000000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/OffsetFixtures.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using Apache.Iggy.Messages;
-using Apache.Iggy.Tests.Integrations.Helpers;
-using Apache.Iggy.Tests.Integrations.Models;
-using TUnit.Core.Interfaces;
-using Partitioning = Apache.Iggy.Kinds.Partitioning;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class OffsetFixtures : IAsyncInitializer
-{
-    internal readonly string StreamId = "OffsetStream";
-    internal readonly CreateTestTopic TopicRequest = TopicFactory.CreateTopic("Topic");
-
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-        foreach (KeyValuePair<Protocol, IIggyClient> client in Clients)
-        {
-            await client.Value.CreateStreamAsync(StreamId.GetWithProtocol(client.Key));
-            await client.Value.CreateTopicAsync(Identifier.String(StreamId.GetWithProtocol(client.Key)),
-                TopicRequest.Name, TopicRequest.PartitionsCount);
-
-            var messages = new Message[]
-            {
-                new(Guid.NewGuid(), "Test message 1"u8.ToArray()),
-                new(Guid.NewGuid(), "Test message 2"u8.ToArray()),
-                new(Guid.NewGuid(), "Test message 3"u8.ToArray()), new(Guid.NewGuid(), "Test message 4"u8.ToArray())
-            };
-            await client.Value.SendMessagesAsync(Identifier.String(StreamId.GetWithProtocol(client.Key)),
-                Identifier.String(TopicRequest.Name), Partitioning.None(), messages);
-        }
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/PartitionsFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/PartitionsFixture.cs
deleted file mode 100644
index cdd5fb9a8..000000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/PartitionsFixture.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using Apache.Iggy.Tests.Integrations.Helpers;
-using Apache.Iggy.Tests.Integrations.Models;
-using TUnit.Core.Interfaces;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class PartitionsFixture : IAsyncInitializer
-{
-    internal readonly string StreamId = "PartitionsStream";
-    internal readonly CreateTestTopic TopicRequest = TopicFactory.CreateTopic("Topic");
-
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-        foreach (KeyValuePair<Protocol, IIggyClient> client in Clients)
-        {
-            await client.Value.CreateStreamAsync(StreamId.GetWithProtocol(client.Key));
-            await client.Value.CreateTopicAsync(Identifier.String(StreamId.GetWithProtocol(client.Key)),
-                TopicRequest.Name, TopicRequest.PartitionsCount);
-        }
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/PersonalAccessTokenFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/PersonalAccessTokenFixture.cs
deleted file mode 100644
index b891a64c7..000000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/PersonalAccessTokenFixture.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using TUnit.Core.Interfaces;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class PersonalAccessTokenFixture : IAsyncInitializer
-{
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        var userTcp = "pat_user_tcp";
-        var userHttp = "pat_user_http";
-
-        Clients = await IggyServerFixture.CreateClients();
-
-        await Clients[Protocol.Tcp].CreateUser(userTcp, "iggy", UserStatus.Active);
-        await Clients[Protocol.Http].CreateUser(userHttp, "iggy", UserStatus.Active);
-
-        Clients[Protocol.Tcp] = await IggyServerFixture.CreateTcpClient(userTcp);
-        Clients[Protocol.Http] = await IggyServerFixture.CreateTcpClient(userHttp);
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/SegmentsFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/SegmentsFixture.cs
deleted file mode 100644
index e8baf729f..000000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/SegmentsFixture.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using Apache.Iggy.Tests.Integrations.Helpers;
-using Apache.Iggy.Tests.Integrations.Models;
-using TUnit.Core.Interfaces;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class SegmentsFixture : IAsyncInitializer
-{
-    internal readonly string StreamId = "SegmentsStream";
-    internal readonly CreateTestTopic TopicRequest = TopicFactory.CreateTopic("SegmentsTopic");
-
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-        foreach (KeyValuePair<Protocol, IIggyClient> client in Clients)
-        {
-            await client.Value.CreateStreamAsync(StreamId.GetWithProtocol(client.Key));
-            await client.Value.CreateTopicAsync(Identifier.String(StreamId.GetWithProtocol(client.Key)),
-                TopicRequest.Name, TopicRequest.PartitionsCount);
-        }
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/SendMessageFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/SendMessageFixture.cs
deleted file mode 100644
index ec7b98499..000000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/SendMessageFixture.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using Apache.Iggy.Tests.Integrations.Helpers;
-using Apache.Iggy.Tests.Integrations.Models;
-using TUnit.Core.Interfaces;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class SendMessageFixture : IAsyncInitializer
-{
-    internal readonly string StreamId = "SendMessageStream";
-    internal readonly CreateTestTopic TopicRequest = TopicFactory.CreateTopic("Topic");
-
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-        foreach (KeyValuePair<Protocol, IIggyClient> client in Clients)
-        {
-            await client.Value.CreateStreamAsync(StreamId.GetWithProtocol(client.Key));
-            await client.Value.CreateTopicAsync(Identifier.String(StreamId.GetWithProtocol(client.Key)),
-                TopicRequest.Name, TopicRequest.PartitionsCount);
-        }
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/StreamsFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/StreamsFixture.cs
deleted file mode 100644
index 74a436d66..000000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/StreamsFixture.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using TUnit.Core.Interfaces;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class StreamsFixture : IAsyncInitializer
-{
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/SystemFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/SystemFixture.cs
deleted file mode 100644
index 2dcd09ec1..000000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/SystemFixture.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using TUnit.Core.Interfaces;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class SystemFixture : IAsyncInitializer
-{
-    internal readonly string StreamId = "SystemStream";
-    internal readonly int TotalClientsCount = 10;
-
-    private List<IIggyClient> AdditionalClients { get; } = new();
-
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        await CreateClientsAsync();
-    }
-
-    private async Task CreateClientsAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-        for (var i = 0; i < TotalClientsCount; i++)
-        {
-            var userName = $"iggy_{Protocol.Http}_{i}";
-            await Clients[Protocol.Http].CreateUser(userName, "iggy", UserStatus.Active);
-
-            var client = await IggyServerFixture.CreateClient(Protocol.Tcp, Protocol.Http);
-            AdditionalClients.Add(client);
-            var login = await client.LoginUser(userName, "iggy");
-
-            if (login!.UserId == 0)
-            {
-                throw new Exception("Failed to login user 'iggy'.");
-            }
-
-            await client.PingAsync();
-        }
-
-        // One client less for tcp due to a default client
-        for (var i = 0; i < TotalClientsCount - 1; i++)
-        {
-            var userName = $"iggy_{Protocol.Tcp}_{i}";
-            await Clients[Protocol.Tcp].CreateUser(userName, "iggy", UserStatus.Active);
-
-            var client = await IggyServerFixture.CreateClient(Protocol.Tcp, Protocol.Tcp);
-            AdditionalClients.Add(client);
-            var login = await client.LoginUser(userName, "iggy");
-            if (login!.UserId == 0)
-            {
-                throw new Exception("Failed to login user 'iggy'.");
-            }
-
-            await client.PingAsync();
-        }
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/TopicsFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/TopicsFixture.cs
deleted file mode 100644
index b4cbca0c2..000000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/TopicsFixture.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using Apache.Iggy.Tests.Integrations.Helpers;
-using TUnit.Core.Interfaces;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class TopicsFixture : IAsyncInitializer
-{
-    internal readonly string StreamId = "TestStream";
-
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-
-        foreach (KeyValuePair<Protocol, IIggyClient> client in Clients)
-        {
-            await client.Value.CreateStreamAsync(StreamId.GetWithProtocol(client.Key));
-        }
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/UsersFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/UsersFixture.cs
deleted file mode 100644
index 1f8ed7dcd..000000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/UsersFixture.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using TUnit.Core.Interfaces;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class UsersFixture : IAsyncInitializer
-{
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/FlushMessagesTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/FlushMessagesTests.cs
index 284878afc..07ad3e5d9 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/FlushMessagesTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/FlushMessagesTests.cs
@@ -17,47 +17,75 @@
 
 using Apache.Iggy.Enums;
 using Apache.Iggy.Exceptions;
-using Apache.Iggy.Tests.Integrations.Attributes;
+using Apache.Iggy.IggyClient;
+using Apache.Iggy.Messages;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
 using Shouldly;
+using Partitioning = Apache.Iggy.Kinds.Partitioning;
 
 namespace Apache.Iggy.Tests.Integrations;
 
 public class FlushMessagesTests
 {
-    [ClassDataSource<FlushMessageFixture>(Shared = SharedType.PerClass)]
-    public required FlushMessageFixture Fixture { get; init; }
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
+
+    private async Task<(IIggyClient client, string streamName, string topicName)> CreateStreamWithMessages(
+        Protocol protocol)
+    {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"flush-{Guid.NewGuid():N}";
+        var topicName = "test-topic";
+
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), topicName, 1);
+
+        await client.SendMessagesAsync(Identifier.String(streamName),
+            Identifier.String(topicName), Partitioning.None(),
+            [
+                new Message(Guid.NewGuid(), "Test message 1"u8.ToArray()),
+                new Message(Guid.NewGuid(), "Test message 2"u8.ToArray()),
+                new Message(Guid.NewGuid(), "Test message 3"u8.ToArray()),
+                new Message(Guid.NewGuid(), "Test message 4"u8.ToArray())
+            ]);
+
+        return (client, streamName, topicName);
+    }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task FlushUnsavedBuffer_WithFsync_Should_Flush_Successfully(Protocol protocol)
     {
+        var (client, streamName, topicName) = await CreateStreamWithMessages(protocol);
+
         await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol].FlushUnsavedBufferAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), 0, true));
+            client.FlushUnsavedBufferAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName), 0, true));
     }
 
     [Test]
-    [DependsOn(nameof(FlushUnsavedBuffer_WithFsync_Should_Flush_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task FlushUnsavedBuffer_WithOutFsync_Should_Flush_Successfully(Protocol protocol)
     {
+        var (client, streamName, topicName) = await CreateStreamWithMessages(protocol);
+
         await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol].FlushUnsavedBufferAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), 0, false));
+            client.FlushUnsavedBufferAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName), 0, false));
     }
 
     [Test]
-    [DependsOn(nameof(FlushUnsavedBuffer_WithOutFsync_Should_Flush_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
-    public async Task FlushUnsavedBuffer_Should_Throw_WhenStream_DoesNotExist(Protocol protocol)
+    public async Task FlushUnsavedBuffer_Should_Throw_WhenPartition_DoesNotExist(Protocol protocol)
     {
+        var (client, streamName, topicName) = await CreateStreamWithMessages(protocol);
+
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol].FlushUnsavedBufferAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), 55, false));
+            client.FlushUnsavedBufferAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName), 55, false));
     }
 }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Helpers/NameIdHelpers.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Helpers/NameIdHelpers.cs
deleted file mode 100644
index 012ef9f32..000000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Helpers/NameIdHelpers.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-
-namespace Apache.Iggy.Tests.Integrations.Helpers;
-
-public static class ProtocolHelpers
-{
-    public static string GetWithProtocol(this string name, Protocol protocol)
-    {
-        return $"{name}_{protocol.ToString().ToLowerInvariant()}";
-    }
-
-    public static uint GetWithProtocol(this uint id, Protocol protocol)
-    {
-        return id + (uint)protocol * 10;
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Helpers/TopicFactory.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Helpers/TopicFactory.cs
deleted file mode 100644
index 52576c80b..000000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Helpers/TopicFactory.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Tests.Integrations.Models;
-
-namespace Apache.Iggy.Tests.Integrations.Helpers;
-
-public static class TopicFactory
-{
-    internal static CreateTestTopic CreateTopic(string topicId, uint partitionsCount = 1,
-        TimeSpan messageExpiry = default)
-    {
-        return new CreateTestTopic
-        {
-            Name = topicId,
-            PartitionsCount = partitionsCount,
-            MessageExpiry = messageExpiry
-        };
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Models/CreateTestTopic.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Models/CreateTestTopic.cs
deleted file mode 100644
index d58f123e7..000000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Models/CreateTestTopic.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-using System.Diagnostics.CodeAnalysis;
-using Apache.Iggy.Enums;
-
-namespace Apache.Iggy.Tests.Integrations.Models;
-
-internal class CreateTestTopic
-{
-    public required string Name { get; set; }
-    public CompressionAlgorithm CompressionAlgorithm { get; set; } = CompressionAlgorithm.None;
-    public TimeSpan MessageExpiry { get; set; } = TimeSpan.Zero;
-    public uint PartitionsCount { get; set; } = 1;
-    public byte? ReplicationFactor { get; set; } = 1;
-    public ulong MaxTopicSize { get; set; }
-
-    public CreateTestTopic()
-    {
-    }
-
-    [SetsRequiredMembers]
-    public CreateTestTopic(string name,
-        CompressionAlgorithm compressionAlgorithm,
-        TimeSpan messageExpiry,
-        uint partitionsCount,
-        byte? replicationFactor,
-        ulong maxTopicSize)
-    {
-        Name = name;
-        CompressionAlgorithm = compressionAlgorithm;
-        MessageExpiry = messageExpiry;
-        PartitionsCount = partitionsCount;
-        ReplicationFactor = replicationFactor;
-        MaxTopicSize = maxTopicSize;
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Models/DummyMessage.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Models/DummyMessage.cs
deleted file mode 100644
index bc149fd07..000000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Models/DummyMessage.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using System.Buffers.Binary;
-using System.Text;
-
-namespace Apache.Iggy.Tests.Integrations.Models;
-
-public sealed class DummyMessage
-{
-    public int Id { get; set; }
-    public required string Text { get; set; }
-
-    internal static Func<byte[], DummyMessage> DeserializeDummyMessage
-        => bytes =>
-        {
-            var id = BinaryPrimitives.ReadInt32LittleEndian(bytes.AsSpan()[..4]);
-            var textLength = BinaryPrimitives.ReadInt32LittleEndian(bytes.AsSpan()[4..8]);
-            var text = Encoding.UTF8.GetString(bytes.AsSpan()[8..(8 + textLength)]);
-            return new DummyMessage
-            {
-                Id = id,
-                Text = text
-            };
-        };
-
-    internal byte[] SerializeDummyMessage()
-    {
-        var bytes = new byte[4 + 4 + Text.Length];
-        BinaryPrimitives.WriteInt32LittleEndian(bytes.AsSpan()[..4], Id);
-        BinaryPrimitives.WriteInt32LittleEndian(bytes.AsSpan()[4..8], Text.Length);
-        Encoding.UTF8.GetBytes(Text).CopyTo(bytes.AsSpan()[8..]);
-        return bytes;
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Models/UpdateTestTopic.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Models/UpdateTestTopic.cs
deleted file mode 100644
index fbdcb5bb8..000000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Models/UpdateTestTopic.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-using Apache.Iggy.Enums;
-
-namespace Apache.Iggy.Tests.Integrations.Models;
-
-internal record UpdateTestTopic(
-    string Name,
-    CompressionAlgorithm CompressionAlgorithm,
-    ulong MaxTopicSize,
-    TimeSpan MessageExpiry,
-    byte? ReplicationFactor);
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/OffsetTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/OffsetTests.cs
index 312c11aae..d2a46d586 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/OffsetTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/OffsetTests.cs
@@ -16,11 +16,13 @@
 // // under the License.
 
 using Apache.Iggy.Enums;
+using Apache.Iggy.IggyClient;
 using Apache.Iggy.Kinds;
+using Apache.Iggy.Messages;
 using Apache.Iggy.Tests.Integrations.Attributes;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
 using Shouldly;
+using Partitioning = Apache.Iggy.Kinds.Partitioning;
 
 namespace Apache.Iggy.Tests.Integrations;
 
@@ -28,26 +30,54 @@ public class OffsetTests
 {
     private const ulong SetOffset = 2;
 
-    [ClassDataSource<OffsetFixtures>(Shared = SharedType.PerClass)]
-    public required OffsetFixtures Fixture { get; init; }
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
+
+    private async Task<(IIggyClient client, string streamName, string topicName)> CreateStreamWithMessages(
+        Protocol protocol)
+    {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"offset-{Guid.NewGuid():N}";
+        var topicName = "test-topic";
+
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), topicName, 1);
+
+        await client.SendMessagesAsync(Identifier.String(streamName),
+            Identifier.String(topicName), Partitioning.None(),
+            [
+                new Message(Guid.NewGuid(), "Test message 1"u8.ToArray()),
+                new Message(Guid.NewGuid(), "Test message 2"u8.ToArray()),
+                new Message(Guid.NewGuid(), "Test message 3"u8.ToArray()),
+                new Message(Guid.NewGuid(), "Test message 4"u8.ToArray())
+            ]);
+
+        return (client, streamName, topicName);
+    }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task StoreOffset_IndividualConsumer_Should_StoreOffset_Successfully(Protocol protocol)
     {
-        await Should.NotThrowAsync(() => Fixture.Clients[protocol]
-            .StoreOffsetAsync(Consumer.New("test-consumer"), Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), SetOffset, 0));
+        var (client, streamName, topicName) = await CreateStreamWithMessages(protocol);
+
+        await Should.NotThrowAsync(() => client
+            .StoreOffsetAsync(Consumer.New("test-consumer"), Identifier.String(streamName),
+                Identifier.String(topicName), SetOffset, 0));
     }
 
     [Test]
-    [DependsOn(nameof(StoreOffset_IndividualConsumer_Should_StoreOffset_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetOffset_IndividualConsumer_Should_GetOffset_Successfully(Protocol protocol)
     {
-        var offset = await Fixture.Clients[protocol]
-            .GetOffsetAsync(Consumer.New("test-consumer"), Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), 0);
+        var (client, streamName, topicName) = await CreateStreamWithMessages(protocol);
+
+        await client.StoreOffsetAsync(Consumer.New("test-consumer"), Identifier.String(streamName),
+            Identifier.String(topicName), SetOffset, 0);
+
+        var offset = await client.GetOffsetAsync(Consumer.New("test-consumer"), Identifier.String(streamName),
+            Identifier.String(topicName), 0);
 
         offset.ShouldNotBeNull();
         offset.StoredOffset.ShouldBe(SetOffset);
@@ -56,31 +86,63 @@ public class OffsetTests
     }
 
     [Test]
-    [DependsOn(nameof(GetOffset_IndividualConsumer_Should_GetOffset_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task StoreOffset_ConsumerGroup_Should_StoreOffset_Successfully(Protocol protocol)
     {
-        await Fixture.Clients[protocol]
-            .CreateConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), "test_consumer_group");
-
-        await Fixture.Clients[Protocol.Tcp].JoinConsumerGroupAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.String(Fixture.TopicRequest.Name), Identifier.String("test_consumer_group"));
-
-        await Should.NotThrowAsync(() => Fixture.Clients[protocol]
-            .StoreOffsetAsync(Consumer.Group("test_consumer_group"), Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), SetOffset, 0));
+        var (client, streamName, topicName) = await CreateStreamWithMessages(protocol);
+
+        await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(topicName), "test_consumer_group");
+
+        // Consumer group membership is per-connection. For TCP the same client must join.
+        // For HTTP, a separate TCP client joins (HTTP is stateless and doesn't track membership).
+        if (protocol == Protocol.Tcp)
+        {
+            await client.JoinConsumerGroupAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName), Identifier.String("test_consumer_group"));
+        }
+        else
+        {
+            var tcpClient = await Fixture.CreateTcpClient();
+            await tcpClient.JoinConsumerGroupAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName), Identifier.String("test_consumer_group"));
+        }
+
+        await Should.NotThrowAsync(() => client
+            .StoreOffsetAsync(Consumer.Group("test_consumer_group"), Identifier.String(streamName),
+                Identifier.String(topicName), SetOffset, 0));
     }
 
     [Test]
-    [DependsOn(nameof(StoreOffset_ConsumerGroup_Should_StoreOffset_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetOffset_ConsumerGroup_Should_GetOffset_Successfully(Protocol protocol)
     {
-        var offset = await Fixture.Clients[protocol]
-            .GetOffsetAsync(Consumer.Group("test_consumer_group"), Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), 0);
+        var (client, streamName, topicName) = await CreateStreamWithMessages(protocol);
+
+        await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(topicName), "test_consumer_group");
+
+        if (protocol == Protocol.Tcp)
+        {
+            await client.JoinConsumerGroupAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName), Identifier.String("test_consumer_group"));
+        }
+        else
+        {
+            var tcpClient = await Fixture.CreateTcpClient();
+            await tcpClient.JoinConsumerGroupAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName), Identifier.String("test_consumer_group"));
+        }
+
+        await client.StoreOffsetAsync(Consumer.Group("test_consumer_group"), Identifier.String(streamName),
+            Identifier.String(topicName), SetOffset, 0);
+
+        var offset = await client.GetOffsetAsync(Consumer.Group("test_consumer_group"),
+            Identifier.String(streamName), Identifier.String(topicName), 0);
 
         offset.ShouldNotBeNull();
         offset.StoredOffset.ShouldBe(SetOffset);
@@ -89,13 +151,33 @@ public class OffsetTests
     }
 
     [Test]
-    [DependsOn(nameof(GetOffset_ConsumerGroup_Should_GetOffset_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetOffset_ConsumerGroup_ByName_Should_GetOffset_Successfully(Protocol protocol)
     {
-        var offset = await Fixture.Clients[protocol].GetOffsetAsync(Consumer.Group("test_consumer_group"),
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), Identifier.String(Fixture.TopicRequest.Name),
-            0);
+        var (client, streamName, topicName) = await CreateStreamWithMessages(protocol);
+
+        await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(topicName), "test_consumer_group");
+
+        if (protocol == Protocol.Tcp)
+        {
+            await client.JoinConsumerGroupAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName), Identifier.String("test_consumer_group"));
+        }
+        else
+        {
+            var tcpClient = await Fixture.CreateTcpClient();
+            await tcpClient.JoinConsumerGroupAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName), Identifier.String("test_consumer_group"));
+        }
+
+        await client.StoreOffsetAsync(Consumer.Group("test_consumer_group"), Identifier.String(streamName),
+            Identifier.String(topicName), SetOffset, 0);
+
+        var offset = await client.GetOffsetAsync(Consumer.Group("test_consumer_group"),
+            Identifier.String(streamName), Identifier.String(topicName), 0);
 
         offset.ShouldNotBeNull();
         offset.StoredOffset.ShouldBe(SetOffset);
@@ -105,17 +187,26 @@ public class OffsetTests
 
     [Test]
     [SkipHttp]
-    [DependsOn(nameof(GetOffset_ConsumerGroup_ByName_Should_GetOffset_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeleteOffset_ConsumerGroup_Should_DeleteOffset_Successfully(Protocol protocol)
     {
-        await Fixture.Clients[protocol].DeleteOffsetAsync(Consumer.Group("test_consumer_group"),
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), Identifier.String(Fixture.TopicRequest.Name),
-            0);
+        var (client, streamName, topicName) = await CreateStreamWithMessages(protocol);
+
+        await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(topicName), "test_consumer_group");
+
+        await client.JoinConsumerGroupAsync(
+            Identifier.String(streamName),
+            Identifier.String(topicName), Identifier.String("test_consumer_group"));
+
+        await client.StoreOffsetAsync(Consumer.Group("test_consumer_group"), Identifier.String(streamName),
+            Identifier.String(topicName), SetOffset, 0);
+
+        await client.DeleteOffsetAsync(Consumer.Group("test_consumer_group"),
+            Identifier.String(streamName), Identifier.String(topicName), 0);
 
-        var offset = await Fixture.Clients[protocol].GetOffsetAsync(Consumer.Group("test_consumer_group"),
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), Identifier.String(Fixture.TopicRequest.Name),
-            0);
+        var offset = await client.GetOffsetAsync(Consumer.Group("test_consumer_group"),
+            Identifier.String(streamName), Identifier.String(topicName), 0);
 
         offset.ShouldBeNull();
     }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/PartitionsTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/PartitionsTests.cs
index f2da7031e..aa2d7c5bc 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/PartitionsTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/PartitionsTests.cs
@@ -17,74 +17,83 @@
 
 using Apache.Iggy.Enums;
 using Apache.Iggy.Exceptions;
-using Apache.Iggy.Tests.Integrations.Attributes;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
 using Shouldly;
 
 namespace Apache.Iggy.Tests.Integrations;
 
 public class PartitionsTests
 {
-    [ClassDataSource<PartitionsFixture>(Shared = SharedType.PerClass)]
-    public required PartitionsFixture Fixture { get; init; }
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task CreatePartition_HappyPath_Should_CreatePartition_Successfully(Protocol protocol)
     {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"part-create-{Guid.NewGuid():N}";
+        var topicName = "test-topic";
+
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), topicName, 1);
+
         await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol]
-                .CreatePartitionsAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                    Identifier.String(Fixture.TopicRequest.Name), 3));
+            client.CreatePartitionsAsync(Identifier.String(streamName),
+                Identifier.String(topicName), 3));
 
-        var response = await Fixture.Clients[protocol].GetTopicByIdAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.String(Fixture.TopicRequest.Name));
+        var response = await client.GetTopicByIdAsync(
+            Identifier.String(streamName), Identifier.String(topicName));
         response.ShouldNotBeNull();
         response.PartitionsCount.ShouldBe(4u);
     }
 
     [Test]
-    [DependsOn(nameof(CreatePartition_HappyPath_Should_CreatePartition_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeletePartition_Should_DeletePartition_Successfully(Protocol protocol)
     {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"part-delete-{Guid.NewGuid():N}";
+        var topicName = "test-topic";
+
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), topicName, 4);
+
         await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol].DeletePartitionsAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), 1));
+            client.DeletePartitionsAsync(Identifier.String(streamName),
+                Identifier.String(topicName), 1));
 
-        var response = await Fixture.Clients[protocol].GetTopicByIdAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.String(Fixture.TopicRequest.Name));
+        var response = await client.GetTopicByIdAsync(
+            Identifier.String(streamName), Identifier.String(topicName));
         response.ShouldNotBeNull();
         response.PartitionsCount.ShouldBe(3u);
     }
 
     [Test]
-    [DependsOn(nameof(DeletePartition_Should_DeletePartition_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeletePartition_Should_Throw_WhenTopic_DoesNotExist(Protocol protocol)
     {
-        await Fixture.Clients[protocol].DeleteTopicAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.String(Fixture.TopicRequest.Name));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"part-notopic-{Guid.NewGuid():N}";
+
+        await client.CreateStreamAsync(streamName);
+
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol].DeletePartitionsAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), 1));
+            client.DeletePartitionsAsync(Identifier.String(streamName),
+                Identifier.String("nonexistent-topic"), 1));
     }
 
     [Test]
-    [DependsOn(nameof(DeletePartition_Should_Throw_WhenTopic_DoesNotExist))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeletePartition_Should_Throw_WhenStream_DoesNotExist(Protocol protocol)
     {
-        await Fixture.Clients[protocol]
-            .DeleteStreamAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol].DeletePartitionsAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), 1));
+            client.DeletePartitionsAsync(Identifier.String($"nonexistent-{Guid.NewGuid():N}"),
+                Identifier.String("nonexistent-topic"), 1));
     }
 }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/PersonalAccessTokenTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/PersonalAccessTokenTests.cs
index b2a284c71..1029841f1 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/PersonalAccessTokenTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/PersonalAccessTokenTests.cs
@@ -25,68 +25,84 @@ namespace Apache.Iggy.Tests.Integrations;
 
 public class PersonalAccessTokenTests
 {
-    private const string Name = "test-pat";
     private static readonly TimeSpan Expiry = TimeSpan.FromHours(1);
 
-    [ClassDataSource<PersonalAccessTokenFixture>(Shared = SharedType.PerClass)]
-    public required PersonalAccessTokenFixture Fixture { get; init; }
-
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task CreatePersonalAccessToken_HappyPath_Should_CreatePersonalAccessToken_Successfully(
         Protocol protocol)
     {
-        var result = await Fixture.Clients[protocol].CreatePersonalAccessTokenAsync(Name, Expiry);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name = $"pat-{Guid.NewGuid():N}"[..20];
+        var result = await client.CreatePersonalAccessTokenAsync(name, Expiry);
 
         result.ShouldNotBeNull();
         result.Token.ShouldNotBeNullOrEmpty();
     }
 
     [Test]
-    [DependsOn(nameof(CreatePersonalAccessToken_HappyPath_Should_CreatePersonalAccessToken_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task CreatePersonalAccessToken_Duplicate_Should_Throw_InvalidResponse(Protocol protocol)
     {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name = $"dup-{Guid.NewGuid():N}"[..20];
+        await client.CreatePersonalAccessTokenAsync(name, Expiry);
+
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol].CreatePersonalAccessTokenAsync(Name, Expiry));
+            client.CreatePersonalAccessTokenAsync(name, Expiry));
     }
 
     [Test]
-    [DependsOn(nameof(CreatePersonalAccessToken_Duplicate_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetPersonalAccessTokens_Should_ReturnValidResponse(Protocol protocol)
     {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name = $"get-{Guid.NewGuid():N}"[..20];
+        await client.CreatePersonalAccessTokenAsync(name, Expiry);
+
         IReadOnlyList<PersonalAccessTokenResponse> response
-            = await Fixture.Clients[protocol].GetPersonalAccessTokensAsync();
+            = await client.GetPersonalAccessTokensAsync();
 
         response.ShouldNotBeNull();
-        response.Count.ShouldBe(1);
-        response[0].Name.ShouldBe(Name);
+        response.Count.ShouldBeGreaterThanOrEqualTo(1);
+        response.ShouldContain(x => x.Name == name);
+
+        var token = response.First(x => x.Name == name);
         var tokenExpiryDateTimeOffset = DateTimeOffset.UtcNow.Add(Expiry);
-        response[0].ExpiryAt!.Value.ToUniversalTime().ShouldBe(tokenExpiryDateTimeOffset, TimeSpan.FromMinutes(1));
+        token.ExpiryAt!.Value.ToUniversalTime().ShouldBe(tokenExpiryDateTimeOffset, TimeSpan.FromMinutes(1));
     }
 
     [Test]
-    [DependsOn(nameof(GetPersonalAccessTokens_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task LoginWithPersonalAccessToken_Should_Be_Successfully(Protocol protocol)
     {
-        var response = await Fixture.Clients[protocol].CreatePersonalAccessTokenAsync("test-pat-login", Expiry);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        var client = await Fixture.IggyServerFixture.CreateClient(protocol);
+        var name = $"lgn-{Guid.NewGuid():N}"[..20];
+        var response = await client.CreatePersonalAccessTokenAsync(name, Expiry);
 
-        var authResponse = await client.LoginWithPersonalAccessToken(response!.Token);
+        var loginClient = await Fixture.CreateClient(protocol);
+        var authResponse = await loginClient.LoginWithPersonalAccessToken(response!.Token);
 
         authResponse.ShouldNotBeNull();
-        authResponse.UserId.ShouldBeGreaterThan(0);
+        authResponse.UserId.ShouldBeGreaterThanOrEqualTo(0);
     }
 
     [Test]
-    [DependsOn(nameof(LoginWithPersonalAccessToken_Should_Be_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeletePersonalAccessToken_Should_DeletePersonalAccessToken_Successfully(Protocol protocol)
     {
-        await Should.NotThrowAsync(() => Fixture.Clients[protocol].DeletePersonalAccessTokenAsync(Name));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name = $"del-{Guid.NewGuid():N}"[..20];
+        await client.CreatePersonalAccessTokenAsync(name, Expiry);
+
+        await Should.NotThrowAsync(() => client.DeletePersonalAccessTokenAsync(name));
     }
 }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/SegmentsTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/SegmentsTests.cs
index b70381397..eed1d01b0 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/SegmentsTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/SegmentsTests.cs
@@ -19,26 +19,32 @@ using Apache.Iggy.Enums;
 using Apache.Iggy.Exceptions;
 using Apache.Iggy.Tests.Integrations.Attributes;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
 using Shouldly;
 
 namespace Apache.Iggy.Tests.Integrations;
 
 public class SegmentsTests
 {
-    [ClassDataSource<SegmentsFixture>(Shared = SharedType.PerClass)]
-    public required SegmentsFixture Fixture { get; init; }
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
 
     [Test]
     [SkipHttp]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeleteSegments_WithZeroCount_Should_Succeed(Protocol protocol)
     {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"seg-zero-{Guid.NewGuid():N}";
+        var topicName = $"seg-zero-topic-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), topicName, 1);
+
         // Deleting 0 segments should succeed without error (no-op)
         await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol].DeleteSegmentsAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name),
+            client.DeleteSegmentsAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName),
                 0, // partition_id (0-indexed)
                 0)); // segments_count = 0
     }
@@ -48,23 +54,34 @@ public class SegmentsTests
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeleteSegments_Http_Should_Throw_FeatureUnavailable(Protocol protocol)
     {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"seg-http-{Guid.NewGuid():N}";
+        var topicName = $"seg-http-topic-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), topicName, 1);
+
         await Should.ThrowAsync<FeatureUnavailableException>(() =>
-            Fixture.Clients[protocol].DeleteSegmentsAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name),
+            client.DeleteSegmentsAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName),
                 0,
                 0));
     }
 
     [Test]
     [SkipHttp]
-    [DependsOn(nameof(DeleteSegments_WithZeroCount_Should_Succeed))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeleteSegments_Should_Throw_WhenTopic_DoesNotExist(Protocol protocol)
     {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"seg-notopic-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol].DeleteSegmentsAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
+            client.DeleteSegmentsAsync(
+                Identifier.String(streamName),
                 Identifier.String("non-existent-topic"),
                 0, // partition_id (0-indexed)
                 1)); // segments_count
@@ -72,20 +89,15 @@ public class SegmentsTests
 
     [Test]
     [SkipHttp]
-    [DependsOn(nameof(DeleteSegments_Should_Throw_WhenTopic_DoesNotExist))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeleteSegments_Should_Throw_WhenStream_DoesNotExist(Protocol protocol)
     {
-        await Fixture.Clients[protocol].DeleteTopicAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.String(Fixture.TopicRequest.Name));
-        await Fixture.Clients[protocol]
-            .DeleteStreamAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol].DeleteSegmentsAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name),
+            client.DeleteSegmentsAsync(
+                Identifier.String($"nonexistent-stream-{Guid.NewGuid():N}"),
+                Identifier.String("any-topic"),
                 0, // partition_id (0-indexed)
                 1)); // segments_count
     }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/SendMessagesTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/SendMessagesTests.cs
index 3973415d0..5b84781b1 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/SendMessagesTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/SendMessagesTests.cs
@@ -16,15 +16,12 @@
 // // under the License.
 
 using System.Text;
-using Apache.Iggy.Contracts;
 using Apache.Iggy.Enums;
 using Apache.Iggy.Exceptions;
 using Apache.Iggy.Headers;
-using Apache.Iggy.Kinds;
+using Apache.Iggy.IggyClient;
 using Apache.Iggy.Messages;
-using Apache.Iggy.Tests.Integrations.Attributes;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
 using Shouldly;
 using Partitioning = Apache.Iggy.Kinds.Partitioning;
 
@@ -32,83 +29,117 @@ namespace Apache.Iggy.Tests.Integrations;
 
 public class SendMessagesTests
 {
-    private static Message[] _messagesWithoutHeaders = [];
-    private static Message[] _messagesWithHeaders = [];
+    private static readonly string DummyJson = """
+                                               {
+                                                 "userId": 1,
+                                                 "id": 1,
+                                                 "title": "delete",
+                                                 "completed": false
+                                               }
+                                               """;
 
-    [ClassDataSource<SendMessageFixture>(Shared = SharedType.PerClass)]
-    public required SendMessageFixture Fixture { get; set; }
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
 
-    [Before(Class)]
-    public static Task Before()
+    private async Task<(IIggyClient client, string streamName, string topicName)> CreateStreamAndTopic(
+        Protocol protocol)
     {
-        var dummyJson = """
-                        {
-                          "userId": 1,
-                          "id": 1,
-                          "title": "delete",
-                          "completed": false
-                        }
-                        """;
-        _messagesWithoutHeaders =
-        [
-            new Message(Guid.NewGuid(), Encoding.UTF8.GetBytes(dummyJson)),
-            new Message(Guid.NewGuid(), Encoding.UTF8.GetBytes(dummyJson))
-        ];
-        _messagesWithHeaders =
-        [
-            new Message(Guid.NewGuid(), Encoding.UTF8.GetBytes(dummyJson),
-                new Dictionary<HeaderKey, HeaderValue>
-                {
-                    { HeaderKey.FromString("header1"), HeaderValue.FromString("value1") },
-                    { HeaderKey.FromString("header2"), HeaderValue.FromInt32(444) }
-                }),
-            new Message(Guid.NewGuid(), Encoding.UTF8.GetBytes(dummyJson),
-                new Dictionary<HeaderKey, HeaderValue>
-                {
-                    { HeaderKey.FromString("header1"), HeaderValue.FromString("value1") },
-                    { HeaderKey.FromString("header2"), HeaderValue.FromInt32(444) }
-                })
-        ];
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        return Task.CompletedTask;
+        var streamName = $"send-msg-{Guid.NewGuid():N}";
+        var topicName = "test-topic";
+
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), topicName, 1);
+
+        return (client, streamName, topicName);
     }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task SendMessages_NoHeaders_Should_SendMessages_Successfully(Protocol protocol)
     {
+        var (client, streamName, topicName) = await CreateStreamAndTopic(protocol);
+
+        var messages = new Message[]
+        {
+            new(Guid.NewGuid(), Encoding.UTF8.GetBytes(DummyJson)),
+            new(Guid.NewGuid(), Encoding.UTF8.GetBytes(DummyJson))
+        };
+
         await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol].SendMessagesAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), Partitioning.None(), _messagesWithoutHeaders));
+            client.SendMessagesAsync(Identifier.String(streamName),
+                Identifier.String(topicName), Partitioning.None(), messages));
     }
 
     [Test]
-    [DependsOn(nameof(SendMessages_NoHeaders_Should_SendMessages_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task SendMessages_NoHeaders_Should_Throw_InvalidResponse(Protocol protocol)
     {
+        var (client, streamName, _) = await CreateStreamAndTopic(protocol);
+
+        var messages = new Message[]
+        {
+            new(Guid.NewGuid(), Encoding.UTF8.GetBytes(DummyJson)),
+            new(Guid.NewGuid(), Encoding.UTF8.GetBytes(DummyJson))
+        };
+
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol].SendMessagesAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.Numeric(69), Partitioning.None(), _messagesWithoutHeaders));
+            client.SendMessagesAsync(Identifier.String(streamName),
+                Identifier.Numeric(69), Partitioning.None(), messages));
     }
 
     [Test]
-    [DependsOn(nameof(SendMessages_NoHeaders_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task SendMessages_WithHeaders_Should_SendMessages_Successfully(Protocol protocol)
     {
+        var (client, streamName, topicName) = await CreateStreamAndTopic(protocol);
+
+        var messages = new Message[]
+        {
+            new(Guid.NewGuid(), Encoding.UTF8.GetBytes(DummyJson),
+                new Dictionary<HeaderKey, HeaderValue>
+                {
+                    { HeaderKey.FromString("header1"), HeaderValue.FromString("value1") },
+                    { HeaderKey.FromString("header2"), HeaderValue.FromInt32(444) }
+                }),
+            new(Guid.NewGuid(), Encoding.UTF8.GetBytes(DummyJson),
+                new Dictionary<HeaderKey, HeaderValue>
+                {
+                    { HeaderKey.FromString("header1"), HeaderValue.FromString("value1") },
+                    { HeaderKey.FromString("header2"), HeaderValue.FromInt32(444) }
+                })
+        };
+
         await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol].SendMessagesAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), Partitioning.None(), _messagesWithHeaders));
+            client.SendMessagesAsync(Identifier.String(streamName),
+                Identifier.String(topicName), Partitioning.None(), messages));
     }
 
     [Test]
-    [DependsOn(nameof(SendMessages_WithHeaders_Should_SendMessages_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task SendMessages_WithHeaders_Should_Throw_InvalidResponse(Protocol protocol)
     {
+        var (client, streamName, _) = await CreateStreamAndTopic(protocol);
+
+        var messages = new Message[]
+        {
+            new(Guid.NewGuid(), Encoding.UTF8.GetBytes(DummyJson),
+                new Dictionary<HeaderKey, HeaderValue>
+                {
+                    { HeaderKey.FromString("header1"), HeaderValue.FromString("value1") },
+                    { HeaderKey.FromString("header2"), HeaderValue.FromInt32(444) }
+                }),
+            new(Guid.NewGuid(), Encoding.UTF8.GetBytes(DummyJson),
+                new Dictionary<HeaderKey, HeaderValue>
+                {
+                    { HeaderKey.FromString("header1"), HeaderValue.FromString("value1") },
+                    { HeaderKey.FromString("header2"), HeaderValue.FromInt32(444) }
+                })
+        };
+
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol].SendMessagesAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.Numeric(69), Partitioning.None(), _messagesWithHeaders));
+            client.SendMessagesAsync(Identifier.String(streamName),
+                Identifier.Numeric(69), Partitioning.None(), messages));
     }
 }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/StreamsTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/StreamsTests.cs
index 6caa0b530..3b1603f04 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/StreamsTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/StreamsTests.cs
@@ -20,7 +20,6 @@ using Apache.Iggy.Enums;
 using Apache.Iggy.Exceptions;
 using Apache.Iggy.Messages;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
 using Shouldly;
 using Partitioning = Apache.Iggy.Kinds.Partitioning;
 
@@ -28,22 +27,21 @@ namespace Apache.Iggy.Tests.Integrations;
 
 public class StreamsTests
 {
-    private const string Name = "StreamTests";
-
-    [ClassDataSource<StreamsFixture>(Shared = SharedType.PerClass)]
-    public required StreamsFixture Fixture { get; init; }
-
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task CreateStream_HappyPath_Should_CreateStream_Successfully(Protocol protocol)
     {
-        var response = await Fixture.Clients[protocol]
-            .CreateStreamAsync(Name.GetWithProtocol(protocol));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name = $"create-stream-{Guid.NewGuid():N}";
+        var response = await client.CreateStreamAsync(name);
 
         response.ShouldNotBeNull();
         response.Id.ShouldBeGreaterThanOrEqualTo(0u);
-        response.Name.ShouldBe(Name.GetWithProtocol(protocol));
+        response.Name.ShouldBe(name);
         response.Size.ShouldBe(0u);
         response.CreatedAt.UtcDateTime.ShouldBe(DateTimeOffset.UtcNow.UtcDateTime, TimeSpan.FromMinutes(1));
         response.MessagesCount.ShouldBe(0u);
@@ -52,42 +50,50 @@ public class StreamsTests
     }
 
     [Test]
-    [DependsOn(nameof(CreateStream_HappyPath_Should_CreateStream_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task CreateStream_Duplicate_Should_Throw_InvalidResponse(Protocol protocol)
     {
-        await Should.ThrowAsync<IggyInvalidStatusCodeException>(Fixture.Clients[protocol]
-            .CreateStreamAsync(Name.GetWithProtocol(protocol)));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name = $"dup-stream-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(name);
+
+        await Should.ThrowAsync<IggyInvalidStatusCodeException>(client.CreateStreamAsync(name));
     }
 
     [Test]
-    [DependsOn(nameof(CreateStream_Duplicate_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetStreams_Should_ReturnValidResponse(Protocol protocol)
     {
-        await Fixture.Clients[protocol].CreateStreamAsync("test-stream-2".GetWithProtocol(protocol));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name1 = $"get-streams-1-{Guid.NewGuid():N}";
+        var name2 = $"get-streams-2-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(name1);
+        await client.CreateStreamAsync(name2);
 
-        IReadOnlyList<StreamResponse> response = await Fixture.Clients[protocol].GetStreamsAsync();
+        IReadOnlyList<StreamResponse> response = await client.GetStreamsAsync();
 
         response.ShouldNotBeNull();
         response.Count.ShouldBeGreaterThanOrEqualTo(2);
-        response.ShouldContain(x => x.Name == Name.GetWithProtocol(protocol));
-        response.ShouldContain(x => x.Name == "test-stream-2".GetWithProtocol(protocol));
+        response.ShouldContain(x => x.Name == name1);
+        response.ShouldContain(x => x.Name == name2);
     }
 
     [Test]
-    [DependsOn(nameof(GetStreams_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetStreamById_Should_ReturnValidResponse(Protocol protocol)
     {
-        var newStream = await Fixture.Clients[protocol].CreateStreamAsync("test-stream-3".GetWithProtocol(protocol));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name = $"get-by-id-{Guid.NewGuid():N}";
+        var newStream = await client.CreateStreamAsync(name);
         newStream.ShouldNotBeNull();
 
-        var response = await Fixture.Clients[protocol]
-            .GetStreamByIdAsync(Identifier.Numeric(newStream.Id));
+        var response = await client.GetStreamByIdAsync(Identifier.Numeric(newStream.Id));
         response.ShouldNotBeNull();
         response.Id.ShouldBe(newStream.Id);
-        response.Name.ShouldBe(newStream.Name);
+        response.Name.ShouldBe(name);
         response.Size.ShouldBe(0u);
         response.CreatedAt.UtcDateTime.ShouldBe(DateTimeOffset.UtcNow.UtcDateTime, TimeSpan.FromMinutes(1));
         response.MessagesCount.ShouldBe(0u);
@@ -95,14 +101,16 @@ public class StreamsTests
         response.Topics.ShouldBeEmpty();
     }
 
-
     [Test]
-    [DependsOn(nameof(GetStreamById_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetStreams_ByStreamName_Should_ReturnValidResponse(Protocol protocol)
     {
-        var name = "test-stream-3".GetWithProtocol(protocol);
-        var response = await Fixture.Clients[protocol].GetStreamByIdAsync(Identifier.String(name));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name = $"get-by-name-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(name);
+
+        var response = await client.GetStreamByIdAsync(Identifier.String(name));
 
         response.ShouldNotBeNull();
         response.Id.ShouldNotBe(0u);
@@ -115,131 +123,141 @@ public class StreamsTests
     }
 
     [Test]
-    [DependsOn(nameof(GetStreams_ByStreamName_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetStreamById_WithTopics_Should_ReturnValidResponse(Protocol protocol)
     {
-        var topicRequest1 = TopicFactory.CreateTopic("Topic1", messageExpiry: TimeSpan.FromHours(1));
-        var topicRequest2 = TopicFactory.CreateTopic("Topic2", messageExpiry: TimeSpan.FromHours(1));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"topics-stream-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
 
-        await Fixture.Clients[protocol].CreateTopicAsync(Identifier.String(Name.GetWithProtocol(protocol)),
-            topicRequest1.Name, topicRequest1.PartitionsCount, messageExpiry: topicRequest1.MessageExpiry);
-        await Fixture.Clients[protocol].CreateTopicAsync(Identifier.String(Name.GetWithProtocol(protocol)),
-            topicRequest2.Name, topicRequest2.PartitionsCount, messageExpiry: topicRequest2.MessageExpiry);
+        var topicName1 = "Topic1";
+        var topicName2 = "Topic2";
+        await client.CreateTopicAsync(Identifier.String(streamName),
+            topicName1, 1, messageExpiry: TimeSpan.FromHours(1));
+        await client.CreateTopicAsync(Identifier.String(streamName),
+            topicName2, 1, messageExpiry: TimeSpan.FromHours(1));
 
-        await Fixture.Clients[protocol].SendMessagesAsync(Identifier.String(Name.GetWithProtocol(protocol)),
-            Identifier.String(topicRequest1.Name), Partitioning.None(),
+        await client.SendMessagesAsync(Identifier.String(streamName),
+            Identifier.String(topicName1), Partitioning.None(),
             [
                 new Message(Guid.NewGuid(), "Test message 1"u8.ToArray()),
                 new Message(Guid.NewGuid(), "Test message 2"u8.ToArray()),
                 new Message(Guid.NewGuid(), "Test message 3"u8.ToArray())
             ]);
 
-
-        await Fixture.Clients[protocol].SendMessagesAsync(Identifier.String(Name.GetWithProtocol(protocol)),
-            Identifier.String(topicRequest2.Name), Partitioning.None(), [
+        await client.SendMessagesAsync(Identifier.String(streamName),
+            Identifier.String(topicName2), Partitioning.None(), [
                 new Message(Guid.NewGuid(), "Test message 4"u8.ToArray()),
                 new Message(Guid.NewGuid(), "Test message 5"u8.ToArray()),
                 new Message(Guid.NewGuid(), "Test message 6"u8.ToArray()),
                 new Message(Guid.NewGuid(), "Test message 7"u8.ToArray())
             ]);
 
-        var response = await Fixture.Clients[protocol]
-            .GetStreamByIdAsync(Identifier.String(Name.GetWithProtocol(protocol)));
+        var response = await client.GetStreamByIdAsync(Identifier.String(streamName));
         response.ShouldNotBeNull();
         response.Id.ShouldBeGreaterThanOrEqualTo(0u);
-        response.Name.ShouldBe(Name.GetWithProtocol(protocol));
-        response.Size.ShouldBe(546u);
+        response.Name.ShouldBe(streamName);
+        response.Size.ShouldBeGreaterThan(0u);
         response.CreatedAt.UtcDateTime.ShouldBe(DateTimeOffset.UtcNow.UtcDateTime, TimeSpan.FromMinutes(1));
         response.MessagesCount.ShouldBe(7u);
         response.TopicsCount.ShouldBe(2);
         response.Topics.Count().ShouldBe(2);
 
-        var topic = response.Topics.First(x => x.Name == topicRequest1.Name);
+        var topic = response.Topics.First(x => x.Name == topicName1);
         topic.CreatedAt.UtcDateTime.ShouldBe(DateTimeOffset.UtcNow.UtcDateTime, TimeSpan.FromMinutes(1));
-        topic.Name.ShouldBe(topicRequest1.Name);
-        topic.CompressionAlgorithm.ShouldBe(topicRequest1.CompressionAlgorithm);
+        topic.Name.ShouldBe(topicName1);
         topic.Partitions.ShouldBeNull();
-        topic.MessageExpiry.ShouldBe(topicRequest1.MessageExpiry);
-        topic.Size.ShouldBe(234u);
-        topic.PartitionsCount.ShouldBe(topicRequest1.PartitionsCount);
-        topic.ReplicationFactor.ShouldBe(topicRequest1.ReplicationFactor);
+        topic.MessageExpiry.ShouldBe(TimeSpan.FromHours(1));
+        topic.Size.ShouldBeGreaterThan(0u);
+        topic.PartitionsCount.ShouldBe(1u);
         topic.MaxTopicSize.ShouldBeGreaterThan(0u);
         topic.MessagesCount.ShouldBe(3u);
     }
 
     [Test]
-    [DependsOn(nameof(GetStreamById_WithTopics_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task UpdateStream_Should_UpdateStream_Successfully(Protocol protocol)
     {
-        var streamToUpdate = await Fixture.Clients[protocol]
-            .CreateStreamAsync("stream-to-update".GetWithProtocol(protocol));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name = $"update-stream-{Guid.NewGuid():N}";
+        var updatedName = $"updated-stream-{Guid.NewGuid():N}";
+        var streamToUpdate = await client.CreateStreamAsync(name);
         streamToUpdate.ShouldNotBeNull();
 
-        await Fixture.Clients[protocol].UpdateStreamAsync(Identifier.String(streamToUpdate.Name),
-            "updated-test-stream".GetWithProtocol(protocol));
+        await client.UpdateStreamAsync(Identifier.String(streamToUpdate.Name), updatedName);
 
-        var result = await Fixture.Clients[protocol]
-            .GetStreamByIdAsync(Identifier.Numeric(streamToUpdate.Id));
+        var result = await client.GetStreamByIdAsync(Identifier.Numeric(streamToUpdate.Id));
         result.ShouldNotBeNull();
-        result.Name.ShouldBe("updated-test-stream".GetWithProtocol(protocol));
+        result.Name.ShouldBe(updatedName);
     }
 
     [Test]
-    [DependsOn(nameof(UpdateStream_Should_UpdateStream_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task PurgeStream_Should_PurgeStream_Successfully(Protocol protocol)
     {
-        // Ensure the stream has messages (created in previous steps) before purging
-        var stream = await Fixture.Clients[protocol]
-            .GetStreamByIdAsync(Identifier.String(Name.GetWithProtocol(protocol)));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"purge-stream-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), "purge-topic", 1);
+
+        await client.SendMessagesAsync(Identifier.String(streamName),
+            Identifier.String("purge-topic"), Partitioning.None(),
+            [
+                new Message(Guid.NewGuid(), "Test message 1"u8.ToArray()),
+                new Message(Guid.NewGuid(), "Test message 2"u8.ToArray())
+            ]);
 
+        var stream = await client.GetStreamByIdAsync(Identifier.String(streamName));
         stream.ShouldNotBeNull();
-        stream.MessagesCount.ShouldBe(7u);
-        stream.TopicsCount.ShouldBe(2);
+        stream.MessagesCount.ShouldBe(2u);
 
-        await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol].PurgeStreamAsync(Identifier.String(Name.GetWithProtocol(protocol))));
+        await Should.NotThrowAsync(() => client.PurgeStreamAsync(Identifier.String(streamName)));
 
-        stream = await Fixture.Clients[protocol]
-            .GetStreamByIdAsync(Identifier.String(Name.GetWithProtocol(protocol)));
+        stream = await client.GetStreamByIdAsync(Identifier.String(streamName));
         stream.ShouldNotBeNull();
         stream.MessagesCount.ShouldBe(0u);
-        stream.TopicsCount.ShouldBe(2);
+        stream.TopicsCount.ShouldBe(1);
     }
 
     [Test]
-    [DependsOn(nameof(PurgeStream_Should_PurgeStream_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeleteStream_Should_DeleteStream_Successfully(Protocol protocol)
     {
-        var streamToDelete = await Fixture.Clients[protocol]
-            .CreateStreamAsync("stream-to-delete".GetWithProtocol(protocol));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name = $"del-stream-{Guid.NewGuid():N}";
+        var streamToDelete = await client.CreateStreamAsync(name);
         streamToDelete.ShouldNotBeNull();
 
-        await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol].DeleteStreamAsync(Identifier.Numeric(streamToDelete.Id)));
+        await Should.NotThrowAsync(() => client.DeleteStreamAsync(Identifier.Numeric(streamToDelete.Id)));
     }
 
     [Test]
-    [DependsOn(nameof(DeleteStream_Should_DeleteStream_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeleteStream_NotExists_Should_Throw_InvalidResponse(Protocol protocol)
     {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol]
-                .DeleteStreamAsync(Identifier.String("stream-to-delete".GetWithProtocol(protocol))));
+            client.DeleteStreamAsync(Identifier.String($"nonexistent-{Guid.NewGuid():N}")));
     }
 
     [Test]
-    [DependsOn(nameof(DeleteStream_NotExists_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetStreamById_AfterDelete_Should_Throw_InvalidResponse(Protocol protocol)
     {
-        var stream = await Fixture.Clients[protocol]
-            .GetStreamByIdAsync(Identifier.String("stream-to-delete".GetWithProtocol(protocol)));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name = $"del-get-stream-{Guid.NewGuid():N}";
+        var stream = await client.CreateStreamAsync(name);
+        stream.ShouldNotBeNull();
+
+        await client.DeleteStreamAsync(Identifier.Numeric(stream.Id));
 
-        stream.ShouldBeNull();
+        var result = await client.GetStreamByIdAsync(Identifier.String(name));
+        result.ShouldBeNull();
     }
 }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/SystemTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/SystemTests.cs
index 3cc9a446c..e9563025c 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/SystemTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/SystemTests.cs
@@ -22,7 +22,6 @@ using Apache.Iggy.Kinds;
 using Apache.Iggy.Messages;
 using Apache.Iggy.Tests.Integrations.Attributes;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
 using Shouldly;
 using Partitioning = Apache.Iggy.Kinds.Partitioning;
 
@@ -30,38 +29,39 @@ namespace Apache.Iggy.Tests.Integrations;
 
 public class SystemTests
 {
-    [ClassDataSource<SystemFixture>(Shared = SharedType.PerClass)]
-    public required SystemFixture Fixture { get; init; }
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
-    public async Task GetClients_Should_Return_CorrectClientsCount(Protocol protocol)
+    public async Task GetClients_Should_Return_NonEmptyClientsList(Protocol protocol)
     {
-        IReadOnlyList<ClientResponse> clients = await Fixture.Clients[protocol].GetClientsAsync();
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        clients.Count.ShouldBeGreaterThanOrEqualTo(Fixture.TotalClientsCount);
-        foreach (var client in clients)
+        IReadOnlyList<ClientResponse> clients = await client.GetClientsAsync();
+
+        clients.ShouldNotBeNull();
+        clients.Count.ShouldBeGreaterThanOrEqualTo(1);
+        foreach (var c in clients)
         {
-            client.ClientId.ShouldNotBe(0u);
-            client.Address.ShouldNotBeNullOrEmpty();
-            client.Transport.ShouldBe(Protocol.Tcp);
+            c.ClientId.ShouldNotBe(0u);
+            c.Address.ShouldNotBeNullOrEmpty();
+            c.Transport.ShouldBe(Protocol.Tcp);
         }
     }
 
     [Test]
-    [DependsOn(nameof(GetClients_Should_Return_CorrectClientsCount))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetClient_Should_Return_CorrectClient(Protocol protocol)
     {
-        IReadOnlyList<ClientResponse> clients = await Fixture.Clients[protocol].GetClientsAsync();
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        var client = await Fixture.IggyServerFixture.CreateClient(Protocol.Tcp, protocol);
-        await client.LoginUser("iggy", "iggy");
-        var clientInfo = await client.GetMeAsync();
+        var tcpClient = await Fixture.CreateClient(Protocol.Tcp);
+        await tcpClient.LoginUser("iggy", "iggy");
+        var clientInfo = await tcpClient.GetMeAsync();
         clientInfo.ShouldNotBeNull();
 
-        clients.Count.ShouldBeGreaterThanOrEqualTo(Fixture.TotalClientsCount);
-        var response = await Fixture.Clients[protocol].GetClientByIdAsync(clientInfo.ClientId);
+        var response = await client.GetClientByIdAsync(clientInfo.ClientId);
         response.ShouldNotBeNull();
         response.ClientId.ShouldBe(clientInfo.ClientId);
         response.UserId.ShouldNotBeNull();
@@ -74,11 +74,12 @@ public class SystemTests
 
     [Test]
     [SkipHttp]
-    [DependsOn(nameof(GetClient_Should_Return_CorrectClient))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetMe_Tcp_Should_Return_MyClient(Protocol protocol)
     {
-        var me = await Fixture.Clients[protocol].GetMeAsync();
+        var client = await Fixture.CreateTcpClient();
+
+        var me = await client.GetMeAsync();
         me.ShouldNotBeNull();
         me.ClientId.ShouldNotBe(0u);
         me.UserId.ShouldBe(0u);
@@ -88,64 +89,60 @@ public class SystemTests
 
     [Test]
     [SkipTcp]
-    [DependsOn(nameof(GetClient_Should_Return_CorrectClient))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetMe_HTTP_Should_Throw_FeatureUnavailableException(Protocol protocol)
     {
-        await Should.ThrowAsync<FeatureUnavailableException>(() => Fixture.Clients[protocol].GetMeAsync());
+        var client = await Fixture.CreateHttpClient();
+
+        await Should.ThrowAsync<FeatureUnavailableException>(() => client.GetMeAsync());
     }
 
     [Test]
-    [DependsOn(nameof(GetMe_HTTP_Should_Throw_FeatureUnavailableException))]
-    [DependsOn(nameof(GetMe_Tcp_Should_Return_MyClient))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetClient_WithConsumerGroup_Should_Return_CorrectClient(Protocol protocol)
     {
-        var client = await Fixture.IggyServerFixture.CreateClient(Protocol.Tcp, protocol);
-        await client.LoginUser("iggy", "iggy");
-        var stream = await client.CreateStreamAsync(Fixture.StreamId.GetWithProtocol(protocol));
-        await client.CreateTopicAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), "test_topic", 2);
-
-        var consumerGroup
-            = await client.CreateConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String("test_topic"), "test_consumer_group");
-        await client.JoinConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.String("test_topic"), Identifier.String("test_consumer_group"));
-        var me = await client.GetMeAsync();
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"sys-cg-{Guid.NewGuid():N}";
+        var tcpClient = await Fixture.CreateClient(Protocol.Tcp);
+        await tcpClient.LoginUser("iggy", "iggy");
+
+        var stream = await tcpClient.CreateStreamAsync(streamName);
+        await tcpClient.CreateTopicAsync(Identifier.String(streamName), "first_topic", 2);
+        var secondTopic = await tcpClient.CreateTopicAsync(Identifier.String(streamName), "second_topic", 2);
 
-        var response = await Fixture.Clients[protocol].GetClientByIdAsync(me!.ClientId);
+        var consumerGroup = await tcpClient.CreateConsumerGroupAsync(
+            Identifier.String(streamName), Identifier.String("second_topic"), "test_consumer_group");
+        await tcpClient.JoinConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String("second_topic"), Identifier.String("test_consumer_group"));
+        var me = await tcpClient.GetMeAsync();
+
+        var response = await client.GetClientByIdAsync(me!.ClientId);
         response.ShouldNotBeNull();
-        response.UserId.ShouldBe(0u);
         response.Address.ShouldNotBeNullOrEmpty();
         response.Transport.ShouldBe(Protocol.Tcp);
         response.ConsumerGroupsCount.ShouldBe(1);
         response.ConsumerGroups.ShouldNotBeEmpty();
         response.ConsumerGroups.ShouldContain(x => x.GroupId == consumerGroup!.Id);
-        response.ConsumerGroups.ShouldContain(x => x.TopicId == 0);
         response.ConsumerGroups.ShouldContain(x => x.StreamId == stream!.Id);
+        response.ConsumerGroups.ShouldContain(x => x.TopicId == (int)secondTopic!.Id);
     }
 
-
     [Test]
-    [DependsOn(nameof(GetClient_WithConsumerGroup_Should_Return_CorrectClient))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetStats_Should_ReturnValidResponse(Protocol protocol)
     {
-        await Fixture.Clients[protocol].SendMessagesAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.Numeric(0), Partitioning.None(), [new Message(Guid.NewGuid(), "Test message"u8.ToArray())]);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        await Fixture.Clients[protocol].PollMessagesAsync(new MessageFetchRequest
-        {
-            StreamId = Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            TopicId = Identifier.Numeric(0),
-            AutoCommit = true,
-            Consumer = Consumer.New(1),
-            Count = 1,
-            PartitionId = 1,
-            PollingStrategy = PollingStrategy.First()
-        });
-
-        var response = await Fixture.Clients[protocol].GetStatsAsync();
+        // Create a stream/topic and send a message so stats are non-zero
+        var streamName = $"sys-stats-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), "stats-topic", 1);
+        await client.SendMessagesAsync(Identifier.String(streamName),
+            Identifier.String("stats-topic"), Partitioning.None(),
+            [new Message(Guid.NewGuid(), "Test message"u8.ToArray())]);
+
+        var response = await client.GetStatsAsync();
         response.ShouldNotBeNull();
         response.ProcessId.ShouldBeGreaterThanOrEqualTo(0);
         response.CpuUsage.ShouldBeGreaterThanOrEqualTo(0);
@@ -158,13 +155,12 @@ public class SystemTests
         response.ReadBytes.ShouldBeGreaterThanOrEqualTo(0u);
         response.WrittenBytes.ShouldBeGreaterThanOrEqualTo(0u);
         response.MessagesSizeBytes.ShouldBeGreaterThanOrEqualTo(0u);
-        response.StreamsCount.ShouldNotBe(0);
-        response.TopicsCount.ShouldNotBe(0);
-        response.PartitionsCount.ShouldNotBe(0);
-        response.SegmentsCount.ShouldNotBe(0);
-        response.MessagesCount.ShouldNotBe(0u);
-        response.ClientsCount.ShouldNotBe(0);
-        response.ConsumerGroupsCount.ShouldNotBe(0);
+        response.StreamsCount.ShouldBeGreaterThanOrEqualTo(1);
+        response.TopicsCount.ShouldBeGreaterThanOrEqualTo(1);
+        response.PartitionsCount.ShouldBeGreaterThanOrEqualTo(1);
+        response.SegmentsCount.ShouldBeGreaterThanOrEqualTo(1);
+        response.MessagesCount.ShouldBeGreaterThanOrEqualTo(1u);
+        response.ClientsCount.ShouldBeGreaterThanOrEqualTo(1);
         response.Hostname.ShouldNotBeNullOrEmpty();
         response.OsName.ShouldNotBeNullOrEmpty();
         response.OsVersion.ShouldNotBeNullOrEmpty();
@@ -174,19 +170,21 @@ public class SystemTests
     }
 
     [Test]
-    [DependsOn(nameof(GetStats_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Ping_Should_Pong(Protocol protocol)
     {
-        await Should.NotThrowAsync(Fixture.Clients[protocol].PingAsync());
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        await Should.NotThrowAsync(client.PingAsync());
     }
 
     [Test]
-    [DependsOn(nameof(Ping_Should_Pong))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetSnapshot_Should_Return_ValidZipData(Protocol protocol)
     {
-        var snapshot = await Fixture.Clients[protocol].GetSnapshotAsync(
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var snapshot = await client.GetSnapshotAsync(
             SnapshotCompression.Deflated,
             [SystemSnapshotType.Test]);
 
@@ -197,29 +195,4 @@ public class SystemTests
         snapshot[0].ShouldBe((byte)'P');
         snapshot[1].ShouldBe((byte)'K');
     }
-
-    // [Test]
-    // [DependsOn(nameof(Ping_Should_Pong))]
-    // [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
-    // public async Task GetClusterMetadata_Should_Return_ClusterMetadata(Protocol protocol)
-    // {
-    //     var clusterMetadata = await Fixture.Clients[protocol].GetClusterMetadataAsync();
-    //
-    //     clusterMetadata.ShouldNotBeNull();
-    //     clusterMetadata.Id.ShouldBe(1u);
-    //     clusterMetadata.Name.ShouldBe("iggy-cluster");
-    //     clusterMetadata.Transport.ShouldBe(Protocol.Tcp);
-    //     clusterMetadata.Nodes.ShouldNotBeEmpty();
-    //     clusterMetadata.Nodes.Length.ShouldBe(2);
-    //     clusterMetadata.Nodes[0].Id.ShouldBe(1u);
-    //     clusterMetadata.Nodes[0].Name.ShouldBe("iggy-node-1");
-    //     clusterMetadata.Nodes[0].Address.ShouldBe("127.0.0.1:8090");
-    //     clusterMetadata.Nodes[0].Role.ShouldBe(ClusterNodeRole.Leader);
-    //     clusterMetadata.Nodes[0].Status.ShouldBe(ClusterNodeStatus.Healthy);
-    //     clusterMetadata.Nodes[1].Id.ShouldBe(2u);
-    //     clusterMetadata.Nodes[1].Name.ShouldBe("iggy-node-2");
-    //     clusterMetadata.Nodes[1].Address.ShouldBe("127.0.0.1:8092");
-    //     clusterMetadata.Nodes[1].Role.ShouldBe(ClusterNodeRole.Follower);
-    //     clusterMetadata.Nodes[1].Status.ShouldBe(ClusterNodeStatus.Healthy);
-    // }
 }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/TopicsTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/TopicsTests.cs
index d516e790e..c15f6cdb9 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/TopicsTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/TopicsTests.cs
@@ -21,8 +21,6 @@ using Apache.Iggy.Enums;
 using Apache.Iggy.Exceptions;
 using Apache.Iggy.Messages;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
-using Apache.Iggy.Tests.Integrations.Models;
 using Shouldly;
 using Partitioning = Apache.Iggy.Kinds.Partitioning;
 
@@ -30,175 +28,154 @@ namespace Apache.Iggy.Tests.Integrations;
 
 public class TopicsTests
 {
-    private static readonly CreateTestTopic TopicRequest = new("Test Topic", CompressionAlgorithm.Gzip,
-        TimeSpan.FromMinutes(10), 1, 2, 2_000_000_000);
-
-    private static readonly CreateTestTopic TopicRequestSecond
-        = new("Test Topic 2", CompressionAlgorithm.Gzip, TimeSpan.FromMinutes(10), 1, 2, 2_000_000_000);
-
-    private static readonly UpdateTestTopic UpdateTopicRequest
-        = new("Updated Topic", CompressionAlgorithm.Gzip, 3_000_000_000, TimeSpan.FromMinutes(10), 3);
-
-    [ClassDataSource<TopicsFixture>(Shared = SharedType.PerClass)]
-    public required TopicsFixture Fixture { get; init; }
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Create_NewTopic_Should_Return_Successfully(Protocol protocol)
     {
-        var response = await Fixture.Clients[protocol].CreateTopicAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicRequest.Name,
-            TopicRequest.PartitionsCount, TopicRequest.CompressionAlgorithm, TopicRequest.ReplicationFactor,
-            TopicRequest.MessageExpiry, TopicRequest.MaxTopicSize);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"topic-create-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+
+        var response = await client.CreateTopicAsync(
+            Identifier.String(streamName), "Test Topic", 2, CompressionAlgorithm.Gzip,
+            1, TimeSpan.FromMinutes(10), 2_000_000_000);
 
         response.ShouldNotBeNull();
         response.Id.ShouldBeGreaterThanOrEqualTo(0u);
         response.CreatedAt.UtcDateTime.ShouldBe(DateTimeOffset.UtcNow.UtcDateTime, TimeSpan.FromMinutes(1));
-        response.Name.ShouldBe(TopicRequest.Name);
-        response.CompressionAlgorithm.ShouldBe(TopicRequest.CompressionAlgorithm);
-        response.Partitions!.Count().ShouldBe((int)TopicRequest.PartitionsCount);
-        response.MessageExpiry.ShouldBe(TopicRequest.MessageExpiry);
+        response.Name.ShouldBe("Test Topic");
+        response.CompressionAlgorithm.ShouldBe(CompressionAlgorithm.Gzip);
+        response.Partitions!.Count().ShouldBe(2);
+        response.MessageExpiry.ShouldBe(TimeSpan.FromMinutes(10));
         response.Size.ShouldBe(0u);
-        response.PartitionsCount.ShouldBe(TopicRequest.PartitionsCount);
-        response.ReplicationFactor.ShouldBe(TopicRequest.ReplicationFactor);
-        response.MaxTopicSize.ShouldBe(TopicRequest.MaxTopicSize);
+        response.PartitionsCount.ShouldBe(2u);
+        response.ReplicationFactor.ShouldBe((byte?)1);
+        response.MaxTopicSize.ShouldBe(2_000_000_000u);
         response.MessagesCount.ShouldBe(0u);
     }
 
     [Test]
-    [DependsOn(nameof(Create_NewTopic_Should_Return_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Create_DuplicateTopic_Should_Throw_InvalidResponse(Protocol protocol)
     {
-        await Should.ThrowAsync<IggyInvalidStatusCodeException>(Fixture.Clients[protocol].CreateTopicAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicRequest.Name,
-            TopicRequest.PartitionsCount, TopicRequest.CompressionAlgorithm, TopicRequest.ReplicationFactor,
-            TopicRequest.MessageExpiry, TopicRequest.MaxTopicSize));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"topic-dup-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), "Dup Topic", 1);
+
+        await Should.ThrowAsync<IggyInvalidStatusCodeException>(
+            client.CreateTopicAsync(Identifier.String(streamName), "Dup Topic", 1));
     }
 
     [Test]
-    [DependsOn(nameof(Create_DuplicateTopic_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Get_ExistingTopic_Should_ReturnValidResponse(Protocol protocol)
     {
-        var response = await Fixture.Clients[protocol]
-            .GetTopicByIdAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), Identifier.Numeric(0));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"topic-get-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), "Get Topic", 2,
+            CompressionAlgorithm.Gzip, 1, TimeSpan.FromMinutes(10), 2_000_000_000);
+
+        var response = await client.GetTopicByIdAsync(Identifier.String(streamName), Identifier.Numeric(0));
 
         response.ShouldNotBeNull();
         response.Id.ShouldBeGreaterThanOrEqualTo(0u);
         response.CreatedAt.UtcDateTime.ShouldBe(DateTimeOffset.UtcNow.UtcDateTime, TimeSpan.FromMinutes(1));
-        response.Name.ShouldBe(TopicRequest.Name);
-        response.CompressionAlgorithm.ShouldBe(TopicRequest.CompressionAlgorithm);
-        response.Partitions!.Count().ShouldBe((int)TopicRequest.PartitionsCount);
-        response.MessageExpiry.ShouldBe(TopicRequest.MessageExpiry);
+        response.Name.ShouldBe("Get Topic");
+        response.CompressionAlgorithm.ShouldBe(CompressionAlgorithm.Gzip);
+        response.Partitions!.Count().ShouldBe(2);
+        response.MessageExpiry.ShouldBe(TimeSpan.FromMinutes(10));
         response.Size.ShouldBe(0u);
-        response.PartitionsCount.ShouldBe(TopicRequest.PartitionsCount);
-        response.ReplicationFactor.ShouldBe(TopicRequest.ReplicationFactor);
-        response.MaxTopicSize.ShouldBe(TopicRequest.MaxTopicSize);
+        response.PartitionsCount.ShouldBe(2u);
+        response.ReplicationFactor.ShouldBe((byte?)1);
+        response.MaxTopicSize.ShouldBe(2_000_000_000u);
         response.MessagesCount.ShouldBe(0u);
     }
 
     [Test]
-    [DependsOn(nameof(Get_ExistingTopic_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Get_ExistingTopic_ByName_Should_ReturnValidResponse(Protocol protocol)
     {
-        var response = await Fixture.Clients[protocol]
-            .GetTopicByIdAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(TopicRequest.Name));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"topic-getname-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), "Name Topic", 2,
+            CompressionAlgorithm.Gzip, 1, TimeSpan.FromMinutes(10), 2_000_000_000);
+
+        var response = await client.GetTopicByIdAsync(Identifier.String(streamName),
+            Identifier.String("Name Topic"));
 
         response.ShouldNotBeNull();
         response.Id.ShouldBeGreaterThanOrEqualTo(0u);
-        response.CreatedAt.UtcDateTime.ShouldBe(DateTimeOffset.UtcNow.UtcDateTime, TimeSpan.FromMinutes(1));
-        response.Name.ShouldBe(TopicRequest.Name);
-        response.CompressionAlgorithm.ShouldBe(TopicRequest.CompressionAlgorithm);
-        response.Partitions!.Count().ShouldBe((int)TopicRequest.PartitionsCount);
-        response.MessageExpiry.ShouldBe(TopicRequest.MessageExpiry);
+        response.Name.ShouldBe("Name Topic");
+        response.CompressionAlgorithm.ShouldBe(CompressionAlgorithm.Gzip);
+        response.Partitions!.Count().ShouldBe(2);
+        response.MessageExpiry.ShouldBe(TimeSpan.FromMinutes(10));
         response.Size.ShouldBe(0u);
-        response.PartitionsCount.ShouldBe(TopicRequest.PartitionsCount);
-        response.ReplicationFactor.ShouldBe(TopicRequest.ReplicationFactor);
-        response.MaxTopicSize.ShouldBe(TopicRequest.MaxTopicSize);
+        response.PartitionsCount.ShouldBe(2u);
+        response.ReplicationFactor.ShouldBe((byte?)1);
+        response.MaxTopicSize.ShouldBe(2_000_000_000u);
         response.MessagesCount.ShouldBe(0u);
     }
 
     [Test]
-    [DependsOn(nameof(Get_ExistingTopic_ByName_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Get_ExistingTopics_Should_ReturnValidResponse(Protocol protocol)
     {
-        await Fixture.Clients[protocol].CreateTopicAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            TopicRequestSecond.Name, TopicRequestSecond.PartitionsCount, TopicRequestSecond.CompressionAlgorithm,
-            TopicRequestSecond.ReplicationFactor, TopicRequestSecond.MessageExpiry,
-            TopicRequestSecond.MaxTopicSize);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        IReadOnlyList<TopicResponse> response = await Fixture.Clients[protocol]
-            .GetTopicsAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)));
+        var streamName = $"topic-list-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), "List Topic 1", 2,
+            CompressionAlgorithm.Gzip, 1, TimeSpan.FromMinutes(10), 2_000_000_000);
+        await client.CreateTopicAsync(Identifier.String(streamName), "List Topic 2", 2,
+            CompressionAlgorithm.Gzip, 1, TimeSpan.FromMinutes(10), 2_000_000_000);
+
+        IReadOnlyList<TopicResponse> response = await client.GetTopicsAsync(Identifier.String(streamName));
 
         response.ShouldNotBeNull();
         response.Count().ShouldBe(2);
-        response.Select(x => x.Name).ShouldContain(TopicRequest.Name);
-        response.Select(x => x.Name).ShouldContain(TopicRequestSecond.Name);
-
-        var firstTopic = response.First(x => x.Name == TopicRequest.Name);
-        firstTopic.Id.ShouldBeGreaterThanOrEqualTo(0u);
-        firstTopic.CreatedAt.UtcDateTime.ShouldBe(DateTimeOffset.UtcNow.UtcDateTime, TimeSpan.FromMinutes(1));
-        firstTopic.Name.ShouldBe(TopicRequest.Name);
-        firstTopic.CompressionAlgorithm.ShouldBe(TopicRequest.CompressionAlgorithm);
-        firstTopic.Partitions.ShouldBeNull();
-        firstTopic.MessageExpiry.ShouldBe(TopicRequest.MessageExpiry);
-        firstTopic.Size.ShouldBe(0u);
-        firstTopic.PartitionsCount.ShouldBe(TopicRequest.PartitionsCount);
-        firstTopic.ReplicationFactor.ShouldBe(TopicRequest.ReplicationFactor);
-        firstTopic.MaxTopicSize.ShouldBe(TopicRequest.MaxTopicSize);
-        firstTopic.MessagesCount.ShouldBe(0u);
-
-        var secondTopic = response.First(x => x.Name == TopicRequestSecond.Name);
-        secondTopic.Id.ShouldBeGreaterThanOrEqualTo(0u);
-        secondTopic.CreatedAt.UtcDateTime.ShouldBe(DateTimeOffset.UtcNow.UtcDateTime, TimeSpan.FromMinutes(1));
-        secondTopic.Name.ShouldBe(TopicRequestSecond.Name);
-        secondTopic.CompressionAlgorithm.ShouldBe(TopicRequestSecond.CompressionAlgorithm);
-        secondTopic.Partitions.ShouldBeNull();
-        secondTopic.MessageExpiry.ShouldBe(TopicRequestSecond.MessageExpiry);
-        secondTopic.Size.ShouldBe(0u);
-        secondTopic.PartitionsCount.ShouldBe(TopicRequestSecond.PartitionsCount);
-        secondTopic.ReplicationFactor.ShouldBe(TopicRequestSecond.ReplicationFactor);
-        secondTopic.MaxTopicSize.ShouldBe(TopicRequestSecond.MaxTopicSize);
-        secondTopic.MessagesCount.ShouldBe(0u);
+        response.Select(x => x.Name).ShouldContain("List Topic 1");
+        response.Select(x => x.Name).ShouldContain("List Topic 2");
     }
 
     [Test]
-    [DependsOn(nameof(Get_ExistingTopics_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Get_Topic_WithPartitions_Should_ReturnValidResponse(Protocol protocol)
     {
-        await Fixture.Clients[protocol]
-            .CreatePartitionsAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(TopicRequest.Name),
-                2);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"topic-parts-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), "Parts Topic", 1);
+
+        await client.CreatePartitionsAsync(Identifier.String(streamName),
+            Identifier.String("Parts Topic"), 2);
 
         for (var i = 0; i < 3; i++)
         {
-            await Fixture.Clients[protocol]
-                .SendMessagesAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                    Identifier.String(TopicRequest.Name),
-                    Partitioning.None(), GetMessages(i + 2));
+            await client.SendMessagesAsync(Identifier.String(streamName),
+                Identifier.String("Parts Topic"),
+                Partitioning.None(), GetMessages(i + 2));
         }
 
-        var response = await Fixture.Clients[protocol]
-            .GetTopicByIdAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(TopicRequest.Name));
+        var response = await client.GetTopicByIdAsync(Identifier.String(streamName),
+            Identifier.String("Parts Topic"));
 
         response.ShouldNotBeNull();
         response.Id.ShouldBeGreaterThanOrEqualTo(0u);
-        response.CreatedAt.UtcDateTime.ShouldBe(DateTimeOffset.UtcNow.UtcDateTime, TimeSpan.FromMinutes(1));
-        response.Name.ShouldBe(TopicRequest.Name);
-        response.CompressionAlgorithm.ShouldBe(TopicRequest.CompressionAlgorithm);
+        response.Name.ShouldBe("Parts Topic");
         response.Partitions!.Count().ShouldBe(3);
-        response.MessageExpiry.ShouldBe(TopicRequest.MessageExpiry);
-        response.Size.ShouldBe(702u);
+        response.Size.ShouldBeGreaterThan(0u);
         response.PartitionsCount.ShouldBe(3u);
-        response.ReplicationFactor.ShouldBe(TopicRequest.ReplicationFactor);
-        response.MaxTopicSize.ShouldBe(TopicRequest.MaxTopicSize);
         response.MessagesCount.ShouldBe(9u);
         response.Partitions.ShouldNotBeNull();
         response.Partitions.ShouldAllBe(x => x.MessagesCount > 0);
@@ -210,88 +187,100 @@ public class TopicsTests
     }
 
     [Test]
-    [DependsOn(nameof(Get_Topic_WithPartitions_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Update_ExistingTopic_Should_UpdateTopic_Successfully(Protocol protocol)
     {
-        var topicToUpdate = await Fixture.Clients[protocol]
-            .CreateTopicAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), "topic-to-update", 1);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"topic-update-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        var topicToUpdate = await client.CreateTopicAsync(Identifier.String(streamName), "topic-to-update", 1);
         topicToUpdate.ShouldNotBeNull();
 
-        await Should.NotThrowAsync(Fixture.Clients[protocol].UpdateTopicAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.Numeric(topicToUpdate.Id), UpdateTopicRequest.Name,
-            UpdateTopicRequest.CompressionAlgorithm, UpdateTopicRequest.MaxTopicSize, UpdateTopicRequest.MessageExpiry,
-            UpdateTopicRequest.ReplicationFactor));
+        await Should.NotThrowAsync(client.UpdateTopicAsync(
+            Identifier.String(streamName),
+            Identifier.Numeric(topicToUpdate.Id), "Updated Topic",
+            CompressionAlgorithm.Gzip, 3_000_000_000, TimeSpan.FromMinutes(10), 3));
 
-        var result = await Fixture.Clients[protocol].GetTopicByIdAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
+        var result = await client.GetTopicByIdAsync(
+            Identifier.String(streamName),
             Identifier.Numeric(topicToUpdate.Id));
         result.ShouldNotBeNull();
-        result!.Name.ShouldBe(UpdateTopicRequest.Name);
-        result.MessageExpiry.ShouldBe(UpdateTopicRequest.MessageExpiry);
-        result.CompressionAlgorithm.ShouldBe(UpdateTopicRequest.CompressionAlgorithm);
-        result.MaxTopicSize.ShouldBe(UpdateTopicRequest.MaxTopicSize);
-        result.ReplicationFactor.ShouldBe(UpdateTopicRequest.ReplicationFactor);
+        result!.Name.ShouldBe("Updated Topic");
+        result.MessageExpiry.ShouldBe(TimeSpan.FromMinutes(10));
+        result.CompressionAlgorithm.ShouldBe(CompressionAlgorithm.Gzip);
+        result.MaxTopicSize.ShouldBe(3_000_000_000u);
+        result.ReplicationFactor.ShouldBe((byte?)3);
     }
 
     [Test]
-    [DependsOn(nameof(Update_ExistingTopic_Should_UpdateTopic_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Purge_ExistingTopic_Should_PurgeTopic_Successfully(Protocol protocol)
     {
-        var beforePurge = await Fixture.Clients[protocol]
-            .GetTopicByIdAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(TopicRequest.Name));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"topic-purge-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), "Purge Topic", 1);
 
+        await client.SendMessagesAsync(Identifier.String(streamName),
+            Identifier.String("Purge Topic"), Partitioning.None(), GetMessages(5));
+
+        var beforePurge = await client.GetTopicByIdAsync(Identifier.String(streamName),
+            Identifier.String("Purge Topic"));
         beforePurge.ShouldNotBeNull();
-        beforePurge.MessagesCount.ShouldBe(9u);
+        beforePurge.MessagesCount.ShouldBe(5u);
         beforePurge.Size.ShouldBeGreaterThan(0u);
 
-        await Should.NotThrowAsync(Fixture.Clients[protocol].PurgeTopicAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.String(TopicRequest.Name)));
+        await Should.NotThrowAsync(client.PurgeTopicAsync(
+            Identifier.String(streamName), Identifier.String("Purge Topic")));
 
-        var afterPurge = await Fixture.Clients[protocol]
-            .GetTopicByIdAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(TopicRequest.Name));
+        var afterPurge = await client.GetTopicByIdAsync(Identifier.String(streamName),
+            Identifier.String("Purge Topic"));
         afterPurge.ShouldNotBeNull();
         afterPurge!.MessagesCount.ShouldBe(0u);
         afterPurge.Size.ShouldBe(0u);
     }
 
     [Test]
-    [DependsOn(nameof(Purge_ExistingTopic_Should_PurgeTopic_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Delete_ExistingTopic_Should_DeleteTopic_Successfully(Protocol protocol)
     {
-        var topicToDelete = await Fixture.Clients[protocol]
-            .CreateTopicAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), "topic-to-delete", 1);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"topic-del-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        var topicToDelete = await client.CreateTopicAsync(Identifier.String(streamName), "topic-to-delete", 1);
         topicToDelete.ShouldNotBeNull();
 
-        await Should.NotThrowAsync(Fixture.Clients[protocol].DeleteTopicAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.Numeric(topicToDelete.Id)));
+        await Should.NotThrowAsync(client.DeleteTopicAsync(
+            Identifier.String(streamName), Identifier.Numeric(topicToDelete.Id)));
     }
 
     [Test]
-    [DependsOn(nameof(Delete_ExistingTopic_Should_DeleteTopic_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Delete_NonExistingTopic_Should_Throw_InvalidResponse(Protocol protocol)
     {
-        await Should.ThrowAsync<IggyInvalidStatusCodeException>(Fixture.Clients[protocol].DeleteTopicAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.String("topic-to-delete")));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"topic-delnone-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+
+        await Should.ThrowAsync<IggyInvalidStatusCodeException>(client.DeleteTopicAsync(
+            Identifier.String(streamName), Identifier.String("nonexistent-topic")));
     }
 
     [Test]
-    [DependsOn(nameof(Delete_NonExistingTopic_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Get_NonExistingTopic_Should_Throw_InvalidResponse(Protocol protocol)
     {
-        var topic = await Fixture.Clients[protocol].GetTopicByIdAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.String("topic-to-delete"));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"topic-getnone-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+
+        var topic = await client.GetTopicByIdAsync(
+            Identifier.String(streamName), Identifier.String("nonexistent-topic"));
 
         topic.ShouldBeNull();
     }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/UsersTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/UsersTests.cs
index 0e95a3ec0..3f0a08e30 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/UsersTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/UsersTests.cs
@@ -20,88 +20,94 @@ using Apache.Iggy.Contracts.Auth;
 using Apache.Iggy.Contracts.Http.Auth;
 using Apache.Iggy.Enums;
 using Apache.Iggy.Exceptions;
-using Apache.Iggy.Tests.Integrations.Attributes;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
 using Shouldly;
 
 namespace Apache.Iggy.Tests.Integrations;
 
 public class UsersTests
 {
-    private const string Username = "fixture_users_user_1";
-    private const string NewUsername = "fixture_users_user_1_new";
-
-    [ClassDataSource<UsersFixture>(Shared = SharedType.PerClass)]
-    public required UsersFixture Fixture { get; init; }
-
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task CreateUser_Should_CreateUser_Successfully(Protocol protocol)
     {
-        var request = new CreateUserRequest(Username.GetWithProtocol(protocol), "test_password_1", UserStatus.Active,
-            null);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        var result = await Fixture.Clients[protocol].CreateUser(request.Username, request.Password, request.Status);
+        var username = $"user-{Guid.NewGuid():N}"[..20];
+        var result = await client.CreateUser(username, "test_password_1", UserStatus.Active);
         result.ShouldNotBeNull();
-        result.Username.ShouldBe(request.Username);
-        result.Status.ShouldBe(request.Status);
+        result.Username.ShouldBe(username);
+        result.Status.ShouldBe(UserStatus.Active);
         result.Id.ShouldBeGreaterThan(0u);
         result.CreatedAt.ShouldBeGreaterThan(0u);
     }
 
     [Test]
-    [DependsOn(nameof(CreateUser_Should_CreateUser_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task CreateUser_Duplicate_Should_Throw_InvalidResponse(Protocol protocol)
     {
-        var request = new CreateUserRequest(Username.GetWithProtocol(protocol), "test1", UserStatus.Active, null);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var username = $"dup-{Guid.NewGuid():N}"[..20];
+        await client.CreateUser(username, "test1", UserStatus.Active);
 
-        await Should.ThrowAsync<IggyInvalidStatusCodeException>(Fixture.Clients[protocol]
-            .CreateUser(request.Username, request.Password, request.Status));
+        await Should.ThrowAsync<IggyInvalidStatusCodeException>(
+            client.CreateUser(username, "test1", UserStatus.Active));
     }
 
     [Test]
-    [DependsOn(nameof(CreateUser_Duplicate_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetUser_WithoutPermissions_Should_ReturnValidResponse(Protocol protocol)
     {
-        var response = await Fixture.Clients[protocol].GetUser(Identifier.String(Username.GetWithProtocol(protocol)));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var username = $"get-{Guid.NewGuid():N}"[..20];
+        await client.CreateUser(username, "test1", UserStatus.Active);
+
+        var response = await client.GetUser(Identifier.String(username));
 
         response.ShouldNotBeNull();
         response.Id.ShouldBeGreaterThanOrEqualTo(0u);
-        response.Username.ShouldBe(Username.GetWithProtocol(protocol));
+        response.Username.ShouldBe(username);
         response.Status.ShouldBe(UserStatus.Active);
         response.CreatedAt.ShouldBeGreaterThan(0u);
         response.Permissions.ShouldBeNull();
     }
 
     [Test]
-    [DependsOn(nameof(GetUser_WithoutPermissions_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetUsers_Should_ReturnValidResponse(Protocol protocol)
     {
-        IReadOnlyList<UserResponse> response = await Fixture.Clients[protocol].GetUsers();
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var username = $"lst-{Guid.NewGuid():N}"[..20];
+        await client.CreateUser(username, "test1", UserStatus.Active);
+
+        IReadOnlyList<UserResponse> response = await client.GetUsers();
 
         response.ShouldNotBeNull();
         response.ShouldNotBeEmpty();
-        response.ShouldContain(user =>
-            user.Username == Username.GetWithProtocol(protocol) && user.Status == UserStatus.Active);
+        response.ShouldContain(user => user.Username == username && user.Status == UserStatus.Active);
         response.ShouldAllBe(user => user.CreatedAt > 0u);
         response.ShouldAllBe(user => user.Permissions == null);
     }
 
     [Test]
-    [DependsOn(nameof(GetUsers_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task UpdateUser_Should_UpdateUser_Successfully(Protocol protocol)
     {
-        var newUsername = NewUsername.GetWithProtocol(protocol);
-        await Should.NotThrowAsync(Fixture.Clients[protocol]
-            .UpdateUser(Identifier.String(Username.GetWithProtocol(protocol)), newUsername, UserStatus.Active));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var username = $"upd-{Guid.NewGuid():N}"[..20];
+        var newUsername = $"new-{Guid.NewGuid():N}"[..20];
+        await client.CreateUser(username, "test1", UserStatus.Active);
+
+        await Should.NotThrowAsync(client.UpdateUser(Identifier.String(username), newUsername, UserStatus.Active));
 
-        var user = await Fixture.Clients[protocol].GetUser(Identifier.String(newUsername));
+        var user = await client.GetUser(Identifier.String(newUsername));
 
         user.ShouldNotBeNull();
         user.Id.ShouldBeGreaterThanOrEqualTo(0u);
@@ -109,24 +115,23 @@ public class UsersTests
         user.Status.ShouldBe(UserStatus.Active);
         user.CreatedAt.ShouldBeGreaterThan(0u);
         user.Permissions.ShouldBeNull();
-
-        await Should.NotThrowAsync(Fixture.Clients[protocol]
-            .UpdateUser(Identifier.String(newUsername), Username.GetWithProtocol(protocol), UserStatus.Active));
     }
 
     [Test]
-    [DependsOn(nameof(UpdateUser_Should_UpdateUser_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task UpdatePermissions_Should_UpdatePermissions_Successfully(Protocol protocol)
     {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var username = $"perm-{Guid.NewGuid():N}"[..20];
+        await client.CreateUser(username, "test1", UserStatus.Active);
+
         var permissions = CreatePermissions();
-        await Should.NotThrowAsync(Fixture.Clients[protocol]
-            .UpdatePermissions(Identifier.String(Username.GetWithProtocol(protocol)), permissions));
+        await Should.NotThrowAsync(client.UpdatePermissions(Identifier.String(username), permissions));
 
-        var user = await Fixture.Clients[protocol].GetUser(Identifier.String(Username.GetWithProtocol(protocol)));
+        var user = await client.GetUser(Identifier.String(username));
 
         user.ShouldNotBeNull();
-        user.Id.ShouldBeGreaterThanOrEqualTo(0u);
         user.Permissions.ShouldNotBeNull();
         user.Permissions!.Global.ShouldNotBeNull();
         user.Permissions.Global.ManageServers.ShouldBeTrue();
@@ -156,31 +161,47 @@ public class UsersTests
     }
 
     [Test]
-    [DependsOn(nameof(UpdatePermissions_Should_UpdatePermissions_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task ChangePassword_Should_ChangePassword_Successfully(Protocol protocol)
     {
-        await Should.NotThrowAsync(Fixture.Clients[protocol]
-            .ChangePassword(Identifier.String(Username.GetWithProtocol(protocol)), "test_password_1", "user2"));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var username = $"chpw-{Guid.NewGuid():N}"[..20];
+        await client.CreateUser(username, "old_password", UserStatus.Active);
+
+        await Should.NotThrowAsync(client.ChangePassword(Identifier.String(username), "old_password", "new_password"));
+
+        // Verify password was actually changed by logging in with the new credentials
+        var loginClient = await Fixture.CreateClient(protocol);
+        var loginResponse = await loginClient.LoginUser(username, "new_password");
+        loginResponse.ShouldNotBeNull();
+        loginResponse.UserId.ShouldBeGreaterThan(0);
     }
 
     [Test]
-    [DependsOn(nameof(ChangePassword_Should_ChangePassword_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task ChangePassword_WrongCurrentPassword_Should_Throw_InvalidResponse(Protocol protocol)
     {
-        await Should.ThrowAsync<IggyInvalidStatusCodeException>(Fixture.Clients[protocol]
-            .ChangePassword(Identifier.String(Username.GetWithProtocol(protocol)), "test_password_1", "user2"));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var username = $"chpwf-{Guid.NewGuid():N}"[..20];
+        await client.CreateUser(username, "correct_password", UserStatus.Active);
+
+        await Should.ThrowAsync<IggyInvalidStatusCodeException>(
+            client.ChangePassword(Identifier.String(username), "wrong_password", "new_password"));
     }
 
     [Test]
-    [DependsOn(nameof(ChangePassword_WrongCurrentPassword_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task LoginUser_Should_LoginUser_Successfully(Protocol protocol)
     {
-        var client = await Fixture.IggyServerFixture.CreateClient(protocol);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var username = $"login-{Guid.NewGuid():N}"[..20];
+        await client.CreateUser(username, "login_password", UserStatus.Active);
 
-        var response = await client.LoginUser(Username.GetWithProtocol(protocol), "user2");
+        var loginClient = await Fixture.CreateClient(protocol);
+        var response = await loginClient.LoginUser(username, "login_password");
 
         response.ShouldNotBeNull();
         response.UserId.ShouldBeGreaterThan(0);
@@ -196,26 +217,25 @@ public class UsersTests
     }
 
     [Test]
-    [DependsOn(nameof(LoginUser_Should_LoginUser_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeleteUser_Should_DeleteUser_Successfully(Protocol protocol)
     {
-        var userToRemove = await Fixture.Clients[protocol]
-            .CreateUser("user-to-remove".GetWithProtocol(protocol), "test123", UserStatus.Active);
-        userToRemove.ShouldNotBeNull();
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        await Should.NotThrowAsync(Fixture.Clients[protocol]
-            .DeleteUser(Identifier.String(userToRemove.Username)));
+        var username = $"del-{Guid.NewGuid():N}"[..20];
+        var userToRemove = await client.CreateUser(username, "test123", UserStatus.Active);
+        userToRemove.ShouldNotBeNull();
 
+        await Should.NotThrowAsync(client.DeleteUser(Identifier.String(userToRemove.Username)));
     }
 
     [Test]
-    [DependsOn(nameof(DeleteUser_Should_DeleteUser_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task LogoutUser_Should_LogoutUser_Successfully(Protocol protocol)
     {
-        // act & assert
-        await Should.NotThrowAsync(Fixture.Clients[protocol].LogoutUser());
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        await Should.NotThrowAsync(client.LogoutUser());
     }
 
     private static Permissions CreatePermissions()