public async void Serialize_WithParserReturnTrue_ReturnsFormEncodedContent()
        {
            // Arrange
            object value = "value";
            IDictionary <string, string> kv = new Dictionary <string, string> {
                { "Key1", "Value1" }, { "Key2", "Value2" }
            };
            var request    = Substitute.For <IApiCommandRequest>();
            var parser     = Substitute.For <IDefaultFormUrlEncodedContentParser>();
            var mediaTypes = new List <string> {
                "Invalid", "Media", "Types"
            };
            var serializer = new ApiCommandContentSerializerFormUrlEncoded(new[] { parser });

            parser.TryParse(Arg.Any <object>(), out Arg.Any <IEnumerable <KeyValuePair <string, string> > >()).Returns(info => { info[1] = kv; return(true); });

            request.HasContent.Returns(true);
            request.Content.Returns(value);

            // Act
            var result = serializer.Serialize(request);

            // Assert
            Assert.NotNull(result);
            Assert.IsType <FormUrlEncodedContent>(result);
            var encodedResult = (FormUrlEncodedContent)result;
            var content       = await encodedResult.ReadAsStringAsync();

            Assert.Equal("Key1=Value1&Key2=Value2", content);

            parser.Received(1).TryParse(Arg.Any <object>(), out Arg.Any <IEnumerable <KeyValuePair <string, string> > >());

            _ = request.Received(1).HasContent;
            _ = request.Received(1).Content;
        }
        public void Serialize_WithParserReturnfalse_ThrowsException()
        {
            // Arrange
            var request    = Substitute.For <IApiCommandRequest>();
            var parser     = Substitute.For <IDefaultFormUrlEncodedContentParser>();
            var parser2    = Substitute.For <IDefaultFormUrlEncodedContentParser>();
            var mediaTypes = new List <string> {
                "Invalid", "Media", "Types"
            };
            var serializer = new ApiCommandContentSerializerFormUrlEncoded(new[] { parser, parser2 });

            parser.TryParse(Arg.Any <object>(), out Arg.Any <IEnumerable <KeyValuePair <string, string> > >()).Returns(info => false);
            parser2.TryParse(Arg.Any <object>(), out Arg.Any <IEnumerable <KeyValuePair <string, string> > >()).Returns(info => false);

            request.HasContent.Returns(true);
            request.Content.Returns(new object());

            // Act
            Assert.Throws <NotSupportedException>(() => serializer.Serialize(request));

            // Assert
            parser.Received(1).TryParse(Arg.Any <object>(), out Arg.Any <IEnumerable <KeyValuePair <string, string> > >());
            parser2.Received(1).TryParse(Arg.Any <object>(), out Arg.Any <IEnumerable <KeyValuePair <string, string> > >());

            _ = request.Received(1).HasContent;
            _ = request.Received(3).Content;
        }
        public void IsValidFor_WithValidMediaTypes_ReturnsTrue()
        {
            // Arrange
            var mediaTypes = HttpContentType.FormUrlEncoded;
            var serializer = new ApiCommandContentSerializerFormUrlEncoded(Array.Empty <IDefaultFormUrlEncodedContentParser>());

            // Act & Assert
            foreach (var mediaType in mediaTypes)
            {
                Assert.True(serializer.IsValidFor(mediaType));
            }
        }
        public void IsValidFor_WithInvalidMediaTypes_ReturnsFalse()
        {
            // Arrange
            var mediaTypes = new List <string> {
                "Invalid", "Media", "Types"
            };
            var serializer = new ApiCommandContentSerializerFormUrlEncoded(Array.Empty <IDefaultFormUrlEncodedContentParser>());

            // Act & Assert
            foreach (var mediaType in mediaTypes)
            {
                Assert.False(serializer.IsValidFor(mediaType));
            }
        }