refactor edit, add tests · npm/cli@3a6dd51 (original) (raw)

``

1

`+

const { test } = require('tap')

`

``

2

`+

const { resolve } = require('path')

`

``

3

`+

const requireInject = require('require-inject')

`

``

4

`+

const { EventEmitter } = require('events')

`

``

5

+

``

6

`+

let editorBin = null

`

``

7

`+

let editorArgs = null

`

``

8

`+

let editorOpts = null

`

``

9

`+

let EDITOR_CODE = 0

`

``

10

`+

const childProcess = {

`

``

11

`+

spawn: (bin, args, opts) => {

`

``

12

`+

// save for assertions

`

``

13

`+

editorBin = bin

`

``

14

`+

editorArgs = args

`

``

15

`+

editorOpts = opts

`

``

16

+

``

17

`+

const editorEvents = new EventEmitter()

`

``

18

`+

process.nextTick(() => {

`

``

19

`+

editorEvents.emit('exit', EDITOR_CODE)

`

``

20

`+

})

`

``

21

`+

return editorEvents

`

``

22

`+

},

`

``

23

`+

}

`

``

24

+

``

25

`+

let rebuildArgs = null

`

``

26

`+

let EDITOR = 'vim'

`

``

27

`+

const npm = {

`

``

28

`+

config: {

`

``

29

`+

get: () => EDITOR,

`

``

30

`+

},

`

``

31

`+

dir: resolve(__dirname, '../../node_modules'),

`

``

32

`+

commands: {

`

``

33

`+

rebuild: (args, cb) => {

`

``

34

`+

rebuildArgs = args

`

``

35

`+

return cb()

`

``

36

`+

},

`

``

37

`+

},

`

``

38

`+

}

`

``

39

+

``

40

`+

const gracefulFs = require('graceful-fs')

`

``

41

`+

const edit = requireInject('../../lib/edit.js', {

`

``

42

`+

'../../lib/npm.js': npm,

`

``

43

`+

child_process: childProcess,

`

``

44

`+

'graceful-fs': gracefulFs,

`

``

45

`+

})

`

``

46

+

``

47

`+

test('npm edit', t => {

`

``

48

`+

t.teardown(() => {

`

``

49

`+

rebuildArgs = null

`

``

50

`+

editorBin = null

`

``

51

`+

editorArgs = null

`

``

52

`+

editorOpts = null

`

``

53

`+

})

`

``

54

+

``

55

`+

return edit(['semver'], (err) => {

`

``

56

`+

if (err)

`

``

57

`+

throw err

`

``

58

+

``

59

`+

const path = resolve(__dirname, '../../node_modules/semver')

`

``

60

`+

t.strictSame(editorBin, EDITOR, 'used the correct editor')

`

``

61

`+

t.strictSame(editorArgs, [path], 'edited the correct directory')

`

``

62

`+

t.strictSame(editorOpts, { stdio: 'inherit' }, 'passed the correct opts')

`

``

63

`+

t.strictSame(rebuildArgs, [path], 'passed the correct path to rebuild')

`

``

64

`+

t.end()

`

``

65

`+

})

`

``

66

`+

})

`

``

67

+

``

68

`+

test('npm edit editor has flags', t => {

`

``

69

`+

EDITOR = 'code -w'

`

``

70

`+

t.teardown(() => {

`

``

71

`+

rebuildArgs = null

`

``

72

`+

editorBin = null

`

``

73

`+

editorArgs = null

`

``

74

`+

editorOpts = null

`

``

75

`+

EDITOR = 'vim'

`

``

76

`+

})

`

``

77

+

``

78

`+

return edit(['semver'], (err) => {

`

``

79

`+

if (err)

`

``

80

`+

throw err

`

``

81

+

``

82

`+

const path = resolve(__dirname, '../../node_modules/semver')

`

``

83

`+

t.strictSame(editorBin, 'code', 'used the correct editor')

`

``

84

`+

t.strictSame(editorArgs, ['-w', path], 'edited the correct directory, keeping flags')

`

``

85

`+

t.strictSame(editorOpts, { stdio: 'inherit' }, 'passed the correct opts')

`

``

86

`+

t.strictSame(rebuildArgs, [path], 'passed the correct path to rebuild')

`

``

87

`+

t.end()

`

``

88

`+

})

`

``

89

`+

})

`

``

90

+

``

91

`+

test('npm edit no args', t => {

`

``

92

`+

return edit([], (err) => {

`

``

93

`+

t.match(err, /npm edit/, 'throws usage error')

`

``

94

`+

t.end()

`

``

95

`+

})

`

``

96

`+

})

`

``

97

+

``

98

`+

test('npm edit lstat error propagates', t => {

`

``

99

`+

const _lstat = gracefulFs.lstat

`

``

100

`+

gracefulFs.lstat = (dir, cb) => {

`

``

101

`+

return cb(new Error('lstat failed'))

`

``

102

`+

}

`

``

103

`+

t.teardown(() => {

`

``

104

`+

gracefulFs.lstat = _lstat

`

``

105

`+

})

`

``

106

+

``

107

`+

return edit(['semver'], (err) => {

`

``

108

`+

t.match(err, /lstat failed/, 'user received correct error')

`

``

109

`+

t.end()

`

``

110

`+

})

`

``

111

`+

})

`

``

112

+

``

113

`+

test('npm edit editor exit code error propagates', t => {

`

``

114

`+

EDITOR_CODE = 137

`

``

115

`+

t.teardown(() => {

`

``

116

`+

EDITOR_CODE = 0

`

``

117

`+

})

`

``

118

+

``

119

`+

return edit(['semver'], (err) => {

`

``

120

`+

t.match(err, /exited with code: 137/, 'user received correct error')

`

``

121

`+

t.end()

`

``

122

`+

})

`

``

123

`+

})

`