From 42e2d051778e2984e392bae45ba8090dd0ebfae6 Mon Sep 17 00:00:00 2001 From: Chegele Date: Thu, 6 Jul 2023 15:46:35 -0400 Subject: [PATCH] Unit tests for Post --- .../reputation/reputation/post.spec.ts | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 src/services/reputation/reputation/post.spec.ts diff --git a/src/services/reputation/reputation/post.spec.ts b/src/services/reputation/reputation/post.spec.ts new file mode 100644 index 0000000..49fcfe9 --- /dev/null +++ b/src/services/reputation/reputation/post.spec.ts @@ -0,0 +1,162 @@ +import { Vertex } from "../graph.interface"; +import { Citation } from "./citation"; +import { Member } from "./member"; +import { Post } from "./post"; + +describe('Reputation Service Post', () => { + + let testingPostA: Post; + let testingPostB: Post; + let testingCitation: Citation; + + const TEST_AUTHOR_A = new Member("testAuthorA"); + const TEST_TITLE_A = "The Hitchhiker's Guide to the Galaxy"; + const TEST_CONTENT_A = "The ships hung in the sky in much the same way that bricks don't."; + + const TEST_AUTHOR_B = new Member("testAuthorB"); + const TEST_TITLE_B = "The Restaurant at the End of the Universe"; + const TEST_CONTENT_B = "The story so far: In the beginning the Universe was created. This has made a lot of people very angry and been widely regarded as a bad move."; + + const SERIALIZED = `{"id":"testingPostA","title":"The Hitchhiker's Guide to the Galaxy","content":"The ships hung in the sky in much the same way that bricks don't.","authors":[{"author":"testAuthorA","weight":1000}],"citations":[{"citation":"testingCitation","weight":300}]}`; + + beforeEach(() => { + testingPostA = new Post("testingPostA", TEST_TITLE_A, TEST_CONTENT_A, TEST_AUTHOR_A); + testingPostB = new Post("testingPostB", TEST_TITLE_B, TEST_CONTENT_B, TEST_AUTHOR_B); + testingCitation = new Citation("testingCitation", testingPostA, testingPostB, 10); + testingPostA.setCitation(testingCitation, 300); + }); + + it('should be able to get all posts', () => { + const posts = Post.getAllPosts(); + expect(posts.length).toBe(2); + expect(posts[0].id).toBe("testingPostA"); + expect(posts[1].id).toBe("testingPostB"); + }); + + it('should be able to get a specific post', () => { + const post = Post.getPost("testingPostA"); + expect(post).toBeDefined(); + expect(post?.title).toBe(TEST_TITLE_A); + }); + + it('should be able to create a new post with random id', () => { + const post = new Post(null, TEST_TITLE_A, TEST_CONTENT_A, TEST_AUTHOR_A); + expect(typeof post.id).toBe("string"); + expect(post.id.length).toBeGreaterThan(5); + }); + + it('should be able to create a new post with specific id', () => { + const post = new Post("testing", TEST_TITLE_A, TEST_CONTENT_A, TEST_AUTHOR_A); + expect(post.id).toBe("testing"); + }); + + it('should be able to get the id of a post', () => { + expect(testingPostA.id).toBe("testingPostA"); + }); + + it('should be able to get the edges from Post as a Vertex', () => { + const vertex = testingPostA as Vertex; + expect(vertex.edges.length).toBe(1); + }); + + it('should be able to get the data from Post as a Vertex', () => { + const vertex = testingPostA as Vertex; + const data = vertex.data; + expect(vertex.data).toBeDefined(); + expect(typeof data).toBe("string"); + }); + + it('should be able to get the title of a post', () => { + expect(testingPostA.title).toBe(TEST_TITLE_A); + }); + + it('should be able to get the content of a post', () => { + expect(testingPostA.content).toBe(TEST_CONTENT_A); + }); + + it('should be able to get the authors of a post', () => { + expect(testingPostA.authors.length).toBe(1); + expect(testingPostA.authors[0]).toBe(TEST_AUTHOR_A); + }); + + it('should be able to get the citations of a post', () => { + expect(testingPostA.citations.length).toBe(1); + expect(testingPostA.citations[0]).toBe(testingCitation); + }); + + it('should be able to get the total authors weight of a post', () => { + expect(testingPostA.authorsWeightTotal).toBe(1000); + }); + + it('should be able to get the total citations weight of a post', () => { + expect(testingPostA.citationsWeightTotal).toBe(300); + }); + + it('should be able to adjust an authors weight within a post', () => { + testingPostA.setAuthor(TEST_AUTHOR_A, 10); + expect(testingPostA.authorsWeightTotal).toBe(10); + }); + + it('should be able to add multiple authors to a post', () => { + testingPostA.setAuthor(TEST_AUTHOR_B, 500); + expect(testingPostA.authors.length).toBe(2); + expect(testingPostA.authors[1]).toBe(TEST_AUTHOR_B); + expect(testingPostA.authorsWeightTotal).toBe(1500); + }); + + it('should be able to remove an author from a post', () => { + testingPostA.setAuthor(TEST_AUTHOR_B, 500); + testingPostA.removeAuthor(TEST_AUTHOR_B); + expect(testingPostA.authors.length).toBe(1); + expect(testingPostA.authors[0]).toBe(TEST_AUTHOR_A); + expect(testingPostA.authorsWeightTotal).toBe(1000); + }); + + it('should not be able to remove all authors from a post', () => { + expect(() => { + testingPostA.removeAuthor(TEST_AUTHOR_A); + }).toThrowError("Cannot remove the last author of a post."); + }); + + it('should be able to add citations to a post', () => { + const citation = new Citation("testingCitation", testingPostB, testingPostA, 100); + testingPostA.setCitation(citation, 100); + expect(testingPostA.citations.length).toBe(2); + expect(testingPostA.citations[1]).toBe(citation); + expect(testingPostA.citationsWeightTotal).toBe(400); + }); + + it('should be able to remove citations from a post', () => { + testingPostA.removeCitation(testingCitation); + expect(testingPostA.citations.length).toBe(0); + expect(testingPostA.citationsWeightTotal).toBe(0); + }); + + it('should be able to get the weight of an author within a post', () => { + expect(testingPostA.getWeight(TEST_AUTHOR_A)).toBe(1000); + }); + + it('should be able to get the weight of a citation within a post', () => { + expect(testingPostA.getWeight(testingCitation)).toBe(300); + }); + + it('should be able to serialize a post', () => { + const serialized = Post.serialize(testingPostA, false); + expect(serialized).toBe(SERIALIZED); + }); + + it('should be able to parse a post', () => { + const post = Post.parse(SERIALIZED); + expect(post).toBeDefined(); + expect(post?.id).toBe("testingPostA"); + expect(post?.title).toBe(TEST_TITLE_A); + expect(post?.content).toBe(TEST_CONTENT_A); + expect(post?.authors.length).toBe(1); + expect(post?.authors[0]).toBe(TEST_AUTHOR_A); + expect(post?.authorsWeightTotal).toBe(1000); + expect(post?.citations.length).toBe(1); + expect(post?.citations[0]).toBe(testingCitation); + expect(post?.citationsWeightTotal).toBe(300); + }); + +}); \ No newline at end of file