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  }