public async Task PublishImageInfoCommand_ReplaceTags() { 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( CreatePlatform(repo1Image1DockerfilePath, new string[0]))), CreateRepo("repo2", CreateImage( CreatePlatform(repo2Image2DockerfilePath, new string[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" }) } } } }, { repo2 = new RepoData { Repo = "repo2", Images = { new ImageData { Platforms = { Helpers.ImageInfoHelper.CreatePlatform(repo2Image2DockerfilePath, simpleTags: new List <string> { "tag1" }) } } } } } } }; 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" }) } } } } } }; Mock <IGitHubClient> gitHubClientMock = GetGitHubClientMock(); Mock <IGitHubClientFactory> gitHubClientFactoryMock = new Mock <IGitHubClientFactory>(); gitHubClientFactoryMock .Setup(o => o.GetClient(It.IsAny <GitHubAuth>(), false)) .Returns(gitHubClientMock.Object); GitOptions gitOptions = new GitOptions { AuthToken = "token", Repo = "testRepo", Branch = "testBranch", Path = "imageinfo.json" }; PublishImageInfoCommand command = new PublishImageInfoCommand( gitHubClientFactoryMock.Object, Mock.Of <ILoggerService>(), CreateHttpClientFactory(gitOptions, targetImageArtifactDetails)); 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" }) } } } }, repo2 } }; Func <GitObject[], bool> verifyGitObjects = (gitObjects) => { if (gitObjects.Length != 1) { return(false); } return(gitObjects[0].Content.Trim() == JsonHelper.SerializeObject(expectedImageArtifactDetails).Trim()); }; gitHubClientMock.Verify( o => o.PostTreeAsync(It.IsAny <GitHubProject>(), It.IsAny <string>(), It.Is <GitObject[]>(gitObjects => verifyGitObjects(gitObjects)))); } }
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_ReplaceTags() { using (TempFolderContext tempFolderContext = TestHelper.UseTempFolder()) { RepoData repo2; RepoData[] sourceRepos = new RepoData[] { new RepoData { Repo = "repo1", Images = new SortedDictionary <string, ImageData> { { "image1", new ImageData { SimpleTags = { "newtag" } } } } }, repo2 = new RepoData { Repo = "repo2", Images = new SortedDictionary <string, ImageData> { { "image2", new ImageData { SimpleTags = { "tag1" } } } } } }; string file = Path.Combine(tempFolderContext.Path, "image-info.json"); File.WriteAllText(file, JsonHelper.SerializeObject(sourceRepos)); RepoData[] targetRepos = new RepoData[] { new RepoData { Repo = "repo1", Images = new SortedDictionary <string, ImageData> { { "image1", new ImageData { SimpleTags = { "oldtag" } } } } } }; Mock <IGitHubClient> gitHubClientMock = GetGitHubClientMock(targetRepos); Mock <IGitHubClientFactory> gitHubClientFactoryMock = new Mock <IGitHubClientFactory>(); gitHubClientFactoryMock .Setup(o => o.GetClient(It.IsAny <GitHubAuth>(), false)) .Returns(gitHubClientMock.Object); PublishImageInfoCommand command = new PublishImageInfoCommand(gitHubClientFactoryMock.Object); command.Options.ImageInfoPath = file; command.Options.GitOptions.AuthToken = "token"; await command.ExecuteAsync(); RepoData[] expectedRepos = new RepoData[] { new RepoData { Repo = "repo1", Images = new SortedDictionary <string, ImageData> { { "image1", new ImageData { SimpleTags = { "newtag" } } } } }, repo2 }; Func <GitObject[], bool> verifyGitObjects = (gitObjects) => { if (gitObjects.Length != 1) { return(false); } return(gitObjects[0].Content.Trim() == JsonHelper.SerializeObject(expectedRepos).Trim()); }; gitHubClientMock.Verify( o => o.PostTreeAsync(It.IsAny <GitHubProject>(), It.IsAny <string>(), It.Is <GitObject[]>(gitObjects => verifyGitObjects(gitObjects)))); } }
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); } }