mirror of
https://gitlab.com/MrFry/mrfrys-node-server
synced 2026-04-29 11:47:38 +02:00
added nearly complete p2p implementation
This commit is contained in:
@@ -0,0 +1,204 @@
|
||||
import { getNewDataSince, mergeSubjects } from '../modules/api/submodules/p2p'
|
||||
import {
|
||||
countQuestionsInSubjects,
|
||||
getSubjectDifference,
|
||||
} from '../utils/qdbUtils'
|
||||
// import { QuestionDb, Subject } from '../types/basicTypes'
|
||||
|
||||
import { questions, subjects } from './testData'
|
||||
|
||||
// ------------------------------------------------------------------------------------
|
||||
// getSubjectDifference
|
||||
// ------------------------------------------------------------------------------------
|
||||
|
||||
test('Merging two similar question dbs should result in the same', () => {
|
||||
const { newData, newSubjects } = getSubjectDifference(subjects, subjects)
|
||||
|
||||
const newQuestionCount = countQuestionsInSubjects(newData)
|
||||
|
||||
expect(newSubjects.length).toBe(0)
|
||||
expect(newQuestionCount).toBe(0)
|
||||
})
|
||||
|
||||
test('Merging qdb with another that has one extra question should get added', () => {
|
||||
const { newData, newSubjects } = getSubjectDifference(subjects, [
|
||||
subjects[0],
|
||||
{
|
||||
...subjects[1],
|
||||
Questions: [...subjects[1].Questions, questions[10]],
|
||||
},
|
||||
])
|
||||
|
||||
const newQuestionCount = countQuestionsInSubjects(newData)
|
||||
|
||||
expect(newSubjects.length).toBe(0)
|
||||
expect(newQuestionCount).toBe(1)
|
||||
})
|
||||
|
||||
test('Qdb merging adding new subject', () => {
|
||||
const { newData, newSubjects } = getSubjectDifference(
|
||||
[subjects[0]],
|
||||
[subjects[0], subjects[1]]
|
||||
)
|
||||
|
||||
const newQuestionCount = countQuestionsInSubjects(newData)
|
||||
|
||||
expect(newSubjects.length).toBe(1)
|
||||
expect(newQuestionCount).toBe(0)
|
||||
})
|
||||
|
||||
test('Qdb merging adding new subject and new questions', () => {
|
||||
const { newData, newSubjects } = getSubjectDifference(
|
||||
[subjects[0]],
|
||||
[
|
||||
{
|
||||
...subjects[0],
|
||||
Questions: [...subjects[0].Questions, questions[10]],
|
||||
},
|
||||
subjects[1],
|
||||
subjects[2],
|
||||
]
|
||||
)
|
||||
|
||||
const newQuestionCount = countQuestionsInSubjects(newData)
|
||||
|
||||
expect(newSubjects.length).toBe(2)
|
||||
expect(newQuestionCount).toBe(1)
|
||||
})
|
||||
|
||||
// ------------------------------------------------------------------------------------
|
||||
// getNewDataSince
|
||||
// ------------------------------------------------------------------------------------
|
||||
|
||||
test('get new data since works', () => {
|
||||
const [q1, q2, q3] = questions
|
||||
.slice(0, 3)
|
||||
.map((q) => ({ ...q, data: { ...q.data, date: 500 } }))
|
||||
const [q4, q5, q6] = questions
|
||||
.slice(3, 6)
|
||||
.map((q) => ({ ...q, data: { ...q.data, date: 1000 } }))
|
||||
|
||||
const res = getNewDataSince(
|
||||
[
|
||||
{
|
||||
Name: '1',
|
||||
Questions: [q1, q2, q3, q4, q5, q6],
|
||||
},
|
||||
],
|
||||
750
|
||||
)
|
||||
expect(res.length).toBe(1)
|
||||
expect(res[0].Questions.length).toBe(3)
|
||||
})
|
||||
|
||||
test('get new data since works, multiple subjects', () => {
|
||||
const [q1, q2, q3] = questions
|
||||
.slice(0, 3)
|
||||
.map((q) => ({ ...q, data: { ...q.data, date: 500 } }))
|
||||
const [q4, q5, q6] = questions
|
||||
.slice(3, 6)
|
||||
.map((q) => ({ ...q, data: { ...q.data, date: 1000 } }))
|
||||
|
||||
const res = getNewDataSince(
|
||||
[
|
||||
{
|
||||
Name: '1',
|
||||
Questions: [q1, q2, q3, q4, q5, q6],
|
||||
},
|
||||
{
|
||||
Name: '2',
|
||||
Questions: [q1, q2, q3, q4],
|
||||
},
|
||||
],
|
||||
750
|
||||
)
|
||||
expect(res.length).toBe(2)
|
||||
expect(res[0].Questions.length).toBe(3)
|
||||
expect(res[1].Questions.length).toBe(1)
|
||||
})
|
||||
|
||||
test('get new data since works, multiple subjects round 2', () => {
|
||||
const [q1, q2, q3] = questions
|
||||
.slice(0, 3)
|
||||
.map((q) => ({ ...q, data: { ...q.data, date: 500 } }))
|
||||
const [q4, q5, q6] = questions
|
||||
.slice(3, 6)
|
||||
.map((q) => ({ ...q, data: { ...q.data, date: 1000 } }))
|
||||
const [q7, q8, q9] = questions
|
||||
.slice(6, 9)
|
||||
.map((q) => ({ ...q, data: { ...q.data, date: 500 } }))
|
||||
|
||||
const res = getNewDataSince(
|
||||
[
|
||||
{
|
||||
Name: '1',
|
||||
Questions: [q1, q2, q3, q4, q5, q6],
|
||||
},
|
||||
{
|
||||
Name: '2',
|
||||
Questions: [q7, q8, q9],
|
||||
},
|
||||
],
|
||||
750
|
||||
)
|
||||
expect(res.length).toBe(1)
|
||||
expect(res[0].Questions.length).toBe(3)
|
||||
})
|
||||
|
||||
// ------------------------------------------------------------------------------------
|
||||
// mergeQdbs
|
||||
// ------------------------------------------------------------------------------------
|
||||
test('merge subjects works', () => {
|
||||
const [s1] = subjects
|
||||
|
||||
const res = mergeSubjects([s1], [s1], [s1])
|
||||
expect(res.length).toBe(2)
|
||||
expect(res[0].Questions.length).toBe(8)
|
||||
})
|
||||
|
||||
test('merge subjects works, three new subjects', () => {
|
||||
const [s1] = subjects
|
||||
|
||||
const res = mergeSubjects([s1], [s1], [s1, s1, s1])
|
||||
expect(res.length).toBe(4)
|
||||
expect(res[0].Questions.length).toBe(8)
|
||||
expect(res[1].Questions.length).toBe(4)
|
||||
expect(res[2].Questions.length).toBe(4)
|
||||
expect(res[3].Questions.length).toBe(4)
|
||||
})
|
||||
|
||||
test('merge subjects works, no new subjects, two subjects to merge', () => {
|
||||
const [s1] = subjects
|
||||
|
||||
const res = mergeSubjects([s1], [s1, s1, s1, s1], [])
|
||||
expect(res.length).toBe(1)
|
||||
expect(res[0].Questions.length).toBe(20)
|
||||
})
|
||||
|
||||
test('merge subjects works, merging a subject with different name gets ignored', () => {
|
||||
const [s1, s2, s3] = subjects
|
||||
|
||||
const res = mergeSubjects([s1, s2], [s3], [])
|
||||
expect(res.length).toBe(2)
|
||||
expect(res[0].Questions.length).toBe(4)
|
||||
expect(res[1].Questions.length).toBe(4)
|
||||
})
|
||||
|
||||
test('merge subjects works, 2 subjects to 2, 1 new', () => {
|
||||
const [s1, s2, s3] = subjects
|
||||
|
||||
const res = mergeSubjects([s1, s2], [s1, s2], [s3])
|
||||
expect(res.length).toBe(3)
|
||||
expect(res[0].Questions.length).toBe(8)
|
||||
expect(res[1].Questions.length).toBe(8)
|
||||
expect(res[2].Questions.length).toBe(4)
|
||||
})
|
||||
|
||||
test('merge subjects works, no new data', () => {
|
||||
const [s1, s2] = subjects
|
||||
|
||||
const res = mergeSubjects([s1, s2], [], [])
|
||||
expect(res.length).toBe(2)
|
||||
expect(res[0].Questions.length).toBe(4)
|
||||
expect(res[1].Questions.length).toBe(4)
|
||||
})
|
||||
Reference in New Issue
Block a user