public async Task CanPatchUpdatePackageAddFile()
        {
            await TestUtils.Auth(_client);

            var patchDoc = new JsonPatchDocument <UpdatePackageDto>();

            patchDoc.Add(x => x.Files, new UpdateFileDto {
                Path = "/new-file.txt", Hash = "936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af"
            });

            // act
            var response = await _client.PatchAsync("/api/v1/projects/1/updates/2.0.0", patchDoc.AsJson());

            // assert
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);

            var package = await FetchUpdatePackage(1, "2.0.0");

            Assert.Collection(package.Files.OrderBy(x => x.Path),
                              x =>
            {
                Assert.Equal("/new-file.txt", x.Path);
                Assert.Equal("936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af", x.Hash);
                Assert.NotNull(x.Signature);
            },
                              x => Assert.Equal("/test.txt", x.Path));
        }
        public async Task CanPatchUpdatePackagePublish()
        {
            await TestUtils.Auth(_client);

            var publishDate = DateTimeOffset.UtcNow.AddHours(-1);
            var patchDoc    = new JsonPatchDocument <UpdatePackageDto>();

            patchDoc.Add(x => x.Distribution, new UpdatePackageDistributionInfo("team", publishDate));

            // act
            var response = await _client.PatchAsync("/api/v1/projects/1/updates/2.0.0", patchDoc.AsJson());

            // assert
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);

            var package = await FetchUpdatePackage(1, "2.0.0");

            var dist = Assert.Single(package.Distribution);

            Assert.Equal("team", dist.Name);
            Assert.Equal(publishDate, dist.PublishDate);
        }
        public async Task CanPatchUpdatePackageRemoveChangelog()
        {
            await TestUtils.Auth(_client);

            var patchDoc = new JsonPatchDocument <UpdatePackageDto>();

            patchDoc.Remove(x => x.Changelogs[0]);

            // act
            var response = await _client.PatchAsync("/api/v1/projects/1/updates/2.0.0", patchDoc.AsJson());

            // assert
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);

            var package = await FetchUpdatePackage(1, "2.0.0");

            Assert.Empty(package.Changelogs);
        }
        public async Task CanPatchUpdatePackageChangelog()
        {
            await TestUtils.Auth(_client);

            var patchDoc = new JsonPatchDocument <UpdatePackageDto>();

            patchDoc.Replace(x => x.Changelogs[0], new UpdateChangelogInfo("de-de", "Hello World 2.0"));

            // act
            var response = await _client.PatchAsync("/api/v1/projects/1/updates/3.0.0", patchDoc.AsJson());

            // assert
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);

            var package = await FetchUpdatePackage(1, "3.0.0");

            Assert.Equal("Hello World 2.0", package.Changelogs[0].Content);
        }
        public async Task CanPatchUpdatePackageDescription()
        {
            await TestUtils.Auth(_client);

            var patchDoc = new JsonPatchDocument <UpdatePackageDto>();

            patchDoc.Replace(x => x.Description, "New Description");

            var response = await _client.PatchAsync("/api/v1/projects/1/updates/1.5.0", patchDoc.AsJson());

            Assert.Equal(HttpStatusCode.OK, response.StatusCode);

            var package = await FetchUpdatePackage(1, "1.5.0");

            Assert.Equal("New Description", package.Description);
        }
        public async Task CantPatchUpdateUnauthenticated()
        {
            var patchDoc = new JsonPatchDocument <UpdatePackageDto>();

            patchDoc.Replace(x => x.Description, "New Description");

            var response = await _client.PatchAsync("/api/v1/projects/1/updates/1.5.0", patchDoc.AsJson());

            var asd = await response.Content.ReadAsStringAsync();

            Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode);
        }