public async Task RoundTrip_Success()
        {
            var logger = new Mock <ILogger <AssetResponseStore> >();
            var env    = new Mock <IWebHostEnvironment>().SetupAllProperties();

            env.Setup(e => e.ContentRootPath).Returns(Environment.CurrentDirectory);
            string path     = Path.Combine(Environment.CurrentDirectory, "WebOptimizerTest");
            string filePath = Path.Combine(path, "bucket__cachekey.cache");

            var woo = new Mock <IConfigureOptions <WebOptimizerOptions> >();

            woo.Setup(o => o.Configure(It.IsAny <WebOptimizerOptions>()))
            .Callback <WebOptimizerOptions>(o => o.CacheDirectory = path);

            byte[] body   = "*{color:red}".AsByteArray();
            var    before = new AssetResponse(body, "cachekey");
            //var outJson1 = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes<AssetResponse>(before);
            //var outJson2 = System.Text.Json.JsonSerializer.Serialize<AssetResponse>(before);
            IAssetResponseStore ars = new AssetResponseStore(logger.Object, env.Object, woo.Object);

            await ars.AddAsync("bucket", "cachekey", before).ConfigureAwait(false);

            Assert.True(File.Exists(filePath));

            Assert.True(ars.TryGet("bucket", "cachekey", out var after));
            Assert.Equal(before.CacheKey, after.CacheKey);
            Assert.Equal(before.Body, after.Body);

            await ars.RemoveAsync("bucket", "cachekey").ConfigureAwait(false);

            Assert.False(File.Exists(filePath));
        }
        public void Should_Serialize_Deserialize_AssetResponse_With_Headers()
        {
            string        cacheKey = "cachekey";
            string        body     = "*{color:red}";
            AssetResponse arBase   = new AssetResponse(body.AsByteArray(), cacheKey);
            string        key1     = "api-version";
            string        value1   = "3.0";

            arBase.Headers.Add(key1, value1);
            string key2   = "content-type";
            string value2 = "application/json";

            arBase.Headers.Add(key2, value2);
            //string json = "{\"Headers\":{\"api-version\":\"3.0\",\"content-type\":\"application/json\"},\"Body\":\"Kntjb2xvcjpyZWR9\",\"CacheKey\":\"cachekey\"}";
            var    logger   = new Mock <ILogger <AssetResponseStore> >();
            var    env      = new Mock <IWebHostEnvironment>().SetupAllProperties();
            string path     = Path.Combine(Environment.CurrentDirectory, "WebOptimizerTest");
            string filePath = Path.Combine(path, "bucket__cachekey.cache");

            var woo = new Mock <IConfigureOptions <WebOptimizerOptions> >();

            woo.Setup(o => o.Configure(It.IsAny <WebOptimizerOptions>()))
            .Callback <WebOptimizerOptions>(o => o.CacheDirectory = path);

            AssetResponse ar = new AssetResponseStore(logger.Object, env.Object, woo.Object).ParseJson(JsonSerializer.Serialize(arBase));

            //using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(arBase)))
            //{
            //    var ck = document.RootElement.GetProperty("CacheKey").GetString();
            //    var b = document.RootElement.GetProperty("Body").GetString();
            //    var bytes = JsonSerializer.Deserialize<byte[]>("\"" + b + "\"");
            //    ar = new AssetResponse(bytes,ck);
            //    var headersString = document.RootElement.GetProperty("Headers").GetRawText();
            //    if (!string.IsNullOrEmpty(headersString))
            //    {
            //        var headers = JsonSerializer.Deserialize<Dictionary<string, string>>(headersString);
            //        foreach (var d in headers)
            //        {
            //            ar.Headers.Add(d.Key, d.Value);
            //        }
            //    }
            //}

            Assert.Equal(cacheKey, ar.CacheKey);
            Assert.Equal(body.AsByteArray(), ar.Body);
            Assert.Equal(body, Encoding.ASCII.GetString(ar.Body));
            Assert.Equal(arBase.Headers.Count, ar.Headers.Count);
            Assert.True(ar.Headers.ContainsKey(key1));
            Assert.Equal(arBase.Headers[key1], ar.Headers[key1]);
            Assert.True(ar.Headers.ContainsKey(key2));
            Assert.Equal(arBase.Headers[key2], ar.Headers[key2]);
        }
        public void Should_Serialize_Deserialize_AssetResponse_Without_Headers()
        {
            string        cacheKey = "cachekey";
            string        body     = "*{color:red}";
            AssetResponse arBase   = new AssetResponse(body.AsByteArray(), cacheKey);
            var           logger   = new Mock <ILogger <AssetResponseStore> >();
            var           env      = new Mock <IWebHostEnvironment>().SetupAllProperties();
            string        path     = Path.Combine(Environment.CurrentDirectory, "WebOptimizerTest");
            string        filePath = Path.Combine(path, "bucket__cachekey.cache");

            var woo = new Mock <IConfigureOptions <WebOptimizerOptions> >();

            woo.Setup(o => o.Configure(It.IsAny <WebOptimizerOptions>()))
            .Callback <WebOptimizerOptions>(o => o.CacheDirectory = path);
            AssetResponse ar = new AssetResponseStore(logger.Object, env.Object, woo.Object).ParseJson(JsonSerializer.Serialize(arBase));

            Assert.Equal(cacheKey, ar.CacheKey);
            Assert.Equal(body.AsByteArray(), ar.Body);
            Assert.Equal(body, Encoding.ASCII.GetString(ar.Body));
            Assert.Equal(arBase.Headers.Count, ar.Headers.Count);
        }