coh-content-db 2.0.0-rc.11 → 2.0.0-rc.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +3 -1
- package/README.md +5 -5
- package/dist/coh-content-db.d.ts +34 -15
- package/dist/coh-content-db.js +34 -7
- package/dist/coh-content-db.js.map +1 -1
- package/dist/coh-content-db.mjs +34 -8
- package/dist/coh-content-db.mjs.map +1 -1
- package/package.json +1 -1
- package/src/main/api/badge-data.ts +5 -0
- package/src/main/api/bundle-data.ts +1 -1
- package/src/main/api/bundle-header-data.ts +13 -6
- package/src/main/db/badge-index.ts +2 -2
- package/src/main/db/badge-search-options.ts +1 -1
- package/src/main/db/badge.ts +16 -0
- package/src/main/db/bundle-header.ts +18 -10
- package/src/main/to-date.ts +9 -0
- package/src/test/api/badge-data.fixture.ts +1 -0
- package/src/test/api/badge-data.test.ts +1 -0
- package/src/test/api/bundle-data.fixture.ts +3 -2
- package/src/test/api/bundle-header-data.fixture.ts +4 -2
- package/src/test/db/badge-index.test.ts +24 -0
- package/src/test/db/badge.test.ts +60 -1
- package/src/test/db/bundle-header.test.ts +25 -12
- package/src/test/db/coh-content-database.test.ts +6 -6
- package/src/test/integration.test.ts +3 -3
- package/src/test/to-date.test.ts +15 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { defineFixture } from 'efate'
|
|
2
2
|
import { BundleData } from '../../main'
|
|
3
|
+
import { bundleHeaderDataFixture } from './bundle-header-data.fixture'
|
|
3
4
|
|
|
4
|
-
export const bundleDataFixture = defineFixture<BundleData>(() => {
|
|
5
|
-
|
|
5
|
+
export const bundleDataFixture = defineFixture<BundleData>((t) => {
|
|
6
|
+
t.header.fromFixture(bundleHeaderDataFixture)
|
|
6
7
|
})
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { defineFixture } from 'efate'
|
|
2
2
|
import { BundleHeaderData } from '../../main'
|
|
3
3
|
|
|
4
|
-
export const bundleHeaderDataFixture = defineFixture<BundleHeaderData>(() => {
|
|
5
|
-
|
|
4
|
+
export const bundleHeaderDataFixture = defineFixture<BundleHeaderData>((t) => {
|
|
5
|
+
t.name.as(index => `Bundle ${index}`)
|
|
6
|
+
t.version.as(index => `${index}.${index}.${index}`)
|
|
7
|
+
t.lastUpdateTime.as(() => new Date().toISOString())
|
|
6
8
|
})
|
|
@@ -542,6 +542,30 @@ describe(BadgeIndex.name, () => {
|
|
|
542
542
|
const keys = result.items.map(x => x.key)
|
|
543
543
|
expect(keys).toStrictEqual(['badge-5', 'badge-1', 'badge-3', 'badge-2', 'badge-4'])
|
|
544
544
|
})
|
|
545
|
+
|
|
546
|
+
test(`should sort by release date`, () => {
|
|
547
|
+
const index = new BadgeIndex([
|
|
548
|
+
new Badge(badgeDataFixture.create({ key: 'badge-1', releaseDate: '2025-02-03' })),
|
|
549
|
+
new Badge(badgeDataFixture.create({ key: 'badge-2', releaseDate: '2025-02-03' })),
|
|
550
|
+
new Badge(badgeDataFixture.create({ key: 'badge-3', releaseDate: '2020-01-01' })),
|
|
551
|
+
])
|
|
552
|
+
|
|
553
|
+
const result = index.search({ sort: { by: 'release-date' } })
|
|
554
|
+
const keys = result.items.map(x => x.key)
|
|
555
|
+
expect(keys).toStrictEqual(['badge-3', 'badge-1', 'badge-2'])
|
|
556
|
+
})
|
|
557
|
+
|
|
558
|
+
test(`should sort by release date descending`, () => {
|
|
559
|
+
const index = new BadgeIndex([
|
|
560
|
+
new Badge(badgeDataFixture.create({ key: 'badge-1', releaseDate: '2025-02-03' })),
|
|
561
|
+
new Badge(badgeDataFixture.create({ key: 'badge-2', releaseDate: '2020-01-01' })),
|
|
562
|
+
new Badge(badgeDataFixture.create({ key: 'badge-3', releaseDate: '2025-02-03' })),
|
|
563
|
+
])
|
|
564
|
+
|
|
565
|
+
const result = index.search({ sort: { by: 'release-date', dir: 'desc' } })
|
|
566
|
+
const keys = result.items.map(x => x.key)
|
|
567
|
+
expect(keys).toStrictEqual(['badge-1', 'badge-3', 'badge-2'])
|
|
568
|
+
})
|
|
545
569
|
})
|
|
546
570
|
})
|
|
547
571
|
})
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Badge, compareByDefaultName, compareByZoneKey } from '../../main'
|
|
1
|
+
import { Badge, compareByDefaultName, compareByReleaseDate, compareByZoneKey } from '../../main'
|
|
2
2
|
import { badgeDataFixture } from '../api/badge-data.fixture'
|
|
3
3
|
import { badgeRequirementDataFixture } from '../api/badge-requirement-data.fixture'
|
|
4
4
|
|
|
@@ -28,6 +28,24 @@ describe(Badge.name, () => {
|
|
|
28
28
|
const badge = new Badge(badgeDataFixture.create({ name: [{ value: 'foo' }] }))
|
|
29
29
|
expect(badge.name.default).toEqual({ value: 'foo' })
|
|
30
30
|
})
|
|
31
|
+
|
|
32
|
+
test('should accept a string', () => {
|
|
33
|
+
const badge = new Badge(badgeDataFixture.create({ name: 'foo' }))
|
|
34
|
+
expect(badge.name.default).toEqual({ value: 'foo' })
|
|
35
|
+
})
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
describe('releaseDate', () => {
|
|
39
|
+
test('should be set from the data', () => {
|
|
40
|
+
const badge = new Badge(badgeDataFixture.create({ releaseDate: '2025-08-08' }))
|
|
41
|
+
expect(badge.releaseDate).toEqual(new Date('2025-08-08'))
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
test('should not accept an invalid date', () => {
|
|
45
|
+
expect(() =>
|
|
46
|
+
new Badge(badgeDataFixture.create({ releaseDate: '2025-??-08' })),
|
|
47
|
+
).toThrow('Invalid date')
|
|
48
|
+
})
|
|
31
49
|
})
|
|
32
50
|
|
|
33
51
|
describe('morality', () => {
|
|
@@ -55,6 +73,11 @@ describe(Badge.name, () => {
|
|
|
55
73
|
expect(badge.badgeText.default).toEqual({ value: 'foo' })
|
|
56
74
|
})
|
|
57
75
|
|
|
76
|
+
test('should accept a string', () => {
|
|
77
|
+
const badge = new Badge(badgeDataFixture.create({ badgeText: 'foo' }))
|
|
78
|
+
expect(badge.badgeText.default).toEqual({ value: 'foo' })
|
|
79
|
+
})
|
|
80
|
+
|
|
58
81
|
test('should be optional', () => {
|
|
59
82
|
const badge = new Badge(badgeDataFixture.omit('badgeText').create())
|
|
60
83
|
expect(badge.badgeText.default).toBeUndefined()
|
|
@@ -79,6 +102,11 @@ describe(Badge.name, () => {
|
|
|
79
102
|
expect(badge.icon.default).toEqual({ value: 'foo' })
|
|
80
103
|
})
|
|
81
104
|
|
|
105
|
+
test('should accept a string', () => {
|
|
106
|
+
const badge = new Badge(badgeDataFixture.create({ icon: 'foo' }))
|
|
107
|
+
expect(badge.icon.default).toEqual({ value: 'foo' })
|
|
108
|
+
})
|
|
109
|
+
|
|
82
110
|
test('should be optional', () => {
|
|
83
111
|
const badge = new Badge(badgeDataFixture.omit('icon').create())
|
|
84
112
|
expect(badge.icon.default).toBeUndefined()
|
|
@@ -346,4 +374,35 @@ describe(Badge.name, () => {
|
|
|
346
374
|
expect([badgeB, badgeA].sort(compareByZoneKey)).toStrictEqual([badgeA, badgeB])
|
|
347
375
|
})
|
|
348
376
|
})
|
|
377
|
+
|
|
378
|
+
describe(compareByReleaseDate.name, () => {
|
|
379
|
+
test(`should compare two badges by releaseDate`, () => {
|
|
380
|
+
const badgeA = new Badge(badgeDataFixture.create({ releaseDate: '2024-01-01' }))
|
|
381
|
+
const badgeB = new Badge(badgeDataFixture.create({ releaseDate: '2025-01-01' }))
|
|
382
|
+
expect(compareByReleaseDate(badgeA, badgeB)).toBeLessThan(0)
|
|
383
|
+
expect([badgeB, badgeA].sort(compareByReleaseDate)).toStrictEqual([badgeA, badgeB])
|
|
384
|
+
})
|
|
385
|
+
|
|
386
|
+
test(`should return 0 for equal releaseDates`, () => {
|
|
387
|
+
const badgeA = new Badge(badgeDataFixture.create({ releaseDate: '2025-01-01' }))
|
|
388
|
+
const badgeB = new Badge(badgeDataFixture.create({ releaseDate: '2025-01-01' }))
|
|
389
|
+
expect(compareByReleaseDate(badgeA, badgeB)).toEqual(0)
|
|
390
|
+
})
|
|
391
|
+
|
|
392
|
+
test(`should equate two undefined values`, () => {
|
|
393
|
+
const badgeA = undefined
|
|
394
|
+
const badgeB = undefined
|
|
395
|
+
expect(compareByReleaseDate(badgeA, badgeB)).toEqual(0)
|
|
396
|
+
})
|
|
397
|
+
|
|
398
|
+
test(`should compare undefined value as higher`, () => {
|
|
399
|
+
const badgeA = undefined
|
|
400
|
+
const badgeB = new Badge(badgeDataFixture.create({ releaseDate: '2025-01-01' }))
|
|
401
|
+
expect(compareByReleaseDate(badgeA, badgeB)).toBeGreaterThan(0)
|
|
402
|
+
expect([badgeA, badgeB].sort(compareByReleaseDate)).toStrictEqual([badgeB, badgeA])
|
|
403
|
+
|
|
404
|
+
expect(compareByReleaseDate(badgeB, badgeA)).toBeLessThan(0)
|
|
405
|
+
expect([badgeB, badgeA].sort(compareByReleaseDate)).toStrictEqual([badgeB, badgeA])
|
|
406
|
+
})
|
|
407
|
+
})
|
|
349
408
|
})
|
|
@@ -14,6 +14,31 @@ describe(BundleHeader.name, () => {
|
|
|
14
14
|
})
|
|
15
15
|
})
|
|
16
16
|
|
|
17
|
+
describe('version', () => {
|
|
18
|
+
test(`should be set from the data`, () => {
|
|
19
|
+
const header = new BundleHeader(bundleHeaderDataFixture.create({ version: 'foo' }))
|
|
20
|
+
expect(header.version).toEqual('foo')
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
test(`should be optional`, () => {
|
|
24
|
+
const header = new BundleHeader(bundleHeaderDataFixture.omit('version').create())
|
|
25
|
+
expect(header.version).toBeUndefined()
|
|
26
|
+
})
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
describe('releaseDate', () => {
|
|
30
|
+
test('should be set from the data', () => {
|
|
31
|
+
const header = new BundleHeader(bundleHeaderDataFixture.create({ lastUpdateTime: '2025-04-21T01:02:03Z' }))
|
|
32
|
+
expect(header.lastUpdateTime).toStrictEqual(new Date('2025-04-21T01:02:03Z'))
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
test('should not accept an invalid date', () => {
|
|
36
|
+
expect(() =>
|
|
37
|
+
new BundleHeader(bundleHeaderDataFixture.create({ lastUpdateTime: 'blah' })),
|
|
38
|
+
).toThrow('Invalid date')
|
|
39
|
+
})
|
|
40
|
+
})
|
|
41
|
+
|
|
17
42
|
describe('description', () => {
|
|
18
43
|
test(`should be set from the data`, () => {
|
|
19
44
|
const header = new BundleHeader(bundleHeaderDataFixture.create({ description: 'foo' }))
|
|
@@ -61,16 +86,4 @@ describe(BundleHeader.name, () => {
|
|
|
61
86
|
expect(header.links).toHaveLength(0)
|
|
62
87
|
})
|
|
63
88
|
})
|
|
64
|
-
|
|
65
|
-
describe('version', () => {
|
|
66
|
-
test(`should be set from the data`, () => {
|
|
67
|
-
const header = new BundleHeader(bundleHeaderDataFixture.create({ version: 'foo' }))
|
|
68
|
-
expect(header.version).toEqual('foo')
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
test(`should be optional`, () => {
|
|
72
|
-
const header = new BundleHeader(bundleHeaderDataFixture.omit('version').create())
|
|
73
|
-
expect(header.version).toBeUndefined()
|
|
74
|
-
})
|
|
75
|
-
})
|
|
76
89
|
})
|
|
@@ -14,12 +14,12 @@ describe(CohContentDatabase.name, () => {
|
|
|
14
14
|
})
|
|
15
15
|
|
|
16
16
|
describe('header', () => {
|
|
17
|
-
test(`should accept an undefined field`, () => {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
17
|
+
test(`should not accept an undefined field`, () => {
|
|
18
|
+
expect(() =>
|
|
19
|
+
new CohContentDatabase(
|
|
20
|
+
bundleDataFixture.omit('header').create(),
|
|
21
|
+
),
|
|
22
|
+
).toThrow('Missing header data')
|
|
23
23
|
})
|
|
24
24
|
|
|
25
25
|
test(`should load values from bundle`, () => {
|
|
@@ -4,13 +4,13 @@ import { TEST_BADGE } from './api/badge-data.test'
|
|
|
4
4
|
/**
|
|
5
5
|
* If you change this test, update the example in the README as well
|
|
6
6
|
*/
|
|
7
|
-
export const
|
|
8
|
-
header: { name: 'My Content Bundle' },
|
|
7
|
+
export const MyBundle: BundleData = {
|
|
8
|
+
header: { name: 'My Content Bundle', version: '1.0.0', lastUpdateTime: '2025-04-21T00:00:00Z' },
|
|
9
9
|
badges: [TEST_BADGE],
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
describe('BundleData', () => {
|
|
13
13
|
test('should be a usable interface', () => {
|
|
14
|
-
expect(
|
|
14
|
+
expect(MyBundle).not.toBeUndefined()
|
|
15
15
|
})
|
|
16
16
|
})
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { toDate } from '../main/to-date'
|
|
2
|
+
|
|
3
|
+
describe(toDate.name, () => {
|
|
4
|
+
test('should return a valid date', () => {
|
|
5
|
+
expect(toDate('2025-02-01')).toStrictEqual(new Date('2025-02-01'))
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
test('should return a valid time', () => {
|
|
9
|
+
expect(toDate('2025-04-21T02:57:52.402Z')).toStrictEqual(new Date('2025-04-21T02:57:52.402Z'))
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
test('should throw on invalid ISO string', () => {
|
|
13
|
+
expect(() => toDate('foo')).toThrow('Invalid date')
|
|
14
|
+
})
|
|
15
|
+
})
|