const { randomArrayValue } = require('./utils') // basic types const basicExtendsTypes = () => ({ LOCAL_DATE_TIME: () => Math.floor(new Date().getTime() / 1000), USER_ROLE: (role) => role || randomArrayValue(['STUDENT', 'TEACHER']), BUILD_STATUS: (status) => status || randomArrayValue([ 'SUCCESS', 'UNSTABLE', 'FAILURE', 'TIMEOUT', 'WAITING', 'RUNNING' ]), PROBLEM_TYPE: (problemType) => problemType || randomArrayValue([ 'JAVA', 'JAVA_DATABASE', 'PYTHON', 'JAVA_COVERAGE', 'PYTHON_COVERAGE', 'JAVA_MUTATION' ]), EXAM_STATUS: (examStatus) => examStatus || randomArrayValue([ 'PREPARING', 'UNAVAILABLE', 'READY', 'AVAILABLE', 'FINISHED', 'CLOSED' ]) }) // serializer type const serializersPlugin = (mock) => ({ USER_SERIALIZER: (role, id) => mock({ [isNaN(id) ? 'id|1-2000' : 'id']: isNaN(id) ? 1 : id, 'score|90-100': 1, username: '@NAME', name: '@NAME', email: '@EMAIL', phone: '@PHONE', role: `@USER_ROLE(${role})`, createdAt: '@LOCAL_DATE_TIME' }), RESULT_SERIALIZER: (deleted) => mock({ 'id|1-1000': 1, 'score|90-100': 1, lastCommitAt: '@LOCAL_DATE_TIME', deleted: typeof deleted === 'boolean' ? deleted : '@BOOLEAN', exam: { 'id|1-1000': 1, name: '@NAME', course: '南京大学软件工程第一期' }, owner: { 'id|1-1000': 1, username: '@NAME' }, 'commits|10-20': [ { 'id|1-1000': 1, finished: '@BOOLEAN', 'score|90-100': 1, createdAt: '@LOCAL_DATE_TIME' } ] }), RECORD_SERIALIZER: (status) => mock({ 'id|1-1000': 1, 'number|1-1000': 1, status: `@BUILD_STATUS(${status})`, consoleOutput: '@PARAGRAPH(1)', 'score|90-100': 1, commit: { 'id|1-1000': 1, finished: '@BOOLEAN', 'score|90-100': 1, createdAt: '@LOCAL_DATE_TIME' }, 'failures|10-20': [ { name: '@TITLE', details: '@SENTENCE', trace: '@PARAGRAPH(1)' } ] }), PROBLEM_SERIALIZER: (type) => mock({ 'id|1-1000': 1, name: '@NAME', type: `@PROBLEM_TYPE(${type})`, description: '@SENTENCE', 'publicFiles|0-4': ['@URL'], 'protectedFiles|0-4': ['@URL'], 'privateFiles|0-4': ['@URL'], createdAt: '@LOCAL_DATE_TIME', modifiedAt: '@LOCAL_DATE_TIME', deprecated: '@BOOLEAN', creator: { 'id|1-1000': 1, username: '@NAME' } }), PAGE_SERIALIZER: () => ({ page: 1, limit: 20, size: 20, total: 100 }), EXAM_SERIALIZER: (status) => mock({ 'id|1-1000': 1, name: '@NAME', createdAt: '1578405025', startAt: '1578405025', endAt: '1588405025', url: '@URL', status: `@EXAM_STATUS(${status})`, creator: { 'id|1-1000': 1, username: '@NAME' }, joined: '@BOOLEAN', 'courseId|1-1000': 1, courseName: '南京大学软件工程第一期' }), COURSE_SERIALIZER: () => mock({ 'id|1-1000': 1, name: '南京大学软件工程第一期', code: '@ID' }), CODE_SERIALIZER: () => mock({ 'examId|1-1000': 1, fetchAt: '@LOCAL_DATE_TIME', startAt: '@LOCAL_DATE_TIME', endAt: '@LOCAL_DATE_TIME', 'codeList|10-100': [ { 'questionId|1-1000': 1, language: 'Java', projectName: '软工一作业', editable: { '/a/b/c.java': btoa(`class a{ public void helloWorld1(){ } }`), '/a/b/a.java': btoa(`class a{ public void helloWorld2(){ } }`), '/a/c/a.java': btoa(`class a{ public void helloWorld3(){ } }`), '/a/b/d.java': btoa(`class a{ public void helloWorld4(){ } }`) }, uneditable: { '/README.md': btoa('') } } ] }), COMMIT_SERIALIZER: () => mock({ 'id|1-1000': 1, hash: '@STRING(50)', finished: '@BOOLEAN', 'score|70-100': 1, createdAt: '@LOCAL_DATE_TIME', result: { 'id|1-1000': 1, 'score|70-100': 1, exam: { 'id|1-1000': 1, name: '@SENTENCE' }, owner: { 'id|1-1000': 1, username: '@NAME' } }, 'records|10': [ { 'id|1-1000': 1, status: '@BUILD_STATUS', 'score|70-100': 1, problem: { 'id|1-1000': 1, name: '@SENTENCE' } } ] }) }) function btoa(str) { if (Buffer.byteLength(str) !== str.length) throw new Error('bad string!') return Buffer.from(str, 'binary').toString('base64') } module.exports = function(random, mock) { random.extend(basicExtendsTypes()) random.extend(serializersPlugin(mock)) }