Welcome to mirror list, hosted at ThFree Co, Russian Federation.

mock-npm.js « fixtures « test « npm « deps - github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: e3be10b4b9aa3fd82abacf258434e0ecf1ee3e0e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
const npmlog = require('npmlog')
const procLog = require('../../lib/utils/proc-log-listener.js')
procLog.reset()

const realLog = {}
for (const level in npmlog.levels)
  realLog[level] = npmlog[level]

const { title, execPath } = process

const RealMockNpm = (t, otherMocks = {}) => {
  t.teardown(() => {
    npm.perfStop()
    npmlog.record.length = 0
    for (const level in npmlog.levels)
      npmlog[level] = realLog[level]
    procLog.reset()
    process.title = title
    process.execPath = execPath
    delete process.env.npm_command
    delete process.env.COLOR
  })
  const logs = []
  const outputs = []
  const npm = t.mock('../../lib/npm.js', otherMocks)
  const command = async (command, args = []) => {
    return new Promise((resolve, reject) => {
      npm.commands[command](args, err => {
        if (err)
          return reject(err)
        return resolve()
      })
    })
  }
  for (const level in npmlog.levels) {
    npmlog[level] = (...msg) => {
      logs.push([level, ...msg])

      const l = npmlog.level
      npmlog.level = 'silent'
      realLog[level](...msg)
      npmlog.level = l
    }
  }
  npm.output = (...msg) => outputs.push(msg)
  return { npm, logs, outputs, command }
}

const realConfig = require('../../lib/utils/config')

// Basic npm fixture that you can give a config object that acts like
// npm.config You still need a separate flatOptions. Tests should migrate to
// using the real npm mock above
class MockNpm {
  constructor (base = {}) {
    this._mockOutputs = []
    this.isMockNpm = true
    this.base = base

    const config = base.config || {}

    for (const attr in base) {
      if (attr !== 'config') {
        this[attr] = base[attr]
      }
    }

    this.flatOptions = base.flatOptions || {}
    this.config = {
      // for now just set `find` to what config.find should return
      // this works cause `find` is not an existing config entry
      find: (k) => ({...realConfig.defaults, ...config})[k],
      get: (k) => ({...realConfig.defaults, ...config})[k],
      set: (k, v) => config[k] = v,
      list: [{ ...realConfig.defaults, ...config}]
    }
    if (!this.log) {
      this.log = {
        clearProgress: () => {},
        disableProgress: () => {},
        enableProgress: () => {},
        http: () => {},
        info: () => {},
        levels: [],
        notice: () => {},
        pause: () => {},
        silly: () => {},
        verbose: () => {},
        warn: () => {},
      }
    }
  }

  output(...msg) {
    if (this.base.output)
      return this.base.output(msg)
    this._mockOutputs.push(msg)
  }
}

const FakeMockNpm = (base = {}) => {
    return new MockNpm(base)
}

module.exports = {
  fake: FakeMockNpm,
  real: RealMockNpm
}