public async Task CurrentInfoUri_ShouldReturnExpectedResponse()
        {
            var freezeDateTime = new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc);

            var options = new TemporalOptions();

            using (var server = TestServer.Create(app =>
            {
                app.UseTemporal(options);
            }))
            {
                var response = await server.CreateRequest(options.CurrentInfoUri)
                               .AddHeader("cookie", freezeDateTime.ToString("o"))
                               .GetAsync();

                response.EnsureSuccessStatusCode();

                var responseType = new
                {
                    Now    = new DateTime(),
                    UtcNow = new DateTime()
                };

                var responseObj = JsonConvert.DeserializeAnonymousType(
                    await response.Content.ReadAsStringAsync(),
                    responseType);

                Assert.Equal(freezeDateTime, responseObj.UtcNow);
                Assert.Equal(freezeDateTime.ToLocalTime(), responseObj.Now);
            }
        }
        public async Task FreezeUri_ShouldSetCookie()
        {
            var freezeUtc = "2000-01-01T00:00:00";

            var options = new TemporalOptions();

            using (var server = TestServer.Create(app =>
            {
                app.UseTemporal(options);
            }))
            {
                var content = new FormUrlEncodedContent(new Dictionary <string, string>()
                {
                    { "utc", freezeUtc }
                });
                var response = await server.HttpClient.PostAsync(options.FreezeUri, content);

                response.EnsureSuccessStatusCode();

                var setCookieHeaderValue = response.Headers
                                           .Single(x => x.Key == "Set-Cookie").Value.Single();
                var expectedStartsWith = CookieTimeProvider.CookieName +
                                         $"={HttpUtility.UrlEncode(freezeUtc + ".0000000").ToUpper()}";

                Assert.True(setCookieHeaderValue.StartsWith(expectedStartsWith),
                            $"Expected\n{setCookieHeaderValue}\nto start with\n{expectedStartsWith}");
            }
        }
        public async Task FreezeUri_ShouldReturnMethodNotAllowedForGet()
        {
            var options = new TemporalOptions();

            using (var server = TestServer.Create(app =>
            {
                app.UseTemporal(options);
            }))
            {
                var response = await server.HttpClient.GetAsync(options.FreezeUri);

                Assert.Equal(HttpStatusCode.MethodNotAllowed, response.StatusCode);
            }
        }
        public async Task FreezeUri_ShouldReturnBadRequestWhenMissingQueryStringParameter()
        {
            var options = new TemporalOptions();

            using (var server = TestServer.Create(app =>
            {
                app.UseTemporal(options);
            }))
            {
                var content  = new StringContent("");
                var response = await server.HttpClient.PostAsync(options.FreezeUri, content);

                Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
            }
        }
        public async Task UnfreezeUri_ShouldRemoveCookie()
        {
            var options = new TemporalOptions();

            using (var server = TestServer.Create(app =>
            {
                app.UseTemporal(options);
            }))
            {
                var content  = new StringContent("");
                var response = await server.HttpClient.PostAsync(options.UnfreezeUri, content);

                response.EnsureSuccessStatusCode();

                var setCookieHeaderValue = response.Headers
                                           .Single(x => x.Key == "Set-Cookie").Value.Single();

                Assert.Equal(
                    $"{CookieTimeProvider.CookieName}=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT",
                    setCookieHeaderValue);
            }
        }