seatsio 72.4.0 → 72.7.0

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.
@@ -0,0 +1,42 @@
1
+ # Very important!
2
+ # Make sure that the github token has read AND WRITE access on github.
3
+ # 1. hit https://github.com/seatsio/[REPO]/settings/actions
4
+ # 2. under "Workflow permissions", make sure "Read and write permissions" is checked instead of the (default?) read only.
5
+ #
6
+
7
+ name: Release
8
+ run-name: Release ${{ github.repository }}
9
+ on:
10
+ workflow_dispatch:
11
+ inputs:
12
+ versionToBump:
13
+ description: 'The version to bump. Major for incompatible API changes, minor for adding BC features'
14
+ required: true
15
+ type: choice
16
+ options:
17
+ - minor
18
+ - major
19
+ jobs:
20
+ release:
21
+ runs-on: ubuntu-latest
22
+ steps:
23
+ - uses: actions/checkout@v3
24
+ - uses: fregante/setup-git-user@v2
25
+ - id: install-zx
26
+ run: npm i -g zx
27
+ - id: install-semver-tool
28
+ run: |
29
+ wget -O /usr/local/bin/semver https://raw.githubusercontent.com/fsaintjacques/semver-tool/master/src/semver
30
+ chmod +x /usr/local/bin/semver
31
+ - run: zx ./release.mjs -v $VERSION_TO_BUMP
32
+ env:
33
+ VERSION_TO_BUMP: ${{ inputs.versionToBump }}
34
+ GH_TOKEN: ${{ github.token }}
35
+ - uses: actions/setup-node@v1
36
+ with:
37
+ node-version: 18
38
+ registry-url: https://registry.npmjs.org/
39
+ - run: yarn install
40
+ - run: yarn publish
41
+ env:
42
+ NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
package/README.md CHANGED
@@ -56,6 +56,19 @@ let event = await client.events.create(chart.key)
56
56
  console.log(`Created a chart with key ${chart.key} and an event with key: ${event.key}`)
57
57
  ```
58
58
 
59
+ ### Creating multiple events
60
+
61
+ ```js
62
+ import { SeatsioClient, Region, Events } from 'seatsio'
63
+
64
+ let client = new SeatsioClient(Region.EU(), <WORKSPACE SECRET KEY>)
65
+ let chart = await client.charts.create()
66
+ let events = await client.events.createMultiple(chart.key, [ Events.eventCreationParams(), Events.eventCreationParams('aSpecificEventKey') ])
67
+ for (const event of events) {
68
+ console.log(`Created an event with key: ${event.key}`)
69
+ }
70
+ ```
71
+
59
72
  ### Booking objects
60
73
 
61
74
  Booking an object changes its status to `booked`. Booked seats are not selectable on a rendered chart.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "seatsio",
3
- "version": "72.4.0",
3
+ "version": "72.7.0",
4
4
  "main": "index.js",
5
5
  "description": "Official JavaScript and Node.JS client library for the Seats.io REST API",
6
6
  "license": "MIT",
@@ -13,16 +13,16 @@
13
13
  "url": "https://github.com/seatsio/seatsio-js"
14
14
  },
15
15
  "dependencies": {
16
- "axios": "1.3.4"
16
+ "axios": "1.4.0"
17
17
  },
18
18
  "devDependencies": {
19
- "eslint": "8.35.0",
19
+ "eslint": "8.39.0",
20
20
  "eslint-config-standard": "17.0.0",
21
21
  "eslint-plugin-import": "2.27.5",
22
- "eslint-plugin-n": "15.6.1",
22
+ "eslint-plugin-n": "15.7.0",
23
23
  "eslint-plugin-promise": "6.1.1",
24
- "jest": "29.4.3",
25
- "jest-cli": "29.4.3",
24
+ "jest": "29.5.0",
25
+ "jest-cli": "29.5.0",
26
26
  "uuid": "9.0.0"
27
27
  }
28
28
  }
package/release.mjs ADDED
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env zx
2
+
3
+ /*
4
+ * Script to release the seats.io java lib.
5
+ * - changes the version number in README.md
6
+ * - changes the version number in build.gradle
7
+ * - creates the release in Gihub (using gh cli)
8
+ *
9
+ *
10
+ * Prerequisites:
11
+ * - zx installed (https://github.com/google/zx)
12
+ * - gh cli installed (https://cli.github.com/)
13
+ * - semver cli installed (https://github.com/fsaintjacques/semver-tool)
14
+ *
15
+ * Usage:
16
+ * zx ./release.mjs -v major/minor -n "release notes"
17
+ * */
18
+
19
+ // don't output the commands themselves
20
+ $.verbose = false
21
+
22
+ const versionToBump = getVersionToBump()
23
+ const latestVersion = await fetchLatestReleasedVersionNumber()
24
+ const nextVersion = await determineNextVersionNumber(latestVersion)
25
+
26
+ await pullLastVersion()
27
+ .then(bumpVersionInFiles)
28
+ .then(commitAndPush)
29
+ .then(release)
30
+
31
+ function getVersionToBump() {
32
+ if (!argv.v || !(argv.v === 'minor' || argv.v === 'major')) {
33
+ throw new Error ("Please specify -v major/minor")
34
+ }
35
+ return argv.v
36
+ }
37
+
38
+ function removeLeadingV(tagName) {
39
+ if (tagName.startsWith('v')) {
40
+ return tagName.substring(1)
41
+ }
42
+ return tagName
43
+ }
44
+
45
+ async function fetchLatestReleasedVersionNumber() {
46
+ let result = await $`gh release view --json tagName`
47
+ let tagName = JSON.parse(result).tagName
48
+ return removeLeadingV(tagName)
49
+ }
50
+
51
+ async function determineNextVersionNumber(previous) {
52
+ return (await $`semver bump ${versionToBump} ${previous}`).stdout.trim()
53
+ }
54
+
55
+ async function bumpVersionInFiles() {
56
+ await replaceInFile("package.json", `"version": "${latestVersion}",`, `"version": "${nextVersion}",`)
57
+ }
58
+
59
+ async function replaceInFile(filename, latestVersion, nextVersion) {
60
+ return await fs.readFile(filename, 'utf8')
61
+ .then(text => {
62
+ if (text.indexOf(latestVersion) < 0) {
63
+ throw new Error('Not the correct version. Could not find ' + latestVersion + ' in ' + filename)
64
+ }
65
+ return text
66
+ })
67
+ .then(text => text.replace(latestVersion, nextVersion))
68
+ .then(text => fs.writeFileSync(filename, text))
69
+ .then(() => gitAdd(filename))
70
+ }
71
+
72
+ async function pullLastVersion() {
73
+ await $`git checkout master`
74
+ await $`git pull origin master`
75
+ }
76
+
77
+ async function gitAdd(filename) {
78
+ return await $`git add ${filename}`
79
+ }
80
+
81
+ async function commitAndPush() {
82
+ await $`git commit -m "version bump"`
83
+ await $`git push origin master`
84
+ }
85
+
86
+ async function release() {
87
+ const newTag = 'v' + nextVersion
88
+ return await $`gh release create ${newTag} --generate-notes`.catch(error => {
89
+ console.error('something went wrong while creating the release. Please revert the version change!')
90
+ throw error
91
+ })
92
+ }
@@ -16,7 +16,6 @@ class Events {
16
16
  this.channels = new Channels(this.client)
17
17
  }
18
18
 
19
- /* @return Event */
20
19
  /**
21
20
  * @param {string} chartKey
22
21
  * @param {?string} eventKey
@@ -55,6 +54,73 @@ class Events {
55
54
  .then((res) => new EventDeserializer().fromJson(res.data))
56
55
  }
57
56
 
57
+ /**
58
+ * @param {?string} eventKey
59
+ * @param {?TableBookingConfig} tableBookingConfig
60
+ * @param {?string} socialDistancingRulesetKey
61
+ * @param {?object} objectCategories
62
+ * @param {?array} categories
63
+ * @returns an object containing the necessary data for event creation
64
+ * @static
65
+ */
66
+ static eventCreationParams (eventKey = null, tableBookingConfig = null, socialDistancingRulesetKey = null, objectCategories = null, categories = null) {
67
+ const eventDefinition = {}
68
+ eventDefinition.eventKey = eventKey
69
+ eventDefinition.tableBookingConfig = tableBookingConfig
70
+ eventDefinition.socialDistancingRulesetKey = socialDistancingRulesetKey
71
+ eventDefinition.objectCategories = objectCategories
72
+ eventDefinition.categories = categories
73
+ return eventDefinition
74
+ }
75
+
76
+ /**
77
+ * @param {string} chartKey
78
+ * @param {object[]} events use {@link Events.eventCreationParams()} as a convenience function to create these objects
79
+ * @returns {Promise<Event[]>}
80
+ */
81
+ createMultiple (chartKey, events) {
82
+ const requestParameters = {}
83
+
84
+ requestParameters.chartKey = chartKey
85
+ requestParameters.events = []
86
+
87
+ if (events) {
88
+ for (let i = 0; i < events.length; i++) {
89
+ const event = {}
90
+ if (events[i].eventKey !== null) {
91
+ event.eventKey = events[i].eventKey
92
+ }
93
+
94
+ if (events[i].tableBookingConfig !== null) {
95
+ event.tableBookingConfig = events[i].tableBookingConfig
96
+ }
97
+
98
+ if (events[i].socialDistancingRulesetKey !== null) {
99
+ event.socialDistancingRulesetKey = events[i].socialDistancingRulesetKey
100
+ }
101
+
102
+ if (events[i].objectCategories !== null) {
103
+ event.objectCategories = events[i].objectCategories
104
+ }
105
+
106
+ if (events[i].categories != null) {
107
+ event.categories = events[i].categories
108
+ }
109
+ requestParameters.events.push(event)
110
+ }
111
+ }
112
+
113
+ return this.client.post('/events/actions/create-multiple', requestParameters)
114
+ .then((res) => {
115
+ const result = []
116
+ const deserializer = new EventDeserializer()
117
+ for (const event of res.data.events) {
118
+ result.push(deserializer.fromJson(event))
119
+ }
120
+ return result
121
+ })
122
+ }
123
+
58
124
  /**
59
125
  * @param {string} eventKey
60
126
  * @returns {Promise<Event>}
@@ -389,8 +455,8 @@ class Events {
389
455
  * @param {?string[]} channelKeys
390
456
  * @returns {Promise<BestAvailableObjects>}
391
457
  */
392
- bookBestAvailable (eventKey, number, categories = null, holdToken = null, extraData = null, ticketTypes = null, orderId = null, keepExtraData = null, ignoreChannels = null, channelKeys = null) {
393
- return this.changeBestAvailableObjectStatus(encodeURIComponent(eventKey), number, EventObjectInfo.BOOKED, categories, holdToken, extraData, ticketTypes, orderId, keepExtraData, ignoreChannels, channelKeys)
458
+ bookBestAvailable (eventKey, number, categories = null, holdToken = null, extraData = null, ticketTypes = null, orderId = null, keepExtraData = null, ignoreChannels = null, channelKeys = null, tryToPreventOrphanSeats = null) {
459
+ return this.changeBestAvailableObjectStatus(encodeURIComponent(eventKey), number, EventObjectInfo.BOOKED, categories, holdToken, extraData, ticketTypes, orderId, keepExtraData, ignoreChannels, channelKeys, tryToPreventOrphanSeats)
394
460
  }
395
461
 
396
462
  /**
@@ -436,8 +502,8 @@ class Events {
436
502
  * @param {?string[]} ticketTypes
437
503
  * @returns {Promise<BestAvailableObjects>}
438
504
  */
439
- holdBestAvailable (eventKey, number, holdToken, categories = null, extraData = null, ticketTypes = null, orderId = null, keepExtraData = null, ignoreChannels = null, channelKeys = null) {
440
- return this.changeBestAvailableObjectStatus(encodeURIComponent(eventKey), number, EventObjectInfo.HELD, categories, holdToken, extraData, ticketTypes, orderId, keepExtraData, ignoreChannels, channelKeys)
505
+ holdBestAvailable (eventKey, number, holdToken, categories = null, extraData = null, ticketTypes = null, orderId = null, keepExtraData = null, ignoreChannels = null, channelKeys = null, tryToPreventOrphanSeats = null) {
506
+ return this.changeBestAvailableObjectStatus(encodeURIComponent(eventKey), number, EventObjectInfo.HELD, categories, holdToken, extraData, ticketTypes, orderId, keepExtraData, ignoreChannels, channelKeys, tryToPreventOrphanSeats)
441
507
  }
442
508
 
443
509
  /**
@@ -454,7 +520,7 @@ class Events {
454
520
  * @param {?string[]} channelKeys
455
521
  * @returns {Promise<BestAvailableObjects>}
456
522
  */
457
- changeBestAvailableObjectStatus (eventKey, number, status, categories = null, holdToken = null, extraData = null, ticketTypes = null, orderId = null, keepExtraData = null, ignoreChannels = null, channelKeys = null) {
523
+ changeBestAvailableObjectStatus (eventKey, number, status, categories = null, holdToken = null, extraData = null, ticketTypes = null, orderId = null, keepExtraData = null, ignoreChannels = null, channelKeys = null, tryToPreventOrphanSeats = null) {
458
524
  const requestParameters = {}
459
525
  const bestAvailable = {}
460
526
  requestParameters.status = status
@@ -474,6 +540,9 @@ class Events {
474
540
  if (ticketTypes !== null) {
475
541
  bestAvailable.ticketTypes = ticketTypes
476
542
  }
543
+ if (tryToPreventOrphanSeats !== null) {
544
+ bestAvailable.tryToPreventOrphanSeats = tryToPreventOrphanSeats
545
+ }
477
546
  if (keepExtraData !== null) {
478
547
  requestParameters.keepExtraData = keepExtraData
479
548
  }
@@ -10,7 +10,7 @@ test('should change best available object status', async () => {
10
10
  const bestAvailableObjs = await client.events.changeBestAvailableObjectStatus(event.key, 2, 'lolzor')
11
11
 
12
12
  expect(bestAvailableObjs.nextToEachOther).toBe(true)
13
- expect(bestAvailableObjs.objects.sort()).toEqual(['B-4', 'B-5'])
13
+ expect(bestAvailableObjs.objects.sort()).toEqual(['A-4', 'A-5'])
14
14
  })
15
15
 
16
16
  test('should change best available object status with categories', async () => {
@@ -32,9 +32,9 @@ test('should change best available object status with extra data', async () => {
32
32
 
33
33
  const bestAvailableObjs = await client.events.changeBestAvailableObjectStatus(event.key, 2, 'lolzor', null, null, extraData)
34
34
 
35
- const objectInfo4 = await client.events.retrieveObjectInfo(event.key, 'B-4')
36
- const objectInfo5 = await client.events.retrieveObjectInfo(event.key, 'B-5')
37
- expect(bestAvailableObjs.objects.sort()).toEqual(['B-4', 'B-5'])
35
+ const objectInfo4 = await client.events.retrieveObjectInfo(event.key, 'A-4')
36
+ const objectInfo5 = await client.events.retrieveObjectInfo(event.key, 'A-5')
37
+ expect(bestAvailableObjs.objects.sort()).toEqual(['A-4', 'A-5'])
38
38
  expect(objectInfo4.extraData).toEqual(extraData[0])
39
39
  expect(objectInfo5.extraData).toEqual(extraData[1])
40
40
  })
@@ -75,7 +75,19 @@ test('should book best available object with extra data', async () => {
75
75
  const bestAvailableObjs = await client.events.bookBestAvailable(event.key, 3, null, null, extraData)
76
76
 
77
77
  expect(bestAvailableObjs.nextToEachOther).toBe(true)
78
- expect(bestAvailableObjs.objects).toEqual(['B-4', 'B-5', 'B-6'])
78
+ expect(bestAvailableObjs.objects).toEqual(['A-4', 'A-5', 'A-6'])
79
+ })
80
+
81
+ test('should book best available while leaving orphan seats', async () => {
82
+ const { client, user } = await testUtils.createTestUserAndClient()
83
+ const chartKey = testUtils.getChartKey()
84
+ await testUtils.createTestChart(chartKey, user.secretKey)
85
+ const event = await client.events.create(chartKey)
86
+ await client.events.book(event.key, ['A-4', 'A-5'])
87
+
88
+ const bestAvailableObjs = await client.events.bookBestAvailable(event.key, 2, null, null, null, null, null, null, null, null, false)
89
+
90
+ expect(bestAvailableObjs.objects).toEqual(['A-2', 'A-3'])
79
91
  })
80
92
 
81
93
  test('should book best available object', async () => {
@@ -87,7 +99,7 @@ test('should book best available object', async () => {
87
99
  const bestAvailableObjs = await client.events.bookBestAvailable(event.key, 3)
88
100
 
89
101
  expect(bestAvailableObjs.nextToEachOther).toBe(true)
90
- expect(bestAvailableObjs.objects).toEqual(['B-4', 'B-5', 'B-6'])
102
+ expect(bestAvailableObjs.objects).toEqual(['A-4', 'A-5', 'A-6'])
91
103
  })
92
104
 
93
105
  test('should hold best available object ', async () => {
@@ -139,11 +151,11 @@ test('should respect keepExtraData=true', async () => {
139
151
  const chartKey = testUtils.getChartKey()
140
152
  await testUtils.createTestChart(chartKey, user.secretKey)
141
153
  const event = await client.events.create(chartKey)
142
- await client.events.updateExtraData(event.key, 'B-5', { foo: 'bar' })
154
+ await client.events.updateExtraData(event.key, 'A-5', { foo: 'bar' })
143
155
 
144
156
  await client.events.changeBestAvailableObjectStatus(event.key, 1, 'someStatus', null, null, null, null, null, true)
145
157
 
146
- const status = await client.events.retrieveObjectInfo(event.key, 'B-5')
158
+ const status = await client.events.retrieveObjectInfo(event.key, 'A-5')
147
159
  expect(status.extraData).toEqual({ foo: 'bar' })
148
160
  })
149
161
 
@@ -152,11 +164,11 @@ test('should respect keepExtraData=false', async () => {
152
164
  const chartKey = testUtils.getChartKey()
153
165
  await testUtils.createTestChart(chartKey, user.secretKey)
154
166
  const event = await client.events.create(chartKey)
155
- await client.events.updateExtraData(event.key, 'B-5', { foo: 'bar' })
167
+ await client.events.updateExtraData(event.key, 'A-5', { foo: 'bar' })
156
168
 
157
169
  await client.events.changeBestAvailableObjectStatus(event.key, 1, 'someStatus', null, null, null, null, null, false)
158
170
 
159
- const status = await client.events.retrieveObjectInfo(event.key, 'B-5')
171
+ const status = await client.events.retrieveObjectInfo(event.key, 'A-5')
160
172
  expect(status.extraData).toBeFalsy()
161
173
  })
162
174
 
@@ -165,11 +177,11 @@ test('should respect no keepExtraData', async () => {
165
177
  const chartKey = testUtils.getChartKey()
166
178
  await testUtils.createTestChart(chartKey, user.secretKey)
167
179
  const event = await client.events.create(chartKey)
168
- await client.events.updateExtraData(event.key, 'B-5', { foo: 'bar' })
180
+ await client.events.updateExtraData(event.key, 'A-5', { foo: 'bar' })
169
181
 
170
182
  await client.events.changeBestAvailableObjectStatus(event.key, 1, 'someStatus')
171
183
 
172
- const status = await client.events.retrieveObjectInfo(event.key, 'B-5')
184
+ const status = await client.events.retrieveObjectInfo(event.key, 'A-5')
173
185
  expect(status.extraData).toBeFalsy()
174
186
  })
175
187
 
@@ -181,11 +193,11 @@ test('should accept channel keys', async () => {
181
193
  await client.events.channels.replace(event.key, {
182
194
  channelKey1: { name: 'channel 1', color: '#FFAABB', index: 1 }
183
195
  })
184
- await client.events.channels.setObjects(event.key, { channelKey1: ['B-6'] })
196
+ await client.events.channels.setObjects(event.key, { channelKey1: ['A-6'] })
185
197
 
186
198
  const bestAvailableObjs = await client.events.changeBestAvailableObjectStatus(event.key, 1, 'lolzor', null, null, null, null, null, null, null, ['channelKey1'])
187
199
 
188
- expect(bestAvailableObjs.objects).toEqual(['B-6'])
200
+ expect(bestAvailableObjs.objects).toEqual(['A-6'])
189
201
  })
190
202
 
191
203
  test('should accept ignoreChannels', async () => {
@@ -200,5 +212,5 @@ test('should accept ignoreChannels', async () => {
200
212
 
201
213
  const bestAvailableObjs = await client.events.changeBestAvailableObjectStatus(event.key, 1, 'lolzor', null, null, null, null, null, null, true)
202
214
 
203
- expect(bestAvailableObjs.objects).toEqual(['B-5'])
215
+ expect(bestAvailableObjs.objects).toEqual(['A-5'])
204
216
  })
@@ -29,7 +29,7 @@ test('should change object status', async () => {
29
29
  isAvailable: false,
30
30
  availabilityReason: 'lolzor',
31
31
  isDisabledBySocialDistancing: false,
32
- distanceToFocalPoint: 79.43847425150014
32
+ distanceToFocalPoint: 98.67842540608864
33
33
  }
34
34
  })
35
35
  })
@@ -62,9 +62,9 @@ test('should change object status with GA', async () => {
62
62
  await testUtils.createTestChart(chartKey, user.secretKey)
63
63
  const event = await client.events.create(chartKey)
64
64
 
65
- const result = await client.events.changeObjectStatus(event.key, '34', 'lolzor')
65
+ const result = await client.events.changeObjectStatus(event.key, 'GA2', 'lolzor')
66
66
 
67
- expect(Object.keys(result.objects)).toEqual(['34'])
67
+ expect(Object.keys(result.objects)).toEqual(['GA2'])
68
68
  })
69
69
 
70
70
  test('should change object status with GA and quantity', async () => {
@@ -101,13 +101,13 @@ test('should change object status for multiple objects with quantity', async ()
101
101
  const event = await client.events.create(chartKey)
102
102
  const objects = [
103
103
  (new ObjectProperties('GA1')).setQuantity(5),
104
- (new ObjectProperties('34')).setQuantity(10)
104
+ (new ObjectProperties('GA2')).setQuantity(10)
105
105
  ]
106
106
 
107
107
  await client.events.changeObjectStatus(event.key, objects, 'lolzor')
108
108
 
109
109
  const status1 = await client.events.retrieveObjectInfo(event.key, 'GA1')
110
- const status2 = await client.events.retrieveObjectInfo(event.key, '34')
110
+ const status2 = await client.events.retrieveObjectInfo(event.key, 'GA2')
111
111
  expect(status1.numBooked).toBe(5)
112
112
  expect(status2.numBooked).toBe(10)
113
113
  })
@@ -0,0 +1,134 @@
1
+ const testUtils = require('../testUtils.js')
2
+ const SocialDistancingRuleset = require('../../src/Charts/SocialDistancingRuleset.js')
3
+ const TableBookingConfig = require('../../src/Events/TableBookingConfig')
4
+ const Category = require('../../src/Charts/Category')
5
+ const Events = require('../../src/Events/Events')
6
+
7
+ test('should check that a minimum of one event is required', async () => {
8
+ const { client, user } = await testUtils.createTestUserAndClient()
9
+ const chartKey = testUtils.getChartKey()
10
+ await testUtils.createTestChart(chartKey, user.secretKey)
11
+
12
+ try {
13
+ await client.events.createMultiple(chartKey)
14
+ } catch (e) {
15
+ expect(e.errors.length).toEqual(1)
16
+ expect(e.errors[0].code).toBe('GENERAL_ERROR')
17
+ expect(e.errors[0].message).toBe('#/events: expected minimum item count: 1, found: 0')
18
+ }
19
+ })
20
+
21
+ test('should check that an empty object is a valid event definition', async () => {
22
+ const { client, user } = await testUtils.createTestUserAndClient()
23
+ const chartKey = testUtils.getChartKey()
24
+ await testUtils.createTestChart(chartKey, user.secretKey)
25
+
26
+ const events = await client.events.createMultiple(chartKey, [{}])
27
+
28
+ expect(events).toHaveLength(1)
29
+ expect(events[0].key).toBeTruthy()
30
+ })
31
+
32
+ test('should create a single event', async () => {
33
+ const { client } = await testUtils.createTestUserAndClient()
34
+ const chart = await client.charts.create()
35
+
36
+ const events = await client.events.createMultiple(chart.key, [
37
+ Events.eventCreationParams('eventKey')
38
+ ])
39
+
40
+ expect(events).toHaveLength(1)
41
+ expect(events[0].key).toEqual('eventKey')
42
+
43
+ const retrievedEvent = await client.events.retrieve('eventKey')
44
+ expect(retrievedEvent.key).toEqual('eventKey')
45
+ })
46
+
47
+ test('should create multiple events', async () => {
48
+ const { client } = await testUtils.createTestUserAndClient()
49
+ const chart = await client.charts.create()
50
+
51
+ const events = [
52
+ Events.eventCreationParams('eventKey1'),
53
+ Events.eventCreationParams('eventKey2')
54
+ ]
55
+ const createdEvents = await client.events.createMultiple(chart.key, events)
56
+
57
+ expect(createdEvents).toHaveLength(2)
58
+ expect(createdEvents[0].key).toEqual('eventKey1')
59
+ expect(createdEvents[1].key).toEqual('eventKey2')
60
+
61
+ for (const event of events) {
62
+ const retrievedEvent = await client.events.retrieve(event.eventKey)
63
+ expect(retrievedEvent.key).toEqual(event.eventKey)
64
+ }
65
+ })
66
+
67
+ test('supports tableBookingConfig custom', async () => {
68
+ const { client, user } = await testUtils.createTestUserAndClient()
69
+ const chartKey = testUtils.getChartKey()
70
+ await testUtils.createTestChartWithTables(chartKey, user.secretKey)
71
+ const tableBookingConfig = TableBookingConfig.custom({ T1: 'BY_TABLE', T2: 'BY_SEAT' })
72
+
73
+ const events = await client.events.createMultiple(chartKey, [
74
+ Events.eventCreationParams(null, tableBookingConfig)
75
+ ])
76
+
77
+ expect(events[0].key).toBeTruthy()
78
+ expect(events[0].tableBookingConfig).toEqual(tableBookingConfig)
79
+ })
80
+
81
+ test('supports tableBookingConfig inherit', async () => {
82
+ const { client, user } = await testUtils.createTestUserAndClient()
83
+ const chartKey = testUtils.getChartKey()
84
+ await testUtils.createTestChartWithTables(chartKey, user.secretKey)
85
+
86
+ const events = await client.events.createMultiple(chartKey, [
87
+ Events.eventCreationParams(null, TableBookingConfig.inherit())
88
+ ])
89
+
90
+ expect(events[0].key).toBeTruthy()
91
+ expect(events[0].tableBookingConfig).toEqual(TableBookingConfig.inherit())
92
+ })
93
+
94
+ test('it supports a social distancing ruleset key', async () => {
95
+ const { client } = await testUtils.createTestUserAndClient()
96
+ const chart = await client.charts.create()
97
+ const rulesets = { ruleset1: SocialDistancingRuleset.ruleBased('My ruleset').build() }
98
+ await client.charts.saveSocialDistancingRulesets(chart.key, rulesets)
99
+
100
+ const events = await client.events.createMultiple(chart.key, [
101
+ Events.eventCreationParams(null, null, 'ruleset1')
102
+ ])
103
+
104
+ expect(events[0].socialDistancingRulesetKey).toBe('ruleset1')
105
+ })
106
+
107
+ test('it supports object categories', async () => {
108
+ const { client, user } = await testUtils.createTestUserAndClient()
109
+ const chartKey = testUtils.getChartKey()
110
+ await testUtils.createTestChart(chartKey, user.secretKey)
111
+
112
+ const events = await client.events.createMultiple(chartKey, [
113
+ Events.eventCreationParams(null, null, null, { 'A-1': 10 })
114
+ ])
115
+
116
+ expect(events[0].objectCategories).toEqual({ 'A-1': 10 })
117
+ })
118
+
119
+ test('it supports categories', async () => {
120
+ const { client, user } = await testUtils.createTestUserAndClient()
121
+ const chartKey = testUtils.getChartKey()
122
+ await testUtils.createTestChart(chartKey, user.secretKey)
123
+
124
+ const eventCategory = new Category('eventCat1', 'Event Level Category', '#AAABBB')
125
+
126
+ const events = await client.events.createMultiple(chartKey, [
127
+ Events.eventCreationParams(null, null, null, null, [eventCategory])
128
+ ])
129
+
130
+ expect(events[0].categories.length).toEqual(4) // 3 from sampleChart.json, 1 event level category
131
+ expect(events[0].categories.filter(cat => cat.key === 'eventCat1').length).toEqual(1)
132
+ expect(events[0].categories.filter(cat => cat.key === 'eventCat1')[0].label).toEqual('Event Level Category')
133
+ expect(events[0].categories.filter(cat => cat.key === 'eventCat1')[0].color).toEqual('#AAABBB')
134
+ })