@@ -270,14 +270,45 @@ const packument = (nv, opts) => {
270270 } ,
271271 } ,
272272 } ,
273+ // this is a packaged named error which will conflict with
274+ // the error key in json output
275+ error : {
276+ _id : 'error' ,
277+ name : 'error' ,
278+ 'dist-tags' : {
279+ latest : '1.0.0' ,
280+ } ,
281+ versions : {
282+ '1.0.0' : {
283+ name : 'error' ,
284+ version : '1.0.0' ,
285+ dist : {
286+ shasum : '123' ,
287+ tarball : 'http://hm.error.com/1.0.0.tgz' ,
288+ fileCount : 1 ,
289+ } ,
290+ } ,
291+ } ,
292+ } ,
273293 }
294+
274295 if ( nv . type === 'git' ) {
275296 return mocks [ nv . hosted . project ]
276297 }
298+
277299 if ( nv . raw === './blue' ) {
278300 return mocks . blue
279301 }
280- return mocks [ nv . name ]
302+
303+ if ( mocks [ nv . name ] ) {
304+ return mocks [ nv . name ]
305+ }
306+
307+ if ( nv . name === 'unknown-error' ) {
308+ throw new Error ( 'Unknown error' )
309+ }
310+
311+ throw Object . assign ( new Error ( '404' ) , { code : 'E404' } )
281312}
282313
283314const loadMockNpm = async function ( t , opts = { } ) {
@@ -543,6 +574,33 @@ t.test('workspaces', async t => {
543574 } ,
544575 }
545576
577+ const prefixDir404 = {
578+ 'test-workspace-b' : {
579+ 'package.json' : JSON . stringify ( {
580+ name : 'missing-package' ,
581+ version : '1.2.3' ,
582+ } ) ,
583+ } ,
584+ }
585+
586+ const prefixDirError = {
587+ 'test-workspace-b' : {
588+ 'package.json' : JSON . stringify ( {
589+ name : 'unknown-error' ,
590+ version : '1.2.3' ,
591+ } ) ,
592+ } ,
593+ }
594+
595+ const prefixPackageNamedError = {
596+ 'test-workspace-a' : {
597+ 'package.json' : JSON . stringify ( {
598+ name : 'error' ,
599+ version : '1.2.3' ,
600+ } ) ,
601+ } ,
602+ }
603+
546604 t . test ( 'all workspaces' , async t => {
547605 const { view, joinedOutput } = await loadMockNpm ( t , {
548606 prefixDir,
@@ -624,6 +682,56 @@ t.test('workspaces', async t => {
624682 t . matchSnapshot ( joinedOutput ( ) )
625683 t . matchSnapshot ( logs . warn , 'should have warning of ignoring workspaces' )
626684 } )
685+
686+ t . test ( '404 workspaces' , async t => {
687+ t . test ( 'basic' , async t => {
688+ const { view, joinedFullOutput } = await loadMockNpm ( t , {
689+ prefixDir : { ...prefixDir , ...prefixDir404 } ,
690+ config : { workspaces : true , loglevel : 'error' } ,
691+ } )
692+ await view . exec ( [ ] )
693+ t . matchSnapshot ( joinedFullOutput ( ) )
694+ t . equal ( process . exitCode , 1 )
695+ } )
696+
697+ t . test ( 'json' , async t => {
698+ const { view, joinedFullOutput } = await loadMockNpm ( t , {
699+ prefixDir : { ...prefixDir , ...prefixDir404 } ,
700+ config : { workspaces : true , json : true , loglevel : 'error' } ,
701+ } )
702+ await view . exec ( [ ] )
703+ t . matchSnapshot ( joinedFullOutput ( ) )
704+ t . equal ( process . exitCode , 1 )
705+ } )
706+
707+ t . test ( 'json with package named error' , async t => {
708+ const { view, joinedFullOutput } = await loadMockNpm ( t , {
709+ prefixDir : { ...prefixDir , ...prefixDir404 , ...prefixPackageNamedError } ,
710+ config : { workspaces : true , json : true , loglevel : 'warn' } ,
711+ } )
712+ await view . exec ( [ ] )
713+ t . matchSnapshot ( joinedFullOutput ( ) )
714+ t . equal ( process . exitCode , 1 )
715+ } )
716+
717+ t . test ( 'non-404 error rejects' , async t => {
718+ const { view, joinedFullOutput } = await loadMockNpm ( t , {
719+ prefixDir : { ...prefixDir , ...prefixDirError } ,
720+ config : { workspaces : true , loglevel : 'error' } ,
721+ } )
722+ await t . rejects ( view . exec ( [ ] ) )
723+ t . matchSnapshot ( joinedFullOutput ( ) )
724+ } )
725+
726+ t . test ( 'non-404 error rejects with single arg' , async t => {
727+ const { view, joinedFullOutput } = await loadMockNpm ( t , {
728+ prefixDir : { ...prefixDir , ...prefixDirError } ,
729+ config : { workspaces : true , loglevel : 'error' } ,
730+ } )
731+ await t . rejects ( view . exec ( [ '.' , 'version' ] ) )
732+ t . matchSnapshot ( joinedFullOutput ( ) )
733+ } )
734+ } )
627735} )
628736
629737t . test ( 'completion' , async t => {
0 commit comments