public void TcpContracts_CreateUser_WithPermission_HasCorrectBytes()

in foreign/csharp/Iggy_SDK_Tests/ContractTests/TcpContract.cs [341:435]


    public void TcpContracts_CreateUser_WithPermission_HasCorrectBytes()
    {
        // Arrange
        var request = new CreateUserRequest
        {
            Username = "testuser",
            Password = "testpassword",
            Status = UserStatus.Active,
            Permissions = PermissionsFactory.CreatePermissions(),
        };
        // Act
        var result = TcpContracts.CreateUser(request);

        // Assert
        int position = 0;

        Assert.Equal((byte)request.Username.Length, result[position]);
        position += 1;

        var usernameBytes = result[position..(position + request.Username.Length)];
        position += request.Username.Length;
        var decodedUsername = Encoding.UTF8.GetString(usernameBytes);
        Assert.Equal(request.Username, decodedUsername);

        Assert.Equal((byte)request.Password.Length, result[position]);
        position += 1;

        var passwordBytes = result[position..(position + request.Password.Length)];
        position += request.Password.Length;
        var decodedPassword = Encoding.UTF8.GetString(passwordBytes);
        Assert.Equal(request.Password, decodedPassword);

        var expectedStatusByte = request.Status switch
        {
            UserStatus.Active => (byte)1,
            UserStatus.Inactive => (byte)2,
            _ => throw new ArgumentOutOfRangeException()
        };
        Assert.Equal(expectedStatusByte, result[position]);
        position += 1;

        var permissionsFlag = result[position];
        position += 1;
        if (permissionsFlag == 1)
        {
            var permissionsSize = BinaryPrimitives.ReadInt32LittleEndian(result[position..(position + 4)]);
            position += 4;

            var permissionsBytes = result[position..(position + permissionsSize)];
            var mappedPermissions = PermissionsFactory.PermissionsFromBytes(permissionsBytes);
            request.Permissions.Global.Should().BeEquivalentTo(mappedPermissions.Global);

            if (request.Permissions.Streams != null)
            {
                Assert.NotNull(mappedPermissions.Streams);

                foreach (var (streamId, stream) in request.Permissions.Streams)
                {
                    Assert.True(mappedPermissions.Streams.ContainsKey(streamId));
                    var mappedStream = mappedPermissions.Streams[streamId];

                    Assert.Equal(stream.ManageStream, mappedStream.ManageStream);
                    Assert.Equal(stream.ReadStream, mappedStream.ReadStream);
                    Assert.Equal(stream.ManageTopics, mappedStream.ManageTopics);
                    Assert.Equal(stream.ReadTopics, mappedStream.ReadTopics);
                    Assert.Equal(stream.PollMessages, mappedStream.PollMessages);
                    Assert.Equal(stream.SendMessages, mappedStream.SendMessages);

                    if (stream.Topics != null)
                    {
                        Assert.NotNull(mappedStream.Topics);

                        foreach (var (topicId, topic) in stream.Topics)
                        {
                            Assert.True(mappedStream.Topics.ContainsKey(topicId));
                            var mappedTopic = mappedStream.Topics[topicId];

                            Assert.Equal(topic.ManageTopic, mappedTopic.ManageTopic);
                            Assert.Equal(topic.ReadTopic, mappedTopic.ReadTopic);
                            Assert.Equal(topic.PollMessages, mappedTopic.PollMessages);
                            Assert.Equal(topic.SendMessages, mappedTopic.SendMessages);
                        }
                    }
                    else
                    {
                        Assert.Null(mappedStream.Topics);
                    }
                }
            }
            else
            {
                Assert.Null(request.Permissions);
            }
        }
    }