purest.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. const fs = require('node:fs')
  2. const qs = require('node:querystring')
  3. const fixtures = require('../fixtures').providers
  4. function has (object, property) {
  5. return Object.prototype.hasOwnProperty.call(object, property)
  6. }
  7. class MockPurest {
  8. constructor (opts) {
  9. const methodsToMock = ['query', 'select', 'where', 'auth', 'json']
  10. const httpMethodsToMock = ['get', 'put', 'post', 'head', 'delete']
  11. methodsToMock.forEach((item) => {
  12. this[item] = () => this
  13. })
  14. httpMethodsToMock.forEach((item) => {
  15. this[item] = (url) => {
  16. this._requestUrl = url
  17. this._method = item
  18. return this
  19. }
  20. })
  21. this.opts = opts
  22. }
  23. qs (data) {
  24. this._query = qs.stringify(data)
  25. return this
  26. }
  27. options (reqOpts) {
  28. this._requestOptions = reqOpts
  29. return this
  30. }
  31. _getStatusCode () {
  32. const { validators } = fixtures[this.opts.providerName]
  33. if (validators && validators[this._requestUrl]) {
  34. return validators[this._requestUrl](this._requestOptions) ? 200 : 400
  35. }
  36. return 200
  37. }
  38. request (done) {
  39. if (typeof done === 'function') {
  40. const { responses } = fixtures[this.opts.providerName]
  41. const url = this._query ? `${this._requestUrl}?${this._query}` : this._requestUrl
  42. const endpointResponses = responses[url] || responses[this._requestUrl]
  43. if (endpointResponses == null || !has(endpointResponses, this._method)) {
  44. done(new Error(`No fixture for ${this._method} ${url}`))
  45. return this
  46. }
  47. const statusCode = this._getStatusCode()
  48. const body = statusCode === 200 ? endpointResponses[this._method] : {}
  49. done(null, { body, statusCode }, body)
  50. }
  51. return this
  52. }
  53. on (evt, cb) {
  54. if (evt === 'response') {
  55. const stream = fs.createReadStream('./README.md')
  56. stream.statusCode = this._getStatusCode()
  57. cb(stream)
  58. }
  59. return this
  60. }
  61. }
  62. module.exports = () => {
  63. return (options) => new MockPurest(options)
  64. }