github.com/covergates/covergates@v0.2.2-0.20201009050117-42ef8a19fb95/web/src/server.ts (about) 1 import { Server, Registry, Model, Factory, Response } from 'miragejs'; 2 3 const User = Model.extend({ 4 login: '', 5 email: '' 6 }); 7 8 const Repository = Model.extend({ 9 URL: '', 10 ReportID: '', 11 NameSpace: '', 12 Name: '', 13 Branch: '', 14 SCM: '' 15 }); 16 17 const RepositoryFactory = Factory.extend({ 18 URL(i: number) { 19 return `http://github/org${i}/repo${i}`; 20 }, 21 ReportID(i: number) { 22 return `report${i}`; 23 }, 24 NameSpace(i: number) { 25 return `org${i}`; 26 }, 27 Name(i: number) { 28 return `repo${i}`; 29 }, 30 Branch: 'master', 31 SCM: 'github' 32 }); 33 34 const models = { 35 user: User, 36 repository: Repository 37 }; 38 39 const factories = { 40 repository: RepositoryFactory 41 }; 42 43 type Models = typeof models; 44 45 function seeds(server: Server<Registry<Models, {}>>): void { 46 server.schema.create('user', { 47 login: 'blueworrybear', 48 email: 'blueworrybear@gmail.com' 49 }); 50 server.createList('repository', 5); 51 server.create('repository', { ReportID: '' }); 52 } 53 54 function routes(this: Server<Registry<Models, {}>>): void { 55 this.namespace = '/api/v1'; 56 // user 57 this.get('/user', schema => { 58 const user = schema.first('user'); 59 return user !== null ? user.attrs : {}; 60 }); 61 // repository 62 this.get('/repos/:scm', schema => { 63 return schema.all('repository').models; 64 }); 65 this.get('/user/repos', schema => { 66 return schema.all('repository').models; 67 }); 68 this.get('/repos/:scm/:namespace/:name/files', () => { 69 const files = []; 70 for (let i = 0; i < 10; i++) { 71 files.push(`file${i}`); 72 } 73 files.push('dir/file.pl'); 74 files.push('main.pl'); 75 return files; 76 }); 77 78 this.get('/repos/:scm/:namesapce/:name/content/*path', () => { 79 return new Response(200, undefined, `print "hello"; 80 my $s = "test"; 81 if ($s =~ /^t/) { 82 \tprint 'match\\n'; 83 } 84 `); 85 }); 86 87 this.get('/repos/:scm/:namespace/:name', (schema, request) => { 88 const repo = schema.findBy('repository', { Name: request.params.name }); 89 if (repo?.ReportID === '') { 90 return new Response(404); 91 } 92 return repo !== null ? repo.attrs : {}; 93 }); 94 // report 95 this.get('/reports/:id', (_, request) => { 96 if (request.params.id === 'report1') { 97 return new Response(404); 98 } 99 const reports = [] as Report[]; 100 if (request.queryParams.latest === 'true') { 101 reports.push({ 102 commit: '123456', 103 reportID: `${request.params.id}`, 104 coverages: [ 105 { 106 files: [ 107 { 108 Name: 'main.pl', 109 StatementCoverage: 0.8, 110 StatementHits: [ 111 { 112 LineNumber: 1, 113 Hits: 1 114 }, 115 { 116 LineNumber: 2, 117 Hits: 1 118 } 119 ] 120 } 121 ], 122 statementCoverage: 0.8, 123 type: 'perl' 124 } 125 ], 126 files: ['a', 'b', 'c', 'main.pl'] 127 }); 128 } else { 129 for (let i = 10; i >= 0; i--) { 130 reports.push( 131 { 132 commit: `d53dc5fef2832f3846aa1249406d7ddc6fa8fc4${i}`, 133 coverages: [ 134 { 135 statementCoverage: i / 10, 136 type: 'perl' 137 } 138 ], 139 reportID: `report${request.params.id}`, 140 createdAt: '2020-07-24 10:40:46.6532307+08:00' 141 } 142 ); 143 } 144 } 145 146 return reports; 147 }); 148 } 149 150 export class MockServer extends Server<Registry<Models, {}>> { 151 constructor(environment = 'development') { 152 super({ 153 environment, 154 models: models, 155 factories: factories, 156 seeds: seeds, 157 routes: routes 158 }); 159 } 160 } 161 162 export function makeServer(environment = 'development'): MockServer { 163 const server = new MockServer(environment); 164 return server; 165 }