serializers.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. const { randomArrayValue } = require('./utils')
  2. // basic types
  3. const basicExtendsTypes = () => ({
  4. LOCAL_DATE_TIME: () => Math.floor(new Date().getTime() / 1000),
  5. USER_ROLE: (role) => role || randomArrayValue(['STUDENT', 'TEACHER']),
  6. BUILD_STATUS: (status) =>
  7. status ||
  8. randomArrayValue([
  9. 'SUCCESS',
  10. 'UNSTABLE',
  11. 'FAILURE',
  12. 'TIMEOUT',
  13. 'WAITING',
  14. 'RUNNING'
  15. ]),
  16. PROBLEM_TYPE: (problemType) =>
  17. problemType ||
  18. randomArrayValue([
  19. 'JAVA',
  20. 'JAVA_DATABASE',
  21. 'PYTHON',
  22. 'JAVA_COVERAGE',
  23. 'PYTHON_COVERAGE',
  24. 'JAVA_MUTATION'
  25. ]),
  26. EXAM_STATUS: (examStatus) =>
  27. examStatus ||
  28. randomArrayValue([
  29. 'PREPARING',
  30. 'UNAVAILABLE',
  31. 'READY',
  32. 'AVAILABLE',
  33. 'FINISHED',
  34. 'CLOSED'
  35. ])
  36. })
  37. // serializer type
  38. const serializersPlugin = (mock) => ({
  39. USER_SERIALIZER: (role, id) =>
  40. mock({
  41. [isNaN(id) ? 'id|1-2000' : 'id']: isNaN(id) ? 1 : id,
  42. 'score|90-100': 1,
  43. username: '@NAME',
  44. name: '@NAME',
  45. email: '@EMAIL',
  46. phone: '@PHONE',
  47. role: `@USER_ROLE(${role})`,
  48. createdAt: '@LOCAL_DATE_TIME'
  49. }),
  50. RESULT_SERIALIZER: (deleted) =>
  51. mock({
  52. 'id|1-1000': 1,
  53. 'score|90-100': 1,
  54. lastCommitAt: '@LOCAL_DATE_TIME',
  55. deleted: typeof deleted === 'boolean' ? deleted : '@BOOLEAN',
  56. exam: {
  57. 'id|1-1000': 1,
  58. name: '@NAME',
  59. course: '南京大学软件工程第一期'
  60. },
  61. owner: {
  62. 'id|1-1000': 1,
  63. username: '@NAME'
  64. },
  65. 'commits|10-20': [
  66. {
  67. 'id|1-1000': 1,
  68. finished: '@BOOLEAN',
  69. 'score|90-100': 1,
  70. createdAt: '@LOCAL_DATE_TIME'
  71. }
  72. ]
  73. }),
  74. RECORD_SERIALIZER: (status) =>
  75. mock({
  76. 'id|1-1000': 1,
  77. 'number|1-1000': 1,
  78. status: `@BUILD_STATUS(${status})`,
  79. consoleOutput: '@PARAGRAPH(1)',
  80. 'score|90-100': 1,
  81. commit: {
  82. 'id|1-1000': 1,
  83. finished: '@BOOLEAN',
  84. 'score|90-100': 1,
  85. createdAt: '@LOCAL_DATE_TIME'
  86. },
  87. 'failures|10-20': [
  88. {
  89. name: '@TITLE',
  90. details: '@SENTENCE',
  91. trace: '@PARAGRAPH(1)'
  92. }
  93. ]
  94. }),
  95. PROBLEM_SERIALIZER: (type) =>
  96. mock({
  97. 'id|1-1000': 1,
  98. name: '@NAME',
  99. type: `@PROBLEM_TYPE(${type})`,
  100. description: '@SENTENCE',
  101. 'publicFiles|0-4': ['@URL'],
  102. 'protectedFiles|0-4': ['@URL'],
  103. 'privateFiles|0-4': ['@URL'],
  104. createdAt: '@LOCAL_DATE_TIME',
  105. modifiedAt: '@LOCAL_DATE_TIME',
  106. deprecated: '@BOOLEAN',
  107. creator: {
  108. 'id|1-1000': 1,
  109. username: '@NAME'
  110. }
  111. }),
  112. PAGE_SERIALIZER: () => ({
  113. page: 1,
  114. limit: 20,
  115. size: 20,
  116. total: 100
  117. }),
  118. EXAM_SERIALIZER: (status) =>
  119. mock({
  120. 'id|1-1000': 1,
  121. name: '@NAME',
  122. createdAt: '1578405025',
  123. startAt: '1578405025',
  124. endAt: '1588405025',
  125. url: '@URL',
  126. status: `@EXAM_STATUS(${status})`,
  127. creator: {
  128. 'id|1-1000': 1,
  129. username: '@NAME'
  130. },
  131. joined: '@BOOLEAN',
  132. 'courseId|1-1000': 1,
  133. courseName: '南京大学软件工程第一期'
  134. }),
  135. COURSE_SERIALIZER: () =>
  136. mock({
  137. 'id|1-1000': 1,
  138. name: '南京大学软件工程第一期',
  139. code: '@ID'
  140. }),
  141. CODE_SERIALIZER: () =>
  142. mock({
  143. 'examId|1-1000': 1,
  144. fetchAt: '@LOCAL_DATE_TIME',
  145. startAt: '@LOCAL_DATE_TIME',
  146. endAt: '@LOCAL_DATE_TIME',
  147. 'codeList|10-100': [
  148. {
  149. 'questionId|1-1000': 1,
  150. language: 'Java',
  151. projectName: '软工一作业',
  152. editable: {
  153. '/a/b/c.java': btoa(`class a{
  154. public void helloWorld1(){
  155. }
  156. }`),
  157. '/a/b/a.java': btoa(`class a{
  158. public void helloWorld2(){
  159. }
  160. }`),
  161. '/a/c/a.java': btoa(`class a{
  162. public void helloWorld3(){
  163. }
  164. }`),
  165. '/a/b/d.java': btoa(`class a{
  166. public void helloWorld4(){
  167. }
  168. }`)
  169. },
  170. uneditable: {
  171. '/README.md': btoa('')
  172. }
  173. }
  174. ]
  175. }),
  176. COMMIT_SERIALIZER: () =>
  177. mock({
  178. 'id|1-1000': 1,
  179. hash: '@STRING(50)',
  180. finished: '@BOOLEAN',
  181. 'score|70-100': 1,
  182. createdAt: '@LOCAL_DATE_TIME',
  183. result: {
  184. 'id|1-1000': 1,
  185. 'score|70-100': 1,
  186. exam: {
  187. 'id|1-1000': 1,
  188. name: '@SENTENCE'
  189. },
  190. owner: {
  191. 'id|1-1000': 1,
  192. username: '@NAME'
  193. }
  194. },
  195. 'records|10': [
  196. {
  197. 'id|1-1000': 1,
  198. status: '@BUILD_STATUS',
  199. 'score|70-100': 1,
  200. problem: {
  201. 'id|1-1000': 1,
  202. name: '@SENTENCE'
  203. }
  204. }
  205. ]
  206. })
  207. })
  208. function btoa(str) {
  209. if (Buffer.byteLength(str) !== str.length) throw new Error('bad string!')
  210. return Buffer.from(str, 'binary').toString('base64')
  211. }
  212. module.exports = function(random, mock) {
  213. random.extend(basicExtendsTypes())
  214. random.extend(serializersPlugin(mock))
  215. }