Forum unit tests
This commit is contained in:
parent
5d202e9c36
commit
24b02b841e
|
@ -0,0 +1,175 @@
|
||||||
|
|
||||||
|
import { Vertex } from '../graph/vertex';
|
||||||
|
import { Edge } from '../graph/edge';
|
||||||
|
import { Citation } from './citation';
|
||||||
|
import { Forum } from './forum';
|
||||||
|
import { Member } from './member';
|
||||||
|
import { Post } from './post';
|
||||||
|
|
||||||
|
function implementsVertex(obj: Object) {
|
||||||
|
return "id" in obj && "data" in obj && "citations" in obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
function implementsEdge(obj: Object) {
|
||||||
|
const properties = ["id", "directional", "parentVertex", "childVertex", "getAdjacent"];
|
||||||
|
for (const property of properties) if (!(property in obj)) return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('Reputation Service Forum', () => {
|
||||||
|
|
||||||
|
let testingForum: Forum;
|
||||||
|
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.";
|
||||||
|
|
||||||
|
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);
|
||||||
|
testingForum = new Forum(
|
||||||
|
{},
|
||||||
|
[testingPostA, testingPostB],
|
||||||
|
[testingCitation],
|
||||||
|
[TEST_AUTHOR_A, TEST_AUTHOR_B]
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to get all posts', () => {
|
||||||
|
const posts = testingForum.getAllPosts();
|
||||||
|
expect(posts.length).toBe(2);
|
||||||
|
expect(posts[0]).toBe(testingPostA);
|
||||||
|
expect(posts[1]).toBe(testingPostB);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to get a post by id', () => {
|
||||||
|
const post = testingForum.getPost("testingPostA");
|
||||||
|
expect(post).toBe(testingPostA);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to add a post', () => {
|
||||||
|
const newPost = new Post("newPost", "newTitle", "newContent", TEST_AUTHOR_A);
|
||||||
|
testingForum.addPost(newPost);
|
||||||
|
expect(testingForum.getPost("newPost")).toBe(newPost);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to delete a post', () => {
|
||||||
|
testingForum.deletePost(testingPostA);
|
||||||
|
expect(testingForum.getPost("testingPostA")).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to get all citations', () => {
|
||||||
|
const citations = testingForum.getAllCitations();
|
||||||
|
expect(citations.length).toBe(1);
|
||||||
|
expect(citations[0]).toBe(testingCitation);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to get a citation by id', () => {
|
||||||
|
const citation = testingForum.getCitation("testingCitation");
|
||||||
|
expect(citation).toBe(testingCitation);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to add a citation', () => {
|
||||||
|
const newCitation = new Citation("newCitation", testingPostA, testingPostB, 10);
|
||||||
|
testingForum.addCitation(newCitation);
|
||||||
|
expect(testingForum.getCitation("newCitation")).toBe(newCitation);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to delete a citation', () => {
|
||||||
|
testingForum.deleteCitation(testingCitation);
|
||||||
|
expect(testingForum.getCitation("testingCitation")).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to get all members', () => {
|
||||||
|
const members = testingForum.getAllMembers();
|
||||||
|
expect(members.length).toBe(2);
|
||||||
|
expect(members[0]).toBe(TEST_AUTHOR_A);
|
||||||
|
expect(members[1]).toBe(TEST_AUTHOR_B);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to get a member by id', () => {
|
||||||
|
const member = testingForum.getMember("testAuthorA");
|
||||||
|
expect(member).toBe(TEST_AUTHOR_A);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to add a member', () => {
|
||||||
|
const newMember = new Member("newMember");
|
||||||
|
testingForum.addMember(newMember);
|
||||||
|
expect(testingForum.getMember("newMember")).toBe(newMember);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to delete a member', () => {
|
||||||
|
testingForum.deleteMember(TEST_AUTHOR_A);
|
||||||
|
expect(testingForum.getMember("testAuthorA")).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to get all posts as vertices', () => {
|
||||||
|
const vertices = testingForum.getAllVertices();
|
||||||
|
const vertex = vertices[0];
|
||||||
|
expect(vertices.length).toBe(2);
|
||||||
|
expect(implementsVertex(vertex)).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to get a post as a vertex by id', () => {
|
||||||
|
const vertex = testingForum.getVertex("testingPostA");
|
||||||
|
expect(vertex).toBe(testingPostA);
|
||||||
|
expect(implementsVertex(vertex)).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to add a post as a vertex', () => {
|
||||||
|
const newPost = new Post("newPost", "newTitle", "newContent", TEST_AUTHOR_A);
|
||||||
|
testingForum.addVertex(newPost);
|
||||||
|
expect(testingForum.getVertex("newPost")).toBe(newPost);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to delete a post as a vertex', () => {
|
||||||
|
testingForum.deleteVertex(testingPostA);
|
||||||
|
expect(testingForum.getVertex("testingPostA")).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to get all citations as edges', () => {
|
||||||
|
const edges = testingForum.getAllEdges();
|
||||||
|
const edge = edges[0];
|
||||||
|
expect(edges.length).toBe(1);
|
||||||
|
expect(implementsEdge(edge)).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to get a citation as an edge by id', () => {
|
||||||
|
const edge = testingForum.getEdge("testingCitation");
|
||||||
|
expect(edge).toBe(testingCitation);
|
||||||
|
expect(implementsEdge(edge)).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to add a citation as an edge', () => {
|
||||||
|
const newCitation = new Citation("newCitation", testingPostA, testingPostB, 10);
|
||||||
|
testingForum.addEdge(newCitation);
|
||||||
|
expect(testingForum.getEdge("newCitation")).toBe(newCitation);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to delete a citation as an edge', () => {
|
||||||
|
testingForum.deleteEdge(testingCitation);
|
||||||
|
expect(testingForum.getEdge("testingCitation")).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to get the branch of a post', () => {
|
||||||
|
//TODO: implement
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to asses the reputation impact of a post', () => {
|
||||||
|
//TODO: implement
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be able to propagate reputation rewarded through a post', () => {
|
||||||
|
//TODO: implement
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
});
|
|
@ -1,15 +1,20 @@
|
||||||
import { Edge, Graph, Vertex } from "../graph.interface";
|
import { Edge, Graph, Vertex } from "../graph.interface";
|
||||||
import { Citation } from "./citation";
|
import { Citation } from "./citation";
|
||||||
import { Member } from "./member";
|
import { LedgerEntry, Member } from "./member";
|
||||||
import { Post } from "./post";
|
import { Post } from "./post";
|
||||||
|
|
||||||
export default class Forum implements Graph {
|
export class Forum implements Graph {
|
||||||
|
|
||||||
private posts = new Map<string, Post>();
|
private posts = new Map<string, Post>();
|
||||||
private citations = new Map<string, Citation>();
|
private citations = new Map<string, Citation>();
|
||||||
private members = new Map<string, Member>();
|
private members = new Map<string, Member>();
|
||||||
|
private ledger = new Map<string, LedgerEntry>();
|
||||||
|
|
||||||
constructor(posts: Post[], citations: Citation[], members: Member[]) {
|
//TODO: Need to define the forum parameters
|
||||||
|
public params = {};
|
||||||
|
|
||||||
|
constructor(params: object, posts: Post[], citations: Citation[], members: Member[]) {
|
||||||
|
this.params = params;
|
||||||
posts.forEach(post => this.posts.set(post.id, post));
|
posts.forEach(post => this.posts.set(post.id, post));
|
||||||
citations.forEach(citation => this.citations.set(citation.id, citation));
|
citations.forEach(citation => this.citations.set(citation.id, citation));
|
||||||
members.forEach(member => this.members.set(member.id, member));
|
members.forEach(member => this.members.set(member.id, member));
|
||||||
|
@ -41,13 +46,9 @@ export default class Forum implements Graph {
|
||||||
}
|
}
|
||||||
|
|
||||||
public deletePost(post: string | Post) {
|
public deletePost(post: string | Post) {
|
||||||
if (typeof post === "string") this.posts.delete(post);
|
if (typeof post === "string") post = this.posts.get(post);
|
||||||
else for (const [key, val] of this.posts.entries()) {
|
for (const citation of post.citations) this.deleteCitation(citation);
|
||||||
if (val === post) {
|
this.posts.delete(post.id);
|
||||||
this.posts.delete(key);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public getAllCitations() {
|
public getAllCitations() {
|
||||||
|
@ -59,17 +60,48 @@ export default class Forum implements Graph {
|
||||||
}
|
}
|
||||||
|
|
||||||
public addCitation(citation: Citation) {
|
public addCitation(citation: Citation) {
|
||||||
|
citation.sourcePost.setCitation(citation);
|
||||||
|
citation.citedPost.setCitation(citation);
|
||||||
this.citations.set(citation.id, citation);
|
this.citations.set(citation.id, citation);
|
||||||
}
|
}
|
||||||
|
|
||||||
public deleteCitation(citation: string | Citation) {
|
public deleteCitation(citation: string | Citation) {
|
||||||
if (typeof citation === "string") this.citations.delete(citation);
|
if (typeof citation === "string") citation = this.citations.get(citation);
|
||||||
else for (const [key, val] of this.citations.entries()) {
|
this.citations.delete(citation.id);
|
||||||
if (val === citation) {
|
citation.sourcePost.removeCitation(citation);
|
||||||
this.citations.delete(key);
|
citation.citedPost.removeCitation(citation);
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
public getAllMembers() {
|
||||||
|
return Array.from(this.members.values());
|
||||||
|
}
|
||||||
|
|
||||||
|
public getMember(id: string) {
|
||||||
|
return this.members.get(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public addMember(member: Member) {
|
||||||
|
this.members.set(member.id, member);
|
||||||
|
}
|
||||||
|
|
||||||
|
public deleteMember(member: string | Member) {
|
||||||
|
if (typeof member === "string") member = this.members.get(member);
|
||||||
|
this.members.delete(member.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: Need to define this function
|
||||||
|
public getBranch(post: Post, depth: number, direction: 'predecessor' | 'successor') {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: Need to define this function
|
||||||
|
public assesPostImpact(post: Post, depth: number = 1) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: Need to define this function
|
||||||
|
public propagateReputation(post: Post) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue