public async Task PublishImageInfoCommand_ReplaceContent() { using (TempFolderContext tempFolderContext = TestHelper.UseTempFolder()) { string repo1Image1DockerfilePath = DockerfileHelper.CreateDockerfile("1.0/runtime/os", tempFolderContext); string repo2Image2DockerfilePath = DockerfileHelper.CreateDockerfile("2.0/runtime/os", tempFolderContext); Manifest manifest = CreateManifest( CreateRepo("repo1", CreateImage( new Platform[] { CreatePlatform(repo1Image1DockerfilePath, new string[] { "tag1" }) }, productVersion: "1.0")), CreateRepo("repo2", CreateImage( new Platform[] { CreatePlatform(repo2Image2DockerfilePath, new string[] { "tag1" }) }, productVersion: "2.0")) ); RepoData repo2; ImageArtifactDetails srcImageArtifactDetails = new ImageArtifactDetails { Repos = { new RepoData { Repo = "repo1", Images = { new ImageData { Platforms = { Helpers.ImageInfoHelper.CreatePlatform(repo1Image1DockerfilePath, simpleTags: new List <string> { "newtag" }) }, ProductVersion = "1.0", Manifest = new ManifestData { SyndicatedDigests = new List <string> { "newdigest1", "newdigest2" } } } } }, { repo2 = new RepoData { Repo = "repo2", Images = { new ImageData { Platforms = { Helpers.ImageInfoHelper.CreatePlatform(repo2Image2DockerfilePath, simpleTags: new List <string> { "tag1" }) }, ProductVersion = "2.0" } } } } } }; string file = Path.Combine(tempFolderContext.Path, "image-info.json"); File.WriteAllText(file, JsonHelper.SerializeObject(srcImageArtifactDetails)); ImageArtifactDetails targetImageArtifactDetails = new ImageArtifactDetails { Repos = { new RepoData { Repo = "repo1", Images = { new ImageData { Platforms = { Helpers.ImageInfoHelper.CreatePlatform(repo1Image1DockerfilePath, simpleTags: new List <string> { "oldtag" }) }, ProductVersion = "1.0", Manifest = new ManifestData { SyndicatedDigests = new List <string> { "olddigest1", "olddigest2" } } } } } } }; GitOptions gitOptions = new GitOptions { AuthToken = "token", Repo = "PublishImageInfoCommand_ReplaceContent", Branch = "testBranch", Path = "imageinfo.json", Email = "*****@*****.**", Username = "******" }; AzdoOptions azdoOptions = new AzdoOptions { AccessToken = "azdo-token", AzdoBranch = "testBranch", AzdoRepo = "testRepo", Organization = "azdo-org", Project = "azdo-project", AzdoPath = "imageinfo.json" }; Mock <IRepository> repositoryMock = GetRepositoryMock(); Mock <IGitService> gitServiceMock = GetGitServiceMock(repositoryMock.Object, gitOptions.Path, targetImageArtifactDetails); string actualImageArtifactDetailsContents = null; gitServiceMock .Setup(o => o.Stage(It.IsAny <IRepository>(), It.IsAny <string>())) .Callback((IRepository repo, string path) => { actualImageArtifactDetailsContents = File.ReadAllText(path); }); PublishImageInfoCommand command = new PublishImageInfoCommand(gitServiceMock.Object, Mock.Of <ILoggerService>()); command.Options.ImageInfoPath = file; command.Options.GitOptions = gitOptions; command.Options.Manifest = Path.Combine(tempFolderContext.Path, "manifest.json"); File.WriteAllText(Path.Combine(tempFolderContext.Path, command.Options.Manifest), JsonConvert.SerializeObject(manifest)); command.LoadManifest(); await command.ExecuteAsync(); ImageArtifactDetails expectedImageArtifactDetails = new ImageArtifactDetails { Repos = { new RepoData { Repo = "repo1", Images = { new ImageData { Platforms = { Helpers.ImageInfoHelper.CreatePlatform(repo1Image1DockerfilePath, simpleTags: new List <string> { "newtag" }) }, ProductVersion = "1.0", Manifest = new ManifestData { SyndicatedDigests = new List <string> { "newdigest1", "newdigest2" } } } } }, repo2 } }; Assert.Equal(JsonHelper.SerializeObject(expectedImageArtifactDetails), actualImageArtifactDetailsContents.Trim()); VerifyMocks(repositoryMock); } }
public async Task PublishImageInfoCommand_RemoveOutOfDateContent() { using (TempFolderContext tempFolderContext = TestHelper.UseTempFolder()) { string repo1Image1DockerfilePath = DockerfileHelper.CreateDockerfile("1.0/runtime/os", tempFolderContext); string repo2Image2DockerfilePath = DockerfileHelper.CreateDockerfile("2.0/runtime/os", tempFolderContext); Manifest manifest = CreateManifest( CreateRepo("repo1", CreateImage( new Platform[] { CreatePlatform(repo1Image1DockerfilePath, new string[0]) }, productVersion: "1.0")), CreateRepo("repo2", CreateImage( new Platform[] { CreatePlatform(repo2Image2DockerfilePath, new string[0]) }, productVersion: "2.0")) ); manifest.Registry = "mcr.microsoft.com"; RepoData repo2; ImageArtifactDetails srcImageArtifactDetails = new ImageArtifactDetails { Repos = { new RepoData { Repo = "repo1", Images = { new ImageData { Platforms = { Helpers.ImageInfoHelper.CreatePlatform(repo1Image1DockerfilePath) }, ProductVersion = "1.0" } } }, { repo2 = new RepoData { Repo = "repo2", Images = { new ImageData { Platforms = { Helpers.ImageInfoHelper.CreatePlatform(repo2Image2DockerfilePath) }, ProductVersion = "2.0" } } } } } }; string file = Path.Combine(tempFolderContext.Path, "image-info.json"); File.WriteAllText(file, JsonHelper.SerializeObject(srcImageArtifactDetails)); ImageArtifactDetails targetImageArtifactDetails = new ImageArtifactDetails { Repos = { new RepoData { Repo = "repo1", Images = { new ImageData { Platforms = { Helpers.ImageInfoHelper.CreatePlatform(repo1Image1DockerfilePath) }, ProductVersion = "1.0" }, new ImageData { Platforms = { Helpers.ImageInfoHelper.CreatePlatform( DockerfileHelper.CreateDockerfile("1.0/runtime2/os", tempFolderContext)) }, ProductVersion = "1.0" } } }, new RepoData { Repo = "repo4" } } }; GitOptions gitOptions = new GitOptions { AuthToken = "token", Repo = "repo", Owner = "owner", Path = "imageinfo.json", Branch = "branch", Email = "*****@*****.**", Username = "******" }; AzdoOptions azdoOptions = new AzdoOptions { AccessToken = "azdo-token", Branch = "testBranch", Repo = "testRepo", Organization = "azdo-org", Project = "azdo-project", Path = "imageinfo.json" }; Mock <IRepository> repositoryMock = GetRepositoryMock(); Mock <IGitService> gitServiceMock = GetGitServiceMock(repositoryMock.Object, gitOptions.Path, targetImageArtifactDetails); PublishImageInfoCommand command = new PublishImageInfoCommand(gitServiceMock.Object, Mock.Of <ILoggerService>()); command.Options.ImageInfoPath = file; command.Options.GitOptions = gitOptions; command.Options.AzdoOptions = azdoOptions; command.Options.Manifest = Path.Combine(tempFolderContext.Path, "manifest.json"); File.WriteAllText(Path.Combine(tempFolderContext.Path, command.Options.Manifest), JsonConvert.SerializeObject(manifest)); command.LoadManifest(); await command.ExecuteAsync(); ImageArtifactDetails expectedImageArtifactDetails = new ImageArtifactDetails { Repos = { new RepoData { Repo = "repo1", Images = { new ImageData { Platforms = { Helpers.ImageInfoHelper.CreatePlatform(repo1Image1DockerfilePath) }, ProductVersion = "1.0" } } }, repo2 } }; VerifyMocks(repositoryMock); } }