diff options
| author | Kevin J Hoerr <kjhoerr@protonmail.com> | 2022-04-07 00:04:17 +0000 |
|---|---|---|
| committer | Kevin J Hoerr <kjhoerr@protonmail.com> | 2022-04-07 00:04:17 +0000 |
| commit | 47f6bb3a5b5fade8f96d3d2c541b304cc118e756 (patch) | |
| tree | 739635857d3ef6900931d7b12b70df1c421fe6f8 | |
| parent | a1cdb85c03f8ef630c1fe08ea3b4af36c084f723 (diff) | |
| download | ao-coverage-47f6bb3a5b5fade8f96d3d2c541b304cc118e756.tar.gz ao-coverage-47f6bb3a5b5fade8f96d3d2c541b304cc118e756.tar.bz2 ao-coverage-47f6bb3a5b5fade8f96d3d2c541b304cc118e756.zip | |
#18 Add unit tests for Metadata
| -rw-r--r-- | package.json | 3 | ||||
| -rw-r--r-- | src/metadata.test.ts | 439 |
2 files changed, 440 insertions, 2 deletions
diff --git a/package.json b/package.json index 9396ea3..f2bf6e6 100644 --- a/package.json +++ b/package.json @@ -68,8 +68,7 @@ "src/**/*.ts", "!src/**/*.test.ts", "!src/**/__tests__/**/*.ts", - "!src/index.ts", - "!src/metadata.ts" + "!src/index.ts" ], "roots": [ "src/" diff --git a/src/metadata.test.ts b/src/metadata.test.ts new file mode 100644 index 0000000..439bf7e --- /dev/null +++ b/src/metadata.test.ts @@ -0,0 +1,439 @@ +import Metadata, { isError, EnvConfig, HeadIdentity } from "./metadata"; +import { Db, MongoClient, Collection } from "mongodb"; +import { BranchNotFoundError } from "./errors"; +jest.mock("mongodb"); + +const defaultEnvConfig = { + token: "llama", + uploadLimit: 12, + hostDir: "pineapple", + publicDir: ".dir", + stage1: 132, + stage2: 1.0, +}; +const defaultMetadata = () => + new Metadata(new Db({} as MongoClient, ""), defaultEnvConfig as EnvConfig); + +describe("isError", () => { + it("should return false when object is a HeadContext", () => { + // Arrange + const obj = { + commit: "fae10429d", + format: "15-minute quarters", + }; + + // Act + const result = isError(obj); + + // Assert + expect(result).toEqual(false); + }); + + it("should return true when object is a BranchNotFoundError", () => { + // Arrange + const error = new BranchNotFoundError(); + + // Act + const result = isError(error); + + // Assert + expect(result).toEqual(true); + }); +}); + +describe("getHeadCommit", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it("should return commit information if the repository exists and branch is a string", async () => { + // Arrange + const metadata = defaultMetadata(); + const organization = "kjhoerr"; + const repository = "ao-coverage"; + const branch = "aaaaa"; + const collectionMethod = jest + .spyOn(Db.prototype, "collection") + .mockImplementation(() => new Collection()); + const repositoryObject = { + value: "repository", + branches: { [branch]: { head: "yay" } }, + }; + const findMethod = jest + .spyOn(Collection.prototype, "findOne") + .mockImplementation(() => Promise.resolve(repositoryObject)); + + // Act + const result = await metadata.getHeadCommit( + organization, + repository, + branch + ); + + // Assert + expect(isError(result)).toEqual(false); + expect(collectionMethod).toHaveBeenCalledTimes(1); + expect(findMethod).toHaveBeenCalledTimes(1); + if (!isError(result)) { + expect(result.commit).toEqual(repositoryObject.branches[branch].head); + expect(result.format).toEqual("tarpaulin"); + } + }); + + it("should return commit information if the repository exists and branch is a HeadContext", async () => { + // Arrange + const metadata = defaultMetadata(); + const organization = "kjhoerr"; + const repository = "ao-coverage"; + const branch = "aaaaa"; + const collectionMethod = jest + .spyOn(Db.prototype, "collection") + .mockImplementation(() => new Collection()); + const headContext = { commit: "yay", format: "big-stick" }; + const repositoryObject = { + value: "repository", + branches: { [branch]: { head: headContext } }, + }; + const findMethod = jest + .spyOn(Collection.prototype, "findOne") + .mockImplementation(() => Promise.resolve(repositoryObject)); + + // Act + const result = await metadata.getHeadCommit( + organization, + repository, + branch + ); + + // Assert + expect(isError(result)).toEqual(false); + expect(collectionMethod).toHaveBeenCalledTimes(1); + expect(findMethod).toHaveBeenCalledTimes(1); + if (!isError(result)) { + expect(result.commit).toEqual(headContext.commit); + expect(result.format).toEqual(headContext.format); + } + }); + + it("should return BranchNotFoundError if the repository exists but the branch does not exist", async () => { + // Arrange + const metadata = defaultMetadata(); + const organization = "kjhoerr"; + const repository = "ao-coverage"; + const branch = "aaaaa"; + const fakeBranch = "main"; + const collectionMethod = jest + .spyOn(Db.prototype, "collection") + .mockImplementation(() => new Collection()); + const repositoryObject = { + value: "repository", + branches: { [fakeBranch]: { head: "yep" } }, + }; + const findMethod = jest + .spyOn(Collection.prototype, "findOne") + .mockImplementation(() => Promise.resolve(repositoryObject)); + + // Act + const result = await metadata.getHeadCommit( + organization, + repository, + branch + ); + + // Assert + expect(fakeBranch).not.toEqual(branch); + expect(isError(result)).toEqual(true); + expect(collectionMethod).toHaveBeenCalledTimes(1); + expect(findMethod).toHaveBeenCalledTimes(1); + }); + + it("should return BranchNotFoundError if the repository does not exist", async () => { + // Arrange + const metadata = defaultMetadata(); + const organization = "kjhoerr"; + const repository = "ao-coverage"; + const branch = "aaaaa"; + const collectionMethod = jest + .spyOn(Db.prototype, "collection") + .mockImplementation(() => new Collection()); + const findMethod = jest + .spyOn(Collection.prototype, "findOne") + .mockImplementation(() => Promise.resolve(null)); + + // Act + const result = await metadata.getHeadCommit( + organization, + repository, + branch + ); + + // Assert + expect(isError(result)).toEqual(true); + expect(collectionMethod).toHaveBeenCalledTimes(1); + expect(findMethod).toHaveBeenCalledTimes(1); + }); + + it("should return with rejected promise on Mongo error", async () => { + // Arrange + const metadata = defaultMetadata(); + const organization = "kjhoerr"; + const repository = "ao-coverage"; + const branch = "aaaaa"; + const collectionMethod = jest + .spyOn(Db.prototype, "collection") + .mockImplementation(() => new Collection()); + const findMethod = jest + .spyOn(Collection.prototype, "findOne") + .mockImplementation(() => Promise.reject("uh-oh")); + + // Act + const result = metadata.getHeadCommit(organization, repository, branch); + + // Assert + expect(result).rejects.toEqual("uh-oh"); + expect(collectionMethod).toHaveBeenCalledTimes(1); + expect(findMethod).toHaveBeenCalledTimes(1); + }); +}); + +describe("updateBranch", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it("should update the repository with new branch information", async () => { + // Arrange + const metadata = defaultMetadata(); + const collectionMethod = jest + .spyOn(Db.prototype, "collection") + .mockImplementation(() => new Collection()); + const updateMethod = jest + .spyOn(Collection.prototype, "findOneAndUpdate") + .mockImplementation(() => + Promise.resolve({ ok: 1, value: "repository" }) + ); + const insertMethod = jest + .spyOn(Collection.prototype, "insertOne") + .mockImplementation(() => Promise.resolve({ acknowledged: true })); + const identity: HeadIdentity = { + organization: "kjhoerr", + repository: "ao-coverage", + branch: "trunk", + head: { + commit: "yep", + format: "xml", + }, + }; + + // Act + const result = await metadata.updateBranch(identity); + + // Assert + expect(result).toEqual(true); + expect(collectionMethod).toHaveBeenCalledTimes(1); + expect(updateMethod).toHaveBeenCalledTimes(1); + expect(insertMethod).not.toHaveBeenCalled(); + const document = updateMethod.mock.calls[0][0]; + expect(document.organization).toEqual(identity.organization); + expect(document.name).toEqual(identity.repository); + }); + + it("should call create repository if it does not exist yet", async () => { + // Arrange + const metadata = defaultMetadata(); + const collectionMethod = jest + .spyOn(Db.prototype, "collection") + .mockImplementation(() => new Collection()); + const updateMethod = jest + .spyOn(Collection.prototype, "findOneAndUpdate") + .mockImplementation(() => Promise.resolve({})); + const insertMethod = jest + .spyOn(Collection.prototype, "insertOne") + .mockImplementation(() => Promise.resolve({ acknowledged: true })); + const identity: HeadIdentity = { + organization: "kjhoerr", + repository: "ao-coverage", + branch: "trunk", + head: { + commit: "yep", + format: "xml", + }, + }; + + // Act + const result = await metadata.updateBranch(identity); + + // Assert + expect(result).toEqual(true); + expect(collectionMethod).toHaveBeenCalledTimes(2); + expect(updateMethod).toHaveBeenCalledTimes(1); + // Metadata.createRepository was called + expect(insertMethod).toHaveBeenCalledTimes(1); + }); + + it("should return with rejected promise on Mongo error", async () => { + // Arrange + const metadata = defaultMetadata(); + const collectionMethod = jest + .spyOn(Db.prototype, "collection") + .mockImplementation(() => new Collection()); + const updateMethod = jest + .spyOn(Collection.prototype, "findOneAndUpdate") + .mockImplementation(() => Promise.reject("Success!!!!!!!!")); + const insertMethod = jest + .spyOn(Collection.prototype, "insertOne") + .mockImplementation(() => Promise.resolve({ acknowledged: true })); + const identity: HeadIdentity = { + organization: "kjhoerr", + repository: "ao-coverage", + branch: "trunk", + head: { + commit: "yep", + format: "xml", + }, + }; + + // Act + const result = metadata.updateBranch(identity); + + // Assert + expect(result).rejects.toEqual("Success!!!!!!!!"); + expect(collectionMethod).toHaveBeenCalledTimes(1); + expect(updateMethod).toHaveBeenCalledTimes(1); + expect(insertMethod).not.toHaveBeenCalled(); + }); +}); + +describe("createRepository", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it("should return true upon adding a new repository document", async () => { + // Arrange + const metadata = defaultMetadata(); + const collectionMethod = jest + .spyOn(Db.prototype, "collection") + .mockImplementation(() => new Collection()); + const insertMethod = jest + .spyOn(Collection.prototype, "insertOne") + .mockImplementation(() => Promise.resolve({ acknowledged: true })); + const identity: HeadIdentity = { + organization: "kjhoerr", + repository: "ao-coverage", + branch: "trunk", + head: { + commit: "yep", + format: "xml", + }, + }; + + // Act + const result = await metadata.createRepository(identity); + + // Assert + expect(result).toEqual(true); + expect(collectionMethod).toHaveBeenCalledTimes(1); + expect(insertMethod).toHaveBeenCalledTimes(1); + const document = insertMethod.mock.calls[0][0]; + expect(document.organization).toEqual(identity.organization); + expect(document.name).toEqual(identity.repository); + expect(document.branches[identity.branch]).toBeDefined(); + const branch = document.branches[identity.branch]; + expect(branch.head).toEqual(identity.head); + }); + + it("should return with rejected promise on Mongo error", async () => { + // Arrange + const metadata = defaultMetadata(); + const collectionMethod = jest + .spyOn(Db.prototype, "collection") + .mockImplementation(() => new Collection()); + const insertMethod = jest + .spyOn(Collection.prototype, "insertOne") + .mockImplementation(() => Promise.reject("fooey")); + const identity: HeadIdentity = { + organization: "kjhoerr", + repository: "ao-coverage", + branch: "trunk", + head: { + commit: "yep", + format: "xml", + }, + }; + + // Act + const result = metadata.createRepository(identity); + + // Assert + expect(result).rejects.toEqual("fooey"); + expect(collectionMethod).toHaveBeenCalledTimes(1); + expect(insertMethod).toHaveBeenCalledTimes(1); + }); +}); + +describe("getToken", () => { + it("should return the token from EnvConfig", () => { + // Arrange + const metadata = defaultMetadata(); + + // Act + const result = metadata.getToken(); + + // Assert + expect(result).toEqual(defaultEnvConfig.token); + }); +}); + +describe("getUploadLimit", () => { + it("should return the uploadLimit from EnvConfig", () => { + // Arrange + const metadata = defaultMetadata(); + + // Act + const result = metadata.getUploadLimit(); + + // Assert + expect(result).toEqual(defaultEnvConfig.uploadLimit); + }); +}); + +describe("getHostDir", () => { + it("should return the hostDir from EnvConfig", () => { + // Arrange + const metadata = defaultMetadata(); + + // Act + const result = metadata.getHostDir(); + + // Assert + expect(result).toEqual(defaultEnvConfig.hostDir); + }); +}); + +describe("getPublicDir", () => { + it("should return the publicDir from EnvConfig", () => { + // Arrange + const metadata = defaultMetadata(); + + // Act + const result = metadata.getPublicDir(); + + // Assert + expect(result).toEqual(defaultEnvConfig.publicDir); + }); +}); + +describe("getGradientStyle", () => { + it("should return the stages for GradientStyle from EnvConfig", () => { + // Arrange + const metadata = defaultMetadata(); + + // Act + const result = metadata.getGradientStyle(); + + // Assert + expect(result.stage1).toEqual(defaultEnvConfig.stage1); + expect(result.stage2).toEqual(defaultEnvConfig.stage2); + }); +}); |
