|
|
@@ -0,0 +1,217 @@
|
|
|
+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))
|
|
|
+}
|