Пример #1
0
        public static async Task RegisteredType_AdditionalLink(
            Guid id,
            Guid parentId,
            UnequalNonNullPair <NonEmptyString> routes,
            JsonSerializerSettings serializerSettings)
        {
            if (serializerSettings is null)
            {
                throw new ArgumentNullException(nameof(serializerSettings));
            }

            var dto = new Registered
            {
                Id       = id,
                ParentId = parentId,
            };

            var(route, parentRoute) = routes;
            var builder = new TransformationMap.Builder <Registered>(r => Const(new Uri($"https://example.invalid/registered/{r.Id}")));
            ITransformationMap <Registered> transformationMap = builder;

            _ = transformationMap.Link("up", r => Const(new Uri($"https://example.invalid/parent/{r.ParentId}")));
            var map = new Dictionary <Type, ITransformationInstructions>
            {
                [typeof(Registered)] = builder,
            };

            await using var serviceProvider = new ServiceCollection()
                                              .AddScoped <ILinkBuilder <Constant>, LinkBuilder.Constant>()
                                              .BuildServiceProvider();
            var repo = new HalRepository(map, serviceProvider);

            serializerSettings.Converters.Add(new LinkCollection.Converter());
            var sut = new HalJsonOutputFormatter(serializerSettings, ArrayPool <char> .Shared, new MvcOptions(), repo);

            using var writer = new StringWriter();
            var context = new OutputFormatterWriteContext(
                new DefaultHttpContext(),
                (_, _) => writer,
                typeof(Registered),
                dto);

            await sut.WriteResponseBodyAsync(context, new UTF8Encoding(encoderShouldEmitUTF8Identifier : false)).ConfigureAwait(false);

            var actual = JsonConvert.DeserializeObject <HollowHal>(writer.ToString(), serializerSettings);

            Assert.NotNull(actual);
            Assert.Empty(actual.Embedded);
            Assert.NotNull(actual.Links);
            Assert.Equal(2, actual.Links.Count);
            var self = Assert.Contains("self", actual.Links);

            Assert.NotNull(self);
            Assert.Equal($"https://example.invalid/registered/{id}", self.Href);
            var parent = Assert.Contains("up", actual.Links);

            Assert.NotNull(parent);
            Assert.Equal($"https://example.invalid/parent/{parentId}", parent.Href);
        }
Пример #2
0
        public static void UnregisteredType_CannotWriteResult(JsonSerializerSettings serializerSettings)
        {
            var repo    = new HalRepository(ImmutableDictionary <Type, ITransformationInstructions> .Empty, new ServiceCollection().BuildServiceProvider());
            var sut     = new HalJsonOutputFormatter(serializerSettings, ArrayPool <char> .Shared, new MvcOptions(), repo);
            var context = new OutputFormatterWriteContext(new DefaultHttpContext(), (_, _) => new StreamWriter(Stream.Null), typeof(Unregistered), new Unregistered());

            Assert.False(sut.CanWriteResult(context));
        }
Пример #3
0
        public static void RegisteredType_CanWriteResult(JsonSerializerSettings serializerSettings)
        {
            var map = new Dictionary <Type, ITransformationInstructions>
            {
                [typeof(Registered)] = new TransformationMap.Builder <Registered>(_ => Const(new Uri("about:blank", Absolute))),
            };
            var repo    = new HalRepository(map, new ServiceCollection().BuildServiceProvider());
            var sut     = new HalJsonOutputFormatter(serializerSettings, ArrayPool <char> .Shared, new MvcOptions(), repo);
            var context = new OutputFormatterWriteContext(new DefaultHttpContext(), (_, _) => new StreamWriter(Stream.Null), typeof(Registered), new Registered());

            Assert.True(sut.CanWriteResult(context));
        }
Пример #4
0
        // This method gets called by a runtime.
        // Use this method to add services to the container
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().Configure<MvcOptions>(options =>
            {
                //options.OutputFormatters.Clear();

                var halJsonFormatter = new HalJsonOutputFormatter();

                options.OutputFormatters.Insert(0, halJsonFormatter);
            });
            // Uncomment the following line to add Web API services which makes it easier to port Web API 2 controllers.
            // You will also need to add the Microsoft.AspNet.Mvc.WebApiCompatShim package to the 'dependencies' section of project.json.
            // services.AddWebApiConventions();
        }
        public static async Task RegisteredType_NullLink(
            Guid id,
            Guid parentId,
            UnequalNonNullPair <NonEmptyString> routes,
            JsonSerializerSettings serializerSettings)
        {
            // arrange
            var dto = new Registered
            {
                Id       = id,
                ParentId = parentId
            };

            var(route, parentRoute) = routes;
            var builder = new TransformationMap.Builder <Registered>(r => Const(new Uri($"https://example.invalid/registered/{r.Id}")));
            ITransformationMap <Registered> transformationMap = builder;

            transformationMap.Link("up", _ => (ILinkData)null);
            var map = new Dictionary <Type, ITransformationInstructions>
            {
                [typeof(Registered)] = builder
            };
            var serviceProvider = new ServiceCollection()
                                  .AddScoped <ILinkBuilder <Constant>, LinkBuilder.Constant>()
                                  .BuildServiceProvider();
            var repo = new HalRepository(map, serviceProvider);

            serializerSettings.Converters.Add(new LinkCollection.Converter());
            var sut     = new HalJsonOutputFormatter(serializerSettings, ArrayPool <char> .Shared, repo);
            var writer  = new StringWriter();
            var context = new OutputFormatterWriteContext(
                new DefaultHttpContext(),
                (_, __) => writer,
                typeof(Registered),
                dto);

            // act
            await sut.WriteResponseBodyAsync(context, new UTF8Encoding(encoderShouldEmitUTF8Identifier : false)).ConfigureAwait(false);

            var actual = JsonConvert.DeserializeObject <HollowHal>(writer.ToString(), serializerSettings);

            // assert
            Assert.NotNull(actual);
            Assert.Empty(actual.Embedded);
            Assert.NotNull(actual.Links);
            var(rel, link) = Assert.Single(actual.Links);
            Assert.Equal("self", rel);
            Assert.Equal($"https://example.invalid/registered/{id}", link.Href);
        }
        public async Task UsesResourceJsonConverter()
        {
            var formatter = new HalJsonOutputFormatter(
                new JsonSerializerSettings(),
                ArrayPool <char> .Shared,
                new HalOptions());

            using (var body = new MemoryStream())
            {
                var resource = new Resource <TestResource>
                {
                    Data = new TestResource
                    {
                        Content = "HAL-lo there"
                    }
                };

                var serviceProvider = new Mock <IServiceProvider>();
                serviceProvider.Setup(p => p.GetService(typeof(ILogger <HalJsonOutputFormatter>)))
                .Returns(new NullLogger <HalJsonOutputFormatter>());

                var response = new Mock <HttpResponse>();
                response.SetupGet(r => r.Body).Returns(body);
                var httpContext = new Mock <HttpContext>();
                httpContext.SetupGet(c => c.Response).Returns(response.Object);
                httpContext.SetupGet(c => c.RequestServices).Returns(serviceProvider.Object);

                var writeContext = new OutputFormatterWriteContext(
                    httpContext.Object,
                    (s, e) => new StreamWriter(s, e, 4096, true),
                    resource.GetType(),
                    resource);

                await formatter.WriteResponseBodyAsync(writeContext, Encoding.UTF8);

                string expected = "{\"Content\":\"HAL-lo there\"}";

                body.Seek(0, SeekOrigin.Begin);
                string actual = null;
                using (var reader = new StreamReader(body))
                {
                    actual = reader.ReadToEnd();
                }

                Assert.AreEqual(expected, actual);
            }
        }
        public static async Task RegisteredType_SelfLink(Guid id, JsonSerializerSettings serializerSettings)
        {
            // arrange
            var dto = new Registered
            {
                Id = id
            };
            var map = new Dictionary <Type, ITransformationInstructions>
            {
                [typeof(Registered)] = new TransformationMap.Builder <Registered>(
                    r => Const(new Uri($"https://example.invalid/registered/{r.Id}")))
            };
            var serviceProvider = new ServiceCollection()
                                  .AddScoped <ILinkBuilder <Constant>, LinkBuilder.Constant>()
                                  .BuildServiceProvider();
            var repo = new HalRepository(map, serviceProvider);

            serializerSettings.Converters.Add(new LinkCollection.Converter());
            var sut     = new HalJsonOutputFormatter(serializerSettings, ArrayPool <char> .Shared, repo);
            var writer  = new StringWriter();
            var context = new OutputFormatterWriteContext(
                new DefaultHttpContext(),
                (_, __) => writer,
                typeof(Registered),
                dto);

            // act
            await sut.WriteResponseBodyAsync(context, new UTF8Encoding(encoderShouldEmitUTF8Identifier : false)).ConfigureAwait(false);

            var actual = JsonConvert.DeserializeObject <HollowHal>(writer.ToString(), serializerSettings);

            // assert
            Assert.NotNull(actual);
            Assert.Empty(actual.Embedded);
            Assert.NotNull(actual.Links);
            Assert.Equal(1, actual.Links.Count);
            var self = Assert.Contains(Relations.Self, actual.Links);

            Assert.NotNull(self);
            Assert.Equal($"https://example.invalid/registered/{id}", self.Href);
        }
        public void CanConvertAnyType(
            [Values(
                 typeof(object),
                 typeof(IResource),
                 typeof(Resource),
                 typeof(Resource <object>),
                 typeof(List <object>))] Type type)
        {
            var formatter = new HalJsonOutputFormatter(
                new JsonSerializerSettings(),
                ArrayPool <char> .Shared,
                new HalOptions());

            var writeContext = new OutputFormatterWriteContext(
                new DefaultHttpContext(),
                (s, e) => null,
                type,
                null);

            bool canWrite = formatter.CanWriteResult(writeContext);

            Assert.IsTrue(canWrite);
        }
Пример #9
0
        public static async Task UnregisteredType_NotModified(Guid id, JsonSerializerSettings serializerSettings)
        {
            var dto = new Unregistered
            {
                Id = id,
            };

            using var svc = new ServiceContainer();
            var repo = new HalRepository(ImmutableDictionary <Type, ITransformationInstructions> .Empty, svc);
            var sut  = new HalJsonOutputFormatter(serializerSettings, ArrayPool <char> .Shared, new MvcOptions(), repo);

            await using var writer = new StringWriter();
            var context = new OutputFormatterWriteContext(
                new DefaultHttpContext(),
                (_, _) => writer,
                typeof(Unregistered),
                dto);

            await sut.WriteResponseBodyAsync(context, new UTF8Encoding(encoderShouldEmitUTF8Identifier : false)).ConfigureAwait(false);

            var actual = JsonConvert.DeserializeObject <Unregistered>(writer.ToString(), serializerSettings);

            Assert.Equal(id, actual.Id);
        }