You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					549 lines
				
				9.3 KiB
			
		
		
			
		
	
	
					549 lines
				
				9.3 KiB
			| 
											3 years ago
										 | 'use strict' | ||
|  | 
 | ||
|  | const { test } = require('tap') | ||
|  | const SemVerStore = require('./index') | ||
|  | 
 | ||
|  | test('Should create a store', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store | ||
|  |     .set('1.2.3', 1) | ||
|  |     .set('1.2.4', 2) | ||
|  |     .set('1.3.0', 3) | ||
|  | 
 | ||
|  |   t.deepEqual(store.tree, { | ||
|  |     prefix: 0, | ||
|  |     store: null, | ||
|  |     childrenPrefixes: [1], | ||
|  |     children: { | ||
|  |       1: { | ||
|  |         prefix: 1, | ||
|  |         store: null, | ||
|  |         childrenPrefixes: [2, 3], | ||
|  |         children: { | ||
|  |           2: { | ||
|  |             prefix: 2, | ||
|  |             store: null, | ||
|  |             childrenPrefixes: [3, 4], | ||
|  |             children: { | ||
|  |               3: { | ||
|  |                 prefix: 3, | ||
|  |                 store: 1, | ||
|  |                 childrenPrefixes: [], | ||
|  |                 children: null | ||
|  |               }, | ||
|  |               4: { | ||
|  |                 prefix: 4, | ||
|  |                 store: 2, | ||
|  |                 childrenPrefixes: [], | ||
|  |                 children: null | ||
|  |               } | ||
|  |             } | ||
|  |           }, | ||
|  |           3: { | ||
|  |             prefix: 3, | ||
|  |             store: null, | ||
|  |             childrenPrefixes: [0], | ||
|  |             children: { | ||
|  |               0: { | ||
|  |                 prefix: 0, | ||
|  |                 store: 3, | ||
|  |                 childrenPrefixes: [], | ||
|  |                 children: null | ||
|  |               } | ||
|  |             } | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Should get the leaf', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store | ||
|  |     .set('1.2.3', 1) | ||
|  |     .set('1.2.4', 2) | ||
|  |     .set('1.3.0', 3) | ||
|  | 
 | ||
|  |   t.strictEqual(store.get('1.2.4'), 2) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Should get the leaf (wildcard) / 1', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store | ||
|  |     .set('1.2.3', 1) | ||
|  |     .set('1.2.4', 2) | ||
|  |     .set('1.3.0', 3) | ||
|  | 
 | ||
|  |   t.strictEqual(store.get('1.2.x'), 2) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Should get the leaf (wildcard) / 2', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store | ||
|  |     .set('1.2.3', 1) | ||
|  |     .set('1.2.4', 2) | ||
|  |     .set('1.3.0', 3) | ||
|  | 
 | ||
|  |   t.strictEqual(store.get('1.x'), 3) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Should get the leaf (wildcard) / 3', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store | ||
|  |     .set('1.2.3', 1) | ||
|  |     .set('1.2.4', 2) | ||
|  |     .set('1.3.0', 3) | ||
|  | 
 | ||
|  |   t.strictEqual(store.get('2.2.x'), null) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Should get the leaf (wildcard) / 4', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store | ||
|  |     .set('1.2.3', 1) | ||
|  |     .set('1.2.4', 2) | ||
|  |     .set('1.3.0', 3) | ||
|  | 
 | ||
|  |   t.strictEqual(store.get('2.x'), null) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Should get the leaf (wildcard) / 5', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store | ||
|  |     .set('1.0.0', 1) | ||
|  |     .set('1.0.1', 2) | ||
|  |     .set('1.0.2', 3) | ||
|  | 
 | ||
|  |   t.strictEqual(store.get('*'), 3) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Should get the leaf (wildcard) / 6', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store | ||
|  |     .set('1.0.0', 1) | ||
|  |     .set('1.1.0', 2) | ||
|  |     .set('1.0.2', 3) | ||
|  | 
 | ||
|  |   t.strictEqual(store.get('*'), 2) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Should get the leaf (wildcard) / 7', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store | ||
|  |     .set('2.0.0', 1) | ||
|  |     .set('1.1.0', 2) | ||
|  |     .set('2.0.2', 3) | ||
|  | 
 | ||
|  |   t.strictEqual(store.get('*'), 3) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Missing patch', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store | ||
|  |     .set('1.2.3', 1) | ||
|  |     .set('1.2.4', 2) | ||
|  |     .set('1.3.0', 3) | ||
|  | 
 | ||
|  |   t.strictEqual(store.get('1.2'), 2) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Should get the leaf - 404', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store | ||
|  |     .set('1.2.3', 1) | ||
|  |     .set('1.2.4', 2) | ||
|  |     .set('1.3.0', 3) | ||
|  | 
 | ||
|  |   t.strictEqual(store.get('1.2.5'), null) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Should get the leaf (bad formatted semver) / 1', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store | ||
|  |     .set('1.2.3', 1) | ||
|  |     .set('1.2.4', 2) | ||
|  |     .set('1.3.0', 3) | ||
|  | 
 | ||
|  |   t.strictEqual(store.get('1.2.a'), null) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Should get the leaf (bad formatted semver) / 2', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store | ||
|  |     .set('1.2.3', 1) | ||
|  |     .set('1.2.4', 2) | ||
|  |     .set('1.3.0', 3) | ||
|  | 
 | ||
|  |   t.strictEqual(store.get('1.a'), null) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Big numbers', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store | ||
|  |     .set('1.22.34', 1) | ||
|  |     .set('2.32.456', 2) | ||
|  |     .set('345.432.34', 3) | ||
|  |     .set('343.432.36', 4) | ||
|  |     .set('343.432.342', 5) | ||
|  |     .set('343.435.367', 6) | ||
|  |     .set('342.435.34', 7) | ||
|  |     .set('341.432.34', 8) | ||
|  | 
 | ||
|  |   t.strictEqual(store.get('343.x'), 6) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Delete a version / 1', t => { | ||
|  |   t.plan(4) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store | ||
|  |     .set('1.2.3', 1) | ||
|  |     .set('1.2.4', 2) | ||
|  | 
 | ||
|  |   t.strictEqual(store.get('1.2.3'), 1) | ||
|  |   t.strictEqual(store.get('1.2.4'), 2) | ||
|  | 
 | ||
|  |   store.del('1.2.3') | ||
|  | 
 | ||
|  |   t.strictEqual(store.get('1.2.3'), null) | ||
|  |   t.strictEqual(store.get('1.2.4'), 2) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Delete a version / 2', t => { | ||
|  |   t.plan(2) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store | ||
|  |     .set('1.2.3', 1) | ||
|  |     .set('1.2.4', 2) | ||
|  | 
 | ||
|  |   t.deepEqual(store.tree, { | ||
|  |     prefix: 0, | ||
|  |     store: null, | ||
|  |     childrenPrefixes: [1], | ||
|  |     children: { | ||
|  |       1: { | ||
|  |         prefix: 1, | ||
|  |         store: null, | ||
|  |         childrenPrefixes: [2], | ||
|  |         children: { | ||
|  |           2: { | ||
|  |             prefix: 2, | ||
|  |             store: null, | ||
|  |             childrenPrefixes: [3, 4], | ||
|  |             children: { | ||
|  |               3: { | ||
|  |                 prefix: 3, | ||
|  |                 store: 1, | ||
|  |                 childrenPrefixes: [], | ||
|  |                 children: null | ||
|  |               }, | ||
|  |               4: { | ||
|  |                 prefix: 4, | ||
|  |                 store: 2, | ||
|  |                 childrenPrefixes: [], | ||
|  |                 children: null | ||
|  |               } | ||
|  |             } | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   store.del('1.2.3') | ||
|  | 
 | ||
|  |   t.deepEqual(store.tree, { | ||
|  |     prefix: 0, | ||
|  |     store: null, | ||
|  |     childrenPrefixes: [1], | ||
|  |     children: { | ||
|  |       1: { | ||
|  |         prefix: 1, | ||
|  |         store: null, | ||
|  |         childrenPrefixes: [2], | ||
|  |         children: { | ||
|  |           2: { | ||
|  |             prefix: 2, | ||
|  |             store: null, | ||
|  |             childrenPrefixes: [4], | ||
|  |             children: { | ||
|  |               4: { | ||
|  |                 prefix: 4, | ||
|  |                 store: 2, | ||
|  |                 childrenPrefixes: [], | ||
|  |                 children: null | ||
|  |               } | ||
|  |             } | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Delete a version / 3', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store | ||
|  |     .set('1.2.3', 1) | ||
|  |     .del('1.2.3') | ||
|  | 
 | ||
|  |   t.deepEqual(store.tree, { | ||
|  |     prefix: 0, | ||
|  |     store: null, | ||
|  |     childrenPrefixes: [], | ||
|  |     children: {} | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Delete a version / 4', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store | ||
|  |     .set('1.2.3', 1) | ||
|  |     .set('2.2.3', 2) | ||
|  |     .del('1.2.3') | ||
|  | 
 | ||
|  |   t.deepEqual(store.tree, { | ||
|  |     prefix: 0, | ||
|  |     store: null, | ||
|  |     childrenPrefixes: [2], | ||
|  |     children: { | ||
|  |       2: { | ||
|  |         prefix: 2, | ||
|  |         store: null, | ||
|  |         childrenPrefixes: [2], | ||
|  |         children: { | ||
|  |           2: { | ||
|  |             prefix: 2, | ||
|  |             store: null, | ||
|  |             childrenPrefixes: [3], | ||
|  |             children: { | ||
|  |               3: { | ||
|  |                 prefix: 3, | ||
|  |                 store: 2, | ||
|  |                 childrenPrefixes: [], | ||
|  |                 children: null | ||
|  |               } | ||
|  |             } | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Delete a version / 5', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store | ||
|  |     .set('1.2.3', 1) | ||
|  |     .set('1.3.3', 2) | ||
|  |     .set('2.2.3', 3) | ||
|  |     .del('1.2.x') | ||
|  | 
 | ||
|  |   t.deepEqual(store.tree, { | ||
|  |     prefix: 0, | ||
|  |     store: null, | ||
|  |     childrenPrefixes: [1, 2], | ||
|  |     children: { | ||
|  |       1: { | ||
|  |         prefix: 1, | ||
|  |         store: null, | ||
|  |         childrenPrefixes: [3], | ||
|  |         children: { | ||
|  |           3: { | ||
|  |             prefix: 3, | ||
|  |             store: null, | ||
|  |             childrenPrefixes: [3], | ||
|  |             children: { | ||
|  |               3: { | ||
|  |                 prefix: 3, | ||
|  |                 store: 2, | ||
|  |                 childrenPrefixes: [], | ||
|  |                 children: null | ||
|  |               } | ||
|  |             } | ||
|  |           } | ||
|  |         } | ||
|  |       }, | ||
|  |       2: { | ||
|  |         prefix: 2, | ||
|  |         store: null, | ||
|  |         childrenPrefixes: [2], | ||
|  |         children: { | ||
|  |           2: { | ||
|  |             prefix: 2, | ||
|  |             store: null, | ||
|  |             childrenPrefixes: [3], | ||
|  |             children: { | ||
|  |               3: { | ||
|  |                 prefix: 3, | ||
|  |                 store: 3, | ||
|  |                 childrenPrefixes: [], | ||
|  |                 children: null | ||
|  |               } | ||
|  |             } | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Delete a version / 6', t => { | ||
|  |   t.plan(2) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store | ||
|  |     .set('1.2.3', 1) | ||
|  |     .set('1.3.3', 2) | ||
|  |     .set('2.2.3', 3) | ||
|  |     .del('1.x') | ||
|  | 
 | ||
|  |   t.deepEqual(store.tree, { | ||
|  |     prefix: 0, | ||
|  |     store: null, | ||
|  |     childrenPrefixes: [2], | ||
|  |     children: { | ||
|  |       2: { | ||
|  |         prefix: 2, | ||
|  |         store: null, | ||
|  |         childrenPrefixes: [2], | ||
|  |         children: { | ||
|  |           2: { | ||
|  |             prefix: 2, | ||
|  |             store: null, | ||
|  |             childrenPrefixes: [3], | ||
|  |             children: { | ||
|  |               3: { | ||
|  |                 prefix: 3, | ||
|  |                 store: 3, | ||
|  |                 childrenPrefixes: [], | ||
|  |                 children: null | ||
|  |               } | ||
|  |             } | ||
|  |           } | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   store.del('2.x') | ||
|  | 
 | ||
|  |   t.deepEqual(store.tree, { | ||
|  |     prefix: 0, | ||
|  |     store: null, | ||
|  |     childrenPrefixes: [], | ||
|  |     children: {} | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('Empty store', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store | ||
|  |     .set('1.2.3', 1) | ||
|  |     .set('1.3.3', 2) | ||
|  |     .set('2.2.3', 3) | ||
|  |     .empty() | ||
|  | 
 | ||
|  |   t.deepEqual(store.tree, { | ||
|  |     prefix: 0, | ||
|  |     store: null, | ||
|  |     childrenPrefixes: [], | ||
|  |     children: null | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('get with bad type', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   store.set('1.2.3', 1) | ||
|  | 
 | ||
|  |   t.strictEqual(store.get(5), null) | ||
|  | }) | ||
|  | 
 | ||
|  | test('set with bad type', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   try { | ||
|  |     store.set(1, 1) | ||
|  |     t.fail('Should fail') | ||
|  |   } catch (err) { | ||
|  |     t.is(err.message, 'Version should be a string') | ||
|  |   } | ||
|  | }) | ||
|  | 
 | ||
|  | test('del with bad type', t => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const store = SemVerStore() | ||
|  | 
 | ||
|  |   try { | ||
|  |     store.del(1) | ||
|  |     t.fail('Should fail') | ||
|  |   } catch (err) { | ||
|  |     t.is(err.message, 'Version should be a string') | ||
|  |   } | ||
|  | }) |