• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

DevSide / dynamock / 11429714109

20 Oct 2024 09:19PM UTC coverage: 97.696% (+0.4%) from 97.284%
11429714109

Pull #70

github

DevSide
refactor: convert to typescript, move logic inside service
Pull Request #70: refactor: convert to typescript, move logic inside service

114 of 120 branches covered (95.0%)

Branch coverage included in aggregate %.

259 of 262 new or added lines in 6 files covered. (98.85%)

310 of 314 relevant lines covered (98.73%)

276.27 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.87
/src/createServer.ts
1
import express, { type NextFunction, type Request, type Response } from 'express'
2✔
2
import cookieParser from 'cookie-parser'
2✔
3
import { REQUEST_PROPERTIES, requestPropertyMatch, RESPONSE_PROPERTIES, useResponseProperties } from './properties.js'
2✔
4
import { getFixtureIterator, removeFixture } from './fixtures.js'
2✔
5
import { createServer as createHTTPServer } from 'node:http'
2✔
6
import {
2✔
7
  createService,
8
  createServiceFixture,
9
  createServiceFixtures,
10
  deleteConfiguration,
11
  deleteServiceFixture,
12
  deleteServiceFixtures,
13
  getServiceConfiguration,
14
  hasServiceCors,
15
  resetService,
16
  updateServiceConfiguration,
17
} from './service.js'
18

19
export function createServer() {
2✔
20
  const app = express()
4✔
21
  const server = createHTTPServer(app)
4✔
22
  const corsAllowAllHeaders = {
4✔
23
    'Access-Control-Allow-Origin': '*',
24
    'Access-Control-Allow-Methods': '*',
25
    'Access-Control-Allow-Headers': '*',
26
  }
27

28
  app.use(express.json({ limit: '10mb' }))
4✔
29
  app.use(cookieParser())
4✔
30
  app.disable('x-powered-by')
4✔
31
  app.disable('etag')
4✔
32

33
  const service = createService()
4✔
34

35
  app.post('/___fixtures', (req, res) => {
4✔
36
    const [status, data] = createServiceFixture(service, req.body)
484✔
37
    res.status(status).send(data)
484✔
38
  })
39

40
  app.post('/___fixtures/bulk', (req, res) => {
4✔
41
    const [status, data] = createServiceFixtures(service, req.body)
44✔
42
    res.status(status).send(data)
44✔
43
  })
44

45
  app.delete('/___fixtures', (req, res) => {
4✔
46
    const [status, data] = deleteServiceFixtures(service)
492✔
47
    res.status(status).send(data)
492✔
48
  })
49

50
  app.delete('/___fixtures/:id', (req, res) => {
4✔
51
    const [status] = deleteServiceFixture(service, req.params.id)
8✔
52
    res.status(status).send()
8✔
53
  })
54

55
  app.get('/___config', (req, res) => {
4✔
56
    const [status, data] = getServiceConfiguration(service)
4✔
57
    res.status(status).send(data)
4✔
58
  })
59

60
  app.put('/___config', (req, res) => {
4✔
61
    const [status, data] = updateServiceConfiguration(service, req.body)
98✔
62
    res.status(status).send(data)
98✔
63
  })
64

65
  app.delete('/___config', (req, res) => {
4✔
66
    const [status] = deleteConfiguration(service)
484✔
67
    res.status(status).send()
484✔
68
  })
69

70
  app.use(function fixtureHandler(req: Request, res: Response, next: NextFunction) {
4✔
71
    if (req.method === 'OPTIONS' && hasServiceCors(service)) {
422✔
72
      res.set(corsAllowAllHeaders).status(200).send()
2✔
73
      return
2✔
74
    }
75

76
    fixtureLoop: for (const [fixtureId, fixture] of getFixtureIterator(service.fixtureStorage)) {
420✔
77
      const { request, responses } = fixture
404✔
78
      // console.log("fixtureHandler", request)
79

80
      if (!requestPropertyMatch(req, request, 'path') || !requestPropertyMatch(req, request, 'method')) {
404✔
81
        continue
26✔
82
      }
83

84
      for (const property of REQUEST_PROPERTIES) {
378✔
85
        if (!requestPropertyMatch(req, request, property)) {
1,402✔
86
          // console.log("fixtureHandler no match " + property)
87
          continue fixtureLoop
80✔
88
        }
89
      }
90

91
      const response = responses[0]
298✔
92
      const options = response.options || {}
298✔
93

94
      const send = () => {
298✔
95
        res.status(response.status || 200)
298✔
96

97
        // Loop over RESPONSE_PROPERTIES which has the right order
98
        // avoiding "Can't set headers after they are sent"
99
        for (const property of RESPONSE_PROPERTIES) {
298✔
100
          if (response[property] !== undefined && property in useResponseProperties) {
1,192✔
101
            // @ts-ignore
102
            useResponseProperties[property](req, res, response[property])
338✔
103
          }
104
        }
105

106
        if (service.configuration.cors === '*') {
298✔
107
          res.set(corsAllowAllHeaders)
4✔
108
        }
109
      }
110

111
      if (response.options?.delay) {
298!
NEW
112
        setTimeout(send, response.options.delay)
×
113
      } else {
114
        send()
298✔
115
      }
116

117
      // The fixture has been or will be consumed
118
      // When the response is delayed, we need to remove it before it returns
119
      if (options.lifetime === undefined || options.lifetime === 1) {
294✔
120
        if (responses.length > 1) {
276✔
121
          responses.shift()
10✔
122
        } else {
123
          removeFixture(service.fixtureStorage, fixtureId)
266✔
124
        }
125
      } else if (options.lifetime > 0) {
18✔
126
        options.lifetime--
12✔
127
      }
128

129
      return
294✔
130
    }
131

132
    next()
122✔
133
  })
134

135
  server.on('close', () => {
4✔
136
    resetService(service)
2✔
137
  })
138

139
  return server
4✔
140
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc