398 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			398 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const test = require('ava');
 | |
| const normalize = require('../../lib/branches/normalize');
 | |
| 
 | |
| const toTags = (versions) => versions.map((version) => ({version}));
 | |
| 
 | |
| test('Maintenance branches - initial state', (t) => {
 | |
|   const maintenance = [
 | |
|     {name: '1.x', channel: '1.x', tags: []},
 | |
|     {name: '1.1.x', tags: []},
 | |
|     {name: '1.2.x', tags: []},
 | |
|   ];
 | |
|   const release = [{name: 'master', tags: []}];
 | |
|   t.deepEqual(
 | |
|     normalize.maintenance({maintenance, release}).map(({type, name, range, accept, channel, mergeRange}) => ({
 | |
|       type,
 | |
|       name,
 | |
|       range,
 | |
|       accept,
 | |
|       channel,
 | |
|       mergeRange,
 | |
|     })),
 | |
|     [
 | |
|       {
 | |
|         type: 'maintenance',
 | |
|         name: '1.1.x',
 | |
|         range: '>=1.1.0 <1.0.0',
 | |
|         accept: [],
 | |
|         channel: '1.1.x',
 | |
|         mergeRange: '>=1.1.0 <1.2.0',
 | |
|       },
 | |
|       {
 | |
|         type: 'maintenance',
 | |
|         name: '1.2.x',
 | |
|         range: '>=1.2.0 <1.0.0',
 | |
|         accept: [],
 | |
|         channel: '1.2.x',
 | |
|         mergeRange: '>=1.2.0 <1.3.0',
 | |
|       },
 | |
|       {
 | |
|         type: 'maintenance',
 | |
|         name: '1.x',
 | |
|         range: '>=1.3.0 <1.0.0',
 | |
|         accept: [],
 | |
|         channel: '1.x',
 | |
|         mergeRange: '>=1.3.0 <2.0.0',
 | |
|       },
 | |
|     ]
 | |
|   );
 | |
| });
 | |
| 
 | |
| test('Maintenance branches - cap range to first release present on default branch and not in any Maintenance one', (t) => {
 | |
|   const maintenance = [
 | |
|     {name: '1.x', tags: toTags(['1.0.0', '1.1.0', '1.1.1', '1.2.0', '1.2.1', '1.3.0', '1.4.0', '1.5.0'])},
 | |
|     {name: 'name', range: '1.1.x', tags: toTags(['1.0.0', '1.0.1', '1.1.0', '1.1.1'])},
 | |
|     {name: '1.2.x', tags: toTags(['1.0.0', '1.1.0', '1.1.1', '1.2.0', '1.2.1'])},
 | |
|     {name: '2.x.x', tags: toTags(['1.0.0', '1.1.0', '1.1.1', '1.2.0', '1.2.1', '1.5.0'])},
 | |
|   ];
 | |
|   const release = [
 | |
|     {
 | |
|       name: 'master',
 | |
|       tags: toTags(['1.0.0', '1.1.0', '1.1.1', '1.2.0', '1.2.1', '1.3.0', '1.4.0', '1.5.0', '1.6.0', '2.0.0']),
 | |
|     },
 | |
|   ];
 | |
| 
 | |
|   t.deepEqual(
 | |
|     normalize
 | |
|       .maintenance({maintenance, release})
 | |
|       .map(({type, name, range, accept, channel, mergeRange: maintenanceRange}) => ({
 | |
|         type,
 | |
|         name,
 | |
|         range,
 | |
|         accept,
 | |
|         channel,
 | |
|         mergeRange: maintenanceRange,
 | |
|       })),
 | |
|     [
 | |
|       {
 | |
|         type: 'maintenance',
 | |
|         name: 'name',
 | |
|         range: '>=1.1.1 <1.2.0',
 | |
|         accept: ['patch'],
 | |
|         channel: 'name',
 | |
|         mergeRange: '>=1.1.0 <1.2.0',
 | |
|       },
 | |
|       {
 | |
|         type: 'maintenance',
 | |
|         name: '1.2.x',
 | |
|         range: '>=1.2.1 <1.3.0',
 | |
|         accept: ['patch'],
 | |
|         channel: '1.2.x',
 | |
|         mergeRange: '>=1.2.0 <1.3.0',
 | |
|       },
 | |
|       {
 | |
|         type: 'maintenance',
 | |
|         name: '1.x',
 | |
|         range: '>=1.5.0 <1.6.0',
 | |
|         accept: ['patch'],
 | |
|         channel: '1.x',
 | |
|         mergeRange: '>=1.3.0 <2.0.0',
 | |
|       },
 | |
|       {
 | |
|         type: 'maintenance',
 | |
|         name: '2.x.x',
 | |
|         range: '>=2.0.0 <1.6.0',
 | |
|         accept: [],
 | |
|         channel: '2.x.x',
 | |
|         mergeRange: '>=2.0.0 <3.0.0',
 | |
|       },
 | |
|     ]
 | |
|   );
 | |
| });
 | |
| 
 | |
| test('Maintenance branches - cap range to default branch last release if all release are also present on maintenance branch', (t) => {
 | |
|   const maintenance = [
 | |
|     {name: '1.x', tags: toTags(['1.0.0', '1.2.0', '1.3.0'])},
 | |
|     {name: '2.x.x', tags: toTags(['1.0.0', '1.2.0', '1.3.0', '2.0.0'])},
 | |
|   ];
 | |
|   const release = [{name: 'master', tags: toTags(['1.0.0', '1.2.0', '1.3.0', '2.0.0'])}];
 | |
| 
 | |
|   t.deepEqual(
 | |
|     normalize.maintenance({maintenance, release}).map(({type, name, range, accept, channel, mergeRange}) => ({
 | |
|       type,
 | |
|       name,
 | |
|       range,
 | |
|       accept,
 | |
|       channel,
 | |
|       mergeRange,
 | |
|     })),
 | |
|     [
 | |
|       {
 | |
|         type: 'maintenance',
 | |
|         name: '1.x',
 | |
|         range: '>=1.3.0 <2.0.0',
 | |
|         accept: ['patch', 'minor'],
 | |
|         channel: '1.x',
 | |
|         mergeRange: '>=1.0.0 <2.0.0',
 | |
|       },
 | |
|       {
 | |
|         type: 'maintenance',
 | |
|         name: '2.x.x',
 | |
|         range: '>=2.0.0 <2.0.0',
 | |
|         accept: [],
 | |
|         channel: '2.x.x',
 | |
|         mergeRange: '>=2.0.0 <3.0.0',
 | |
|       },
 | |
|     ]
 | |
|   );
 | |
| });
 | |
| 
 | |
| test('Release branches - initial state', (t) => {
 | |
|   const release = [
 | |
|     {name: 'master', tags: []},
 | |
|     {name: 'next', channel: 'next', tags: []},
 | |
|     {name: 'next-major', tags: []},
 | |
|   ];
 | |
| 
 | |
|   t.deepEqual(
 | |
|     normalize
 | |
|       .release({release})
 | |
|       .map(({type, name, range, accept, channel, main}) => ({type, name, range, accept, channel, main})),
 | |
|     [
 | |
|       {
 | |
|         type: 'release',
 | |
|         name: 'master',
 | |
|         range: '>=1.0.0',
 | |
|         accept: ['patch', 'minor', 'major'],
 | |
|         channel: undefined,
 | |
|         main: true,
 | |
|       },
 | |
|       {
 | |
|         type: 'release',
 | |
|         name: 'next',
 | |
|         range: '>=1.0.0',
 | |
|         accept: ['patch', 'minor', 'major'],
 | |
|         channel: 'next',
 | |
|         main: false,
 | |
|       },
 | |
|       {
 | |
|         type: 'release',
 | |
|         name: 'next-major',
 | |
|         range: '>=1.0.0',
 | |
|         accept: ['patch', 'minor', 'major'],
 | |
|         channel: 'next-major',
 | |
|         main: false,
 | |
|       },
 | |
|     ]
 | |
|   );
 | |
| });
 | |
| 
 | |
| test('Release branches - 3 release branches', (t) => {
 | |
|   const release = [
 | |
|     {name: 'master', tags: toTags(['1.0.0', '1.0.1', '1.0.2'])},
 | |
|     {name: 'next', tags: toTags(['1.0.0', '1.0.1', '1.0.2', '1.1.0', '1.2.0'])},
 | |
|     {name: 'next-major', tags: toTags(['1.0.0', '1.0.1', '1.0.2', '1.1.0', '1.2.0', '2.0.0', '2.0.1', '2.1.0'])},
 | |
|   ];
 | |
| 
 | |
|   t.deepEqual(
 | |
|     normalize
 | |
|       .release({release})
 | |
|       .map(({type, name, range, accept, channel, main}) => ({type, name, range, accept, channel, main})),
 | |
|     [
 | |
|       {type: 'release', name: 'master', range: '>=1.0.2 <1.1.0', accept: ['patch'], channel: undefined, main: true},
 | |
|       {
 | |
|         type: 'release',
 | |
|         name: 'next',
 | |
|         range: '>=1.2.0 <2.0.0',
 | |
|         accept: ['patch', 'minor'],
 | |
|         channel: 'next',
 | |
|         main: false,
 | |
|       },
 | |
|       {
 | |
|         type: 'release',
 | |
|         name: 'next-major',
 | |
|         range: '>=2.1.0',
 | |
|         accept: ['patch', 'minor', 'major'],
 | |
|         channel: 'next-major',
 | |
|         main: false,
 | |
|       },
 | |
|     ]
 | |
|   );
 | |
| });
 | |
| 
 | |
| test('Release branches - 2 release branches', (t) => {
 | |
|   const release = [
 | |
|     {name: 'master', tags: toTags(['1.0.0', '1.0.1', '1.1.0', '1.1.1', '1.2.0'])},
 | |
|     {name: 'next', tags: toTags(['1.0.0', '1.0.1', '1.1.0', '1.1.1', '1.2.0', '2.0.0', '2.0.1', '2.1.0'])},
 | |
|   ];
 | |
| 
 | |
|   t.deepEqual(
 | |
|     normalize
 | |
|       .release({release})
 | |
|       .map(({type, name, range, accept, channel, main}) => ({type, name, range, accept, channel, main})),
 | |
|     [
 | |
|       {
 | |
|         type: 'release',
 | |
|         name: 'master',
 | |
|         range: '>=1.2.0 <2.0.0',
 | |
|         accept: ['patch', 'minor'],
 | |
|         channel: undefined,
 | |
|         main: true,
 | |
|       },
 | |
|       {
 | |
|         type: 'release',
 | |
|         name: 'next',
 | |
|         range: '>=2.1.0',
 | |
|         accept: ['patch', 'minor', 'major'],
 | |
|         channel: 'next',
 | |
|         main: false,
 | |
|       },
 | |
|     ]
 | |
|   );
 | |
| });
 | |
| 
 | |
| test('Release branches - 1 release branches', (t) => {
 | |
|   const release = [{name: 'master', tags: toTags(['1.0.0', '1.1.0', '1.1.1', '1.2.0'])}];
 | |
| 
 | |
|   t.deepEqual(
 | |
|     normalize.release({release}).map(({type, name, range, accept, channel}) => ({type, name, range, accept, channel})),
 | |
|     [{type: 'release', name: 'master', range: '>=1.2.0', accept: ['patch', 'minor', 'major'], channel: undefined}]
 | |
|   );
 | |
| });
 | |
| 
 | |
| test('Release branches - cap ranges to first release only present on following branch', (t) => {
 | |
|   const release = [
 | |
|     {name: 'master', tags: toTags(['1.0.0', '1.1.0', '1.2.0', '2.0.0'])},
 | |
|     {name: 'next', tags: toTags(['1.0.0', '1.1.0', '1.2.0', '2.0.0', '2.1.0'])},
 | |
|     {name: 'next-major', tags: toTags(['1.0.0', '1.1.0', '1.2.0', '2.0.0', '2.1.0', '2.2.0'])},
 | |
|   ];
 | |
| 
 | |
|   t.deepEqual(
 | |
|     normalize
 | |
|       .release({release})
 | |
|       .map(({type, name, range, accept, channel, main}) => ({type, name, range, accept, channel, main})),
 | |
|     [
 | |
|       {type: 'release', name: 'master', range: '>=2.0.0 <2.1.0', accept: ['patch'], channel: undefined, main: true},
 | |
|       {type: 'release', name: 'next', range: '>=2.1.0 <2.2.0', accept: ['patch'], channel: 'next', main: false},
 | |
|       {
 | |
|         type: 'release',
 | |
|         name: 'next-major',
 | |
|         range: '>=2.2.0',
 | |
|         accept: ['patch', 'minor', 'major'],
 | |
|         channel: 'next-major',
 | |
|         main: false,
 | |
|       },
 | |
|     ]
 | |
|   );
 | |
| });
 | |
| 
 | |
| test('Release branches - Handle missing previous tags in branch history', (t) => {
 | |
|   const release = [
 | |
|     {name: 'master', tags: toTags(['1.0.0', '2.0.0'])},
 | |
|     {name: 'next', tags: toTags(['1.0.0', '1.1.0', '1.1.1', '1.2.0', '2.0.0'])},
 | |
|   ];
 | |
| 
 | |
|   t.deepEqual(
 | |
|     normalize
 | |
|       .release({release})
 | |
|       .map(({type, name, range, accept, channel, main}) => ({type, name, range, accept, channel, main})),
 | |
|     [
 | |
|       {
 | |
|         type: 'release',
 | |
|         name: 'master',
 | |
|         range: '>=2.0.0',
 | |
|         accept: ['patch', 'minor', 'major'],
 | |
|         channel: undefined,
 | |
|         main: true,
 | |
|       },
 | |
|       {
 | |
|         type: 'release',
 | |
|         name: 'next',
 | |
|         range: '>=2.0.0',
 | |
|         accept: ['patch', 'minor', 'major'],
 | |
|         channel: 'next',
 | |
|         main: false,
 | |
|       },
 | |
|     ]
 | |
|   );
 | |
| });
 | |
| 
 | |
| test('Release branches - limit releases on 2nd and 3rd branch based on 1st branch last release', (t) => {
 | |
|   const release = [
 | |
|     {name: 'master', tags: toTags(['1.0.0', '1.1.0', '2.0.0', '3.0.0'])},
 | |
|     {name: 'next', tags: toTags(['1.0.0', '1.1.0'])},
 | |
|     {name: 'next-major', tags: toTags(['1.0.0', '1.1.0', '2.0.0'])},
 | |
|   ];
 | |
| 
 | |
|   t.deepEqual(
 | |
|     normalize
 | |
|       .release({release})
 | |
|       .map(({type, name, range, accept, channel, main}) => ({type, name, range, accept, channel, main})),
 | |
|     [
 | |
|       {
 | |
|         type: 'release',
 | |
|         name: 'master',
 | |
|         range: '>=3.0.0',
 | |
|         accept: ['patch', 'minor', 'major'],
 | |
|         channel: undefined,
 | |
|         main: true,
 | |
|       },
 | |
|       {
 | |
|         type: 'release',
 | |
|         name: 'next',
 | |
|         range: '>=3.0.0',
 | |
|         accept: ['patch', 'minor', 'major'],
 | |
|         channel: 'next',
 | |
|         main: false,
 | |
|       },
 | |
|       {
 | |
|         type: 'release',
 | |
|         name: 'next-major',
 | |
|         range: '>=3.0.0',
 | |
|         accept: ['patch', 'minor', 'major'],
 | |
|         channel: 'next-major',
 | |
|         main: false,
 | |
|       },
 | |
|     ]
 | |
|   );
 | |
| });
 | |
| 
 | |
| test('Prerelease branches', (t) => {
 | |
|   const prerelease = [
 | |
|     {name: 'beta', channel: 'beta', prerelease: true, tags: []},
 | |
|     {name: 'alpha', prerelease: 'preview', tags: []},
 | |
|   ];
 | |
| 
 | |
|   t.deepEqual(
 | |
|     normalize.prerelease({prerelease}).map(({type, name, channel}) => ({type, name, channel})),
 | |
|     [
 | |
|       {type: 'prerelease', name: 'beta', channel: 'beta'},
 | |
|       {type: 'prerelease', name: 'alpha', channel: 'alpha'},
 | |
|     ]
 | |
|   );
 | |
| });
 | |
| 
 | |
| test('Allow to set channel to "false" to prevent default', (t) => {
 | |
|   const maintenance = [{name: '1.x', channel: false, tags: []}];
 | |
|   const release = [
 | |
|     {name: 'master', channel: false, tags: []},
 | |
|     {name: 'next', channel: false, tags: []},
 | |
|   ];
 | |
|   const prerelease = [{name: 'beta', channel: false, prerelease: true, tags: []}];
 | |
|   t.deepEqual(
 | |
|     normalize.maintenance({maintenance, release}).map(({name, channel}) => ({name, channel})),
 | |
|     [{name: '1.x', channel: false}]
 | |
|   );
 | |
|   t.deepEqual(
 | |
|     normalize.release({release}).map(({name, channel}) => ({name, channel})),
 | |
|     [
 | |
|       {name: 'master', channel: false},
 | |
|       {name: 'next', channel: false},
 | |
|     ]
 | |
|   );
 | |
|   t.deepEqual(
 | |
|     normalize.prerelease({prerelease}).map(({name, channel}) => ({name, channel})),
 | |
|     [{name: 'beta', channel: false}]
 | |
|   );
 | |
| });
 |