@@ -205,7 +205,7 @@ test.serial('Create the package and skip publish', async t => {
205205{ logger :t . context . logger , nextRelease :{ version :'1.0.0' } }
206206) ;
207207
208- t . deepEqual ( result , { name : 'npm package (@latest dist-tag)' , url : undefined } ) ;
208+ t . falsy ( result ) ;
209209t . is ( ( await readJson ( './package.json' ) ) . version , '1.0.0' ) ;
210210t . true ( await pathExists ( `./tarball/${ pkg . name } -1.0.0.tgz` ) ) ;
211211await t . throws ( execa ( 'npm' , [ 'view' , pkg . name , 'version' ] ) ) ;
@@ -221,7 +221,7 @@ test.serial('Create the package and skip publish from a sub-directory', async t
221221{ logger :t . context . logger , nextRelease :{ version :'1.0.0' } }
222222) ;
223223
224- t . deepEqual ( result , { name : 'npm package (@latest dist-tag)' , url : undefined } ) ;
224+ t . falsy ( result ) ;
225225t . is ( ( await readJson ( './dist/package.json' ) ) . version , '1.0.0' ) ;
226226t . true ( await pathExists ( `./tarball/${ pkg . name } -1.0.0.tgz` ) ) ;
227227await t . throws ( execa ( 'npm' , [ 'view' , pkg . name , 'version' ] ) ) ;
@@ -257,12 +257,78 @@ test.serial('Throw SemanticReleaseError Array if config option are not valid in
257257t . is ( errors [ 3 ] . code , 'ENOPKGNAME' ) ;
258258} ) ;
259259
260- test . serial ( 'Verify token and set up auth only on the fist call' , async t => {
260+ test . serial ( 'Prepare the package' , async t => {
261+ Object . assign ( process . env , npmRegistry . authEnv ) ;
262+ const pkg = { name :'prepare' , version :'0.0.0' , publishConfig :{ registry :npmRegistry . url } } ;
263+ await outputJson ( './package.json' , pkg ) ;
264+
265+ await t . context . m . prepare ( { } , { logger :t . context . logger , nextRelease :{ version :'1.0.0' } } ) ;
266+
267+ t . is ( ( await readJson ( './package.json' ) ) . version , '1.0.0' ) ;
268+ t . false ( await pathExists ( `./${ pkg . name } -1.0.0.tgz` ) ) ;
269+ } ) ;
270+
271+ test . serial ( 'Prepare the package from a sub-directory' , async t => {
272+ Object . assign ( process . env , npmRegistry . authEnv ) ;
273+ const pkg = { name :'prepare-sub-dir' , version :'0.0.0' , publishConfig :{ registry :npmRegistry . url } } ;
274+ await outputJson ( './dist/package.json' , pkg ) ;
275+
276+ await t . context . m . prepare ( { pkgRoot :'dist' } , { logger :t . context . logger , nextRelease :{ version :'1.0.0' } } ) ;
277+
278+ t . is ( ( await readJson ( './dist/package.json' ) ) . version , '1.0.0' ) ;
279+ t . false ( await pathExists ( `./${ pkg . name } -1.0.0.tgz` ) ) ;
280+ } ) ;
281+
282+ test . serial ( 'Create the package in prepare step' , async t => {
283+ const pkg = { name :'prepare-pkg' , version :'0.0.0' , publishConfig :{ registry :npmRegistry . url } } ;
284+ await outputJson ( './package.json' , pkg ) ;
285+
286+ await t . context . m . prepare (
287+ { npmPublish :false , tarballDir :'tarball' } ,
288+ { logger :t . context . logger , nextRelease :{ version :'1.0.0' } }
289+ ) ;
290+
291+ t . is ( ( await readJson ( './package.json' ) ) . version , '1.0.0' ) ;
292+ t . true ( await pathExists ( `./tarball/${ pkg . name } -1.0.0.tgz` ) ) ;
293+ } ) ;
294+
295+ test . serial ( 'Throw SemanticReleaseError Array if config option are not valid in prepare' , async t => {
296+ const pkg = { publishConfig :{ registry :npmRegistry . url } } ;
297+ await outputJson ( './package.json' , pkg ) ;
298+ const npmPublish = 42 ;
299+ const tarballDir = 42 ;
300+ const pkgRoot = 42 ;
301+
302+ const errors = [
303+ ...( await t . throws (
304+ t . context . m . prepare (
305+ { npmPublish, tarballDir, pkgRoot} ,
306+ {
307+ options :{ publish :[ '@semantic-release/github' , '@semantic-release/npm' ] } ,
308+ nextRelease :{ version :'1.0.0' } ,
309+ logger :t . context . logger ,
310+ }
311+ )
312+ ) ) ,
313+ ] ;
314+
315+ t . is ( errors [ 0 ] . name , 'SemanticReleaseError' ) ;
316+ t . is ( errors [ 0 ] . code , 'EINVALIDNPMPUBLISH' ) ;
317+ t . is ( errors [ 1 ] . name , 'SemanticReleaseError' ) ;
318+ t . is ( errors [ 1 ] . code , 'EINVALIDTARBALLDIR' ) ;
319+ t . is ( errors [ 2 ] . name , 'SemanticReleaseError' ) ;
320+ t . is ( errors [ 2 ] . code , 'EINVALIDPKGROOT' ) ;
321+ t . is ( errors [ 3 ] . name , 'SemanticReleaseError' ) ;
322+ t . is ( errors [ 3 ] . code , 'ENOPKGNAME' ) ;
323+ } ) ;
324+
325+ test . serial ( 'Verify token and set up auth only on the fist call, then prepare on prepare call only' , async t => {
261326Object . assign ( process . env , npmRegistry . authEnv ) ;
262327const pkg = { name :'test-module' , version :'0.0.0-dev' , publishConfig :{ registry :npmRegistry . url } } ;
263328await outputJson ( './package.json' , pkg ) ;
264329
265330await t . notThrows ( t . context . m . verifyConditions ( { } , { options :{ } , logger :t . context . logger } ) ) ;
331+ await t . context . m . prepare ( { } , { logger :t . context . logger , nextRelease :{ version :'1.0.0' } } ) ;
266332
267333const result = await t . context . m . publish ( { } , { logger :t . context . logger , nextRelease :{ version :'1.0.0' } } ) ;
268334t . deepEqual ( result , { name :'npm package (@latest dist-tag)' , url :undefined } ) ;