From d08ce29e5a3cb93e6c700ae007bd5c68fb2fe3ad Mon Sep 17 00:00:00 2001 From: Zhihe Li Date: Thu, 16 Mar 2023 13:49:04 -0400 Subject: [PATCH] Chore/update model names (#125) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: 🤖 Rename recording to session-recording * chore: 🤖 Update names for connection models * chore: 🤖 Update channel models to new name * chore: 🤖 Update remaining models after merge conflict --- .../{recording.js => session-recording.js} | 2 +- .../{channel.js => channel-recording.js} | 2 +- ...{connection.js => connection-recording.js} | 2 +- .../{recording.js => session-recording.js} | 4 +- addons/api/addon/models/channel-recording.js | 27 ++ addons/api/addon/models/channel.js | 25 -- .../api/addon/models/connection-recording.js | 7 + addons/api/addon/models/connection.js | 7 - addons/api/addon/models/recording.js | 25 -- addons/api/addon/models/session-recording.js | 44 +++ ...{connection.js => connection-recording.js} | 2 +- .../{recording.js => session-recording.js} | 2 +- .../{recording.js => session-recording.js} | 0 addons/api/app/models/channel-recording.js | 1 + addons/api/app/models/channel.js | 1 - addons/api/app/models/connection-recording.js | 1 + addons/api/app/models/connection.js | 1 - addons/api/app/models/recording.js | 1 - addons/api/app/models/session-recording.js | 1 + .../app/serializers/connection-recording.js | 1 + addons/api/app/serializers/connection.js | 1 - addons/api/app/serializers/recording.js | 1 - .../api/app/serializers/session-recording.js | 1 + addons/api/mirage/config.js | 8 +- .../{channel.js => channel-recording.js} | 4 +- ...{connection.js => connection-recording.js} | 2 +- addons/api/mirage/factories/scope.js | 2 +- .../{recording.js => session-recording.js} | 22 +- .../{channel.js => channel-recording.js} | 2 +- ...{connection.js => connection-recording.js} | 2 +- .../{recording.js => session-recording.js} | 2 +- .../{channel.js => channel-recording.js} | 2 +- ...{connection.js => connection-recording.js} | 4 +- .../{recording.js => session-recording.js} | 2 +- addons/api/mirage/scenarios/default.js | 6 +- .../{channel.js => channel-recording.js} | 2 +- ...{connection.js => connection-recording.js} | 12 +- .../{recording.js => session-recording.js} | 19 +- ...nnel-test.js => channel-recording-test.js} | 18 +- ...n-test.js => connection-recording-test.js} | 12 +- ...ding-test.js => session-recording-test.js} | 28 +- ...g-test.js => connection-recording-test.js} | 6 +- ...tion-test.js => session-recording-test.js} | 6 +- .../{recording.js => session-recording.js} | 4 +- .../tests/unit/abilities/recording-test.js | 221 -------------- .../unit/abilities/session-recording-test.js | 269 ++++++++++++++++++ 46 files changed, 442 insertions(+), 372 deletions(-) rename addons/api/addon/abilities/{recording.js => session-recording.js} (90%) rename addons/api/addon/generated/models/{channel.js => channel-recording.js} (93%) rename addons/api/addon/generated/models/{connection.js => connection-recording.js} (92%) rename addons/api/addon/generated/models/{recording.js => session-recording.js} (91%) create mode 100644 addons/api/addon/models/channel-recording.js delete mode 100644 addons/api/addon/models/channel.js create mode 100644 addons/api/addon/models/connection-recording.js delete mode 100644 addons/api/addon/models/connection.js delete mode 100644 addons/api/addon/models/recording.js create mode 100644 addons/api/addon/models/session-recording.js rename addons/api/addon/serializers/{connection.js => connection-recording.js} (83%) rename addons/api/addon/serializers/{recording.js => session-recording.js} (82%) rename addons/api/app/abilities/{recording.js => session-recording.js} (100%) create mode 100644 addons/api/app/models/channel-recording.js delete mode 100644 addons/api/app/models/channel.js create mode 100644 addons/api/app/models/connection-recording.js delete mode 100644 addons/api/app/models/connection.js delete mode 100644 addons/api/app/models/recording.js create mode 100644 addons/api/app/models/session-recording.js create mode 100644 addons/api/app/serializers/connection-recording.js delete mode 100644 addons/api/app/serializers/connection.js delete mode 100644 addons/api/app/serializers/recording.js create mode 100644 addons/api/app/serializers/session-recording.js rename addons/api/mirage/factories/{channel.js => channel-recording.js} (61%) rename addons/api/mirage/factories/{connection.js => connection-recording.js} (73%) rename addons/api/mirage/factories/{recording.js => session-recording.js} (68%) rename addons/api/mirage/generated/factories/{channel.js => channel-recording.js} (91%) rename addons/api/mirage/generated/factories/{connection.js => connection-recording.js} (91%) rename addons/api/mirage/generated/factories/{recording.js => session-recording.js} (93%) rename addons/api/mirage/models/{channel.js => channel-recording.js} (81%) rename addons/api/mirage/models/{connection.js => connection-recording.js} (71%) rename addons/api/mirage/models/{recording.js => session-recording.js} (87%) rename addons/api/mirage/serializers/{channel.js => channel-recording.js} (84%) rename addons/api/mirage/serializers/{connection.js => connection-recording.js} (59%) rename addons/api/mirage/serializers/{recording.js => session-recording.js} (65%) rename addons/api/tests/unit/models/{channel-test.js => channel-recording-test.js} (60%) rename addons/api/tests/unit/models/{connection-test.js => connection-recording-test.js} (50%) rename addons/api/tests/unit/models/{recording-test.js => session-recording-test.js} (56%) rename addons/api/tests/unit/serializers/{recording-test.js => connection-recording-test.js} (68%) rename addons/api/tests/unit/serializers/{connection-test.js => session-recording-test.js} (70%) rename ui/admin/app/abilities/{recording.js => session-recording.js} (83%) delete mode 100644 ui/admin/tests/unit/abilities/recording-test.js create mode 100644 ui/admin/tests/unit/abilities/session-recording-test.js diff --git a/addons/api/addon/abilities/recording.js b/addons/api/addon/abilities/session-recording.js similarity index 90% rename from addons/api/addon/abilities/recording.js rename to addons/api/addon/abilities/session-recording.js index 7d9da0957..6cd22ba84 100644 --- a/addons/api/addon/abilities/recording.js +++ b/addons/api/addon/abilities/session-recording.js @@ -8,7 +8,7 @@ import ModelAbility from './model'; /** * Provides abilities for session recordings. */ -export default class RecordingAbility extends ModelAbility { +export default class SessionRecordingAbility extends ModelAbility { // =services // =permissions diff --git a/addons/api/addon/generated/models/channel.js b/addons/api/addon/generated/models/channel-recording.js similarity index 93% rename from addons/api/addon/generated/models/channel.js rename to addons/api/addon/generated/models/channel-recording.js index 6f9a68b71..841930aac 100644 --- a/addons/api/addon/generated/models/channel.js +++ b/addons/api/addon/generated/models/channel-recording.js @@ -9,7 +9,7 @@ import { attr } from '@ember-data/model'; /** * A channel contains data for a single channel within a connection. */ -export default class GeneratedChannelModel extends BaseModel { +export default class GeneratedChannelRecordingModel extends BaseModel { // =attributes @attr('string', { diff --git a/addons/api/addon/generated/models/connection.js b/addons/api/addon/generated/models/connection-recording.js similarity index 92% rename from addons/api/addon/generated/models/connection.js rename to addons/api/addon/generated/models/connection-recording.js index b0d28d7f2..867b20c91 100644 --- a/addons/api/addon/generated/models/connection.js +++ b/addons/api/addon/generated/models/connection-recording.js @@ -9,7 +9,7 @@ import { attr } from '@ember-data/model'; /** * A connection contains data for a boundary connection within a session. */ -export default class GeneratedConnectionModel extends BaseModel { +export default class GeneratedConnectionRecordingModel extends BaseModel { // =attributes @attr('number', { diff --git a/addons/api/addon/generated/models/recording.js b/addons/api/addon/generated/models/session-recording.js similarity index 91% rename from addons/api/addon/generated/models/recording.js rename to addons/api/addon/generated/models/session-recording.js index 4853894e6..234f5acb0 100644 --- a/addons/api/addon/generated/models/recording.js +++ b/addons/api/addon/generated/models/session-recording.js @@ -7,9 +7,9 @@ import BaseModel from '../../models/base'; import { attr } from '@ember-data/model'; /** - * A recording contains all data related to session recordings + * A session recording contains all data related to session recordings */ -export default class GeneratedRecordingModel extends BaseModel { +export default class GeneratedSessionRecordingModel extends BaseModel { // =attributes @attr('string', { diff --git a/addons/api/addon/models/channel-recording.js b/addons/api/addon/models/channel-recording.js new file mode 100644 index 000000000..6652b11fe --- /dev/null +++ b/addons/api/addon/models/channel-recording.js @@ -0,0 +1,27 @@ +import GeneratedChannelRecordingModel from '../generated/models/channel-recording'; +import { belongsTo } from '@ember-data/model'; + +export const TYPE_CHANNEL_RECORDING_SESSION = 'session'; +export const TYPES_CHANNEL_RECORDING = Object.freeze([ + TYPE_CHANNEL_RECORDING_SESSION, +]); + +export default class ChannelRecordingModel extends GeneratedChannelRecordingModel { + @belongsTo('connection-recording') connection_recording; + + /** + * True if the channel type is `session`. + * @type {boolean} + */ + get isSession() { + return this.type === TYPE_CHANNEL_RECORDING_SESSION; + } + + /** + * True if the channel is an unknown type. + * @type {boolean} + */ + get isUnknown() { + return !TYPES_CHANNEL_RECORDING.includes(this.type); + } +} diff --git a/addons/api/addon/models/channel.js b/addons/api/addon/models/channel.js deleted file mode 100644 index f0e776d8e..000000000 --- a/addons/api/addon/models/channel.js +++ /dev/null @@ -1,25 +0,0 @@ -import GeneratedChannelModel from '../generated/models/channel'; -import { belongsTo } from '@ember-data/model'; - -export const TYPE_CHANNEL_SESSION = 'session'; -export const TYPES_CHANNEL = Object.freeze([TYPE_CHANNEL_SESSION]); - -export default class ChannelModel extends GeneratedChannelModel { - @belongsTo('connection') connection; - - /** - * True if the channel type is `session`. - * @type {boolean} - */ - get isSession() { - return this.type === TYPE_CHANNEL_SESSION; - } - - /** - * True if the channel is an unknown type. - * @type {boolean} - */ - get isUnknown() { - return !TYPES_CHANNEL.includes(this.type); - } -} diff --git a/addons/api/addon/models/connection-recording.js b/addons/api/addon/models/connection-recording.js new file mode 100644 index 000000000..58ee85449 --- /dev/null +++ b/addons/api/addon/models/connection-recording.js @@ -0,0 +1,7 @@ +import GeneratedConnectionRecordingModel from '../generated/models/connection-recording'; +import { belongsTo, hasMany } from '@ember-data/model'; + +export default class ConnectionRecordingModel extends GeneratedConnectionRecordingModel { + @belongsTo('session-recording') session_recording; + @hasMany('channel-recording') channel_recordings; +} diff --git a/addons/api/addon/models/connection.js b/addons/api/addon/models/connection.js deleted file mode 100644 index 482e85b4d..000000000 --- a/addons/api/addon/models/connection.js +++ /dev/null @@ -1,7 +0,0 @@ -import GeneratedConnectionModel from '../generated/models/connection'; -import { belongsTo, hasMany } from '@ember-data/model'; - -export default class ConnectionModel extends GeneratedConnectionModel { - @belongsTo('recording') recording; - @hasMany('channel') channels; -} diff --git a/addons/api/addon/models/recording.js b/addons/api/addon/models/recording.js deleted file mode 100644 index bea1ee92d..000000000 --- a/addons/api/addon/models/recording.js +++ /dev/null @@ -1,25 +0,0 @@ -import GeneratedRecordingModel from '../generated/models/recording'; -import { hasMany } from '@ember-data/model'; - -export const TYPE_RECORDING_SSH = 'ssh'; -export const TYPES_RECORDING = Object.freeze([TYPE_RECORDING_SSH]); - -export default class RecordingModel extends GeneratedRecordingModel { - @hasMany('connection') connections; - - /** - * True if the recording type is `ssh`. - * @type {boolean} - */ - get isSSH() { - return this.type === TYPE_RECORDING_SSH; - } - - /** - * True if the recording is an unknown type. - * @type {boolean} - */ - get isUnknown() { - return !TYPES_RECORDING.includes(this.type); - } -} diff --git a/addons/api/addon/models/session-recording.js b/addons/api/addon/models/session-recording.js new file mode 100644 index 000000000..6a125140d --- /dev/null +++ b/addons/api/addon/models/session-recording.js @@ -0,0 +1,44 @@ +import GeneratedSessionRecordingModel from '../generated/models/session-recording'; +import { hasMany } from '@ember-data/model'; +import { inject as service } from '@ember/service'; + +export const TYPE_SESSION_RECORDING_SSH = 'ssh'; +export const TYPES_SESSION_RECORDING = Object.freeze([ + TYPE_SESSION_RECORDING_SSH, +]); + +export default class SessionRecordingModel extends GeneratedSessionRecordingModel { + @hasMany('connection-recording') connection_recordings; + + @service store; + + /** + * True if the session recording type is `ssh`. + * @type {boolean} + */ + get isSSH() { + return this.type === TYPE_SESSION_RECORDING_SSH; + } + + /** + * True if the session recording is an unknown type. + * @type {boolean} + */ + get isUnknown() { + return !TYPES_SESSION_RECORDING.includes(this.type); + } + + getAsciiCast({ connectionId, channelId, mimeType }) { + const adapter = this.store.adapterFor('application'); + const options = { adapterOptions: { method: 'download' } }; + const url = adapter.buildURL( + 'session-recording', + this.id, + options, + 'findRecord' + ); + return adapter.ajax(url, 'GET', { + data: { connectionId, channelId, mimeType }, + }); + } +} diff --git a/addons/api/addon/serializers/connection.js b/addons/api/addon/serializers/connection-recording.js similarity index 83% rename from addons/api/addon/serializers/connection.js rename to addons/api/addon/serializers/connection-recording.js index 95c01903b..4f385ac2b 100644 --- a/addons/api/addon/serializers/connection.js +++ b/addons/api/addon/serializers/connection-recording.js @@ -5,6 +5,6 @@ export default class ConnectionSerializer extends ApplicationSerializer.extend( EmbeddedRecordsMixin ) { attrs = { - channels: { embedded: 'always' }, + channel_recordings: { embedded: 'always' }, }; } diff --git a/addons/api/addon/serializers/recording.js b/addons/api/addon/serializers/session-recording.js similarity index 82% rename from addons/api/addon/serializers/recording.js rename to addons/api/addon/serializers/session-recording.js index 6759db0dd..0512b8667 100644 --- a/addons/api/addon/serializers/recording.js +++ b/addons/api/addon/serializers/session-recording.js @@ -4,6 +4,6 @@ export default class RecordingSerializer extends ApplicationSerializer.extend( EmbeddedRecordsMixin ) { attrs = { - connections: { embedded: 'always' }, + connection_recordings: { embedded: 'always' }, }; } diff --git a/addons/api/app/abilities/recording.js b/addons/api/app/abilities/session-recording.js similarity index 100% rename from addons/api/app/abilities/recording.js rename to addons/api/app/abilities/session-recording.js diff --git a/addons/api/app/models/channel-recording.js b/addons/api/app/models/channel-recording.js new file mode 100644 index 000000000..3567b0777 --- /dev/null +++ b/addons/api/app/models/channel-recording.js @@ -0,0 +1 @@ +export { default } from 'api/models/channel-recording'; diff --git a/addons/api/app/models/channel.js b/addons/api/app/models/channel.js deleted file mode 100644 index 83fa2e823..000000000 --- a/addons/api/app/models/channel.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'api/models/channel'; diff --git a/addons/api/app/models/connection-recording.js b/addons/api/app/models/connection-recording.js new file mode 100644 index 000000000..bb13c4dbe --- /dev/null +++ b/addons/api/app/models/connection-recording.js @@ -0,0 +1 @@ +export { default } from 'api/models/connection-recording'; diff --git a/addons/api/app/models/connection.js b/addons/api/app/models/connection.js deleted file mode 100644 index 17c9eb2ac..000000000 --- a/addons/api/app/models/connection.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'api/models/connection'; diff --git a/addons/api/app/models/recording.js b/addons/api/app/models/recording.js deleted file mode 100644 index bdcbf74be..000000000 --- a/addons/api/app/models/recording.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'api/models/recording'; diff --git a/addons/api/app/models/session-recording.js b/addons/api/app/models/session-recording.js new file mode 100644 index 000000000..2e4b944fa --- /dev/null +++ b/addons/api/app/models/session-recording.js @@ -0,0 +1 @@ +export { default } from 'api/models/session-recording'; diff --git a/addons/api/app/serializers/connection-recording.js b/addons/api/app/serializers/connection-recording.js new file mode 100644 index 000000000..cf62e55de --- /dev/null +++ b/addons/api/app/serializers/connection-recording.js @@ -0,0 +1 @@ +export { default } from 'api/serializers/connection-recording'; diff --git a/addons/api/app/serializers/connection.js b/addons/api/app/serializers/connection.js deleted file mode 100644 index ab831ba04..000000000 --- a/addons/api/app/serializers/connection.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'api/serializers/connection'; diff --git a/addons/api/app/serializers/recording.js b/addons/api/app/serializers/recording.js deleted file mode 100644 index 921180bea..000000000 --- a/addons/api/app/serializers/recording.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'api/serializers/recording'; diff --git a/addons/api/app/serializers/session-recording.js b/addons/api/app/serializers/session-recording.js new file mode 100644 index 000000000..57403d214 --- /dev/null +++ b/addons/api/app/serializers/session-recording.js @@ -0,0 +1 @@ +export { default } from 'api/serializers/session-recording'; diff --git a/addons/api/mirage/config.js b/addons/api/mirage/config.js index 648229604..29c98b72a 100644 --- a/addons/api/mirage/config.js +++ b/addons/api/mirage/config.js @@ -688,12 +688,12 @@ function routes() { // session recordings this.get( - '/recordings', - ({ recordings }, { queryParams: { scope_id: scopeId } }) => { - return recordings.where({ scopeId }); + '/session-recordings', + ({ sessionRecordings }, { queryParams: { scope_id: scopeId } }) => { + return sessionRecordings.where({ scopeId }); } ); - this.get('/recordings/:id'); + this.get('/session-recordings/:id'); /* Uncomment the following line and the Response import above * Then change the response code to simulate error responses. diff --git a/addons/api/mirage/factories/channel.js b/addons/api/mirage/factories/channel-recording.js similarity index 61% rename from addons/api/mirage/factories/channel.js rename to addons/api/mirage/factories/channel-recording.js index 812d7da44..3880e60d6 100644 --- a/addons/api/mirage/factories/channel.js +++ b/addons/api/mirage/factories/channel-recording.js @@ -3,9 +3,9 @@ * SPDX-License-Identifier: MPL-2.0 */ -import factory from '../generated/factories/channel'; +import factory from '../generated/factories/channel-recording'; import generateId from '../helpers/id'; -import { TYPES_CHANNEL as types } from 'api/models/channel'; +import { TYPES_CHANNEL_RECORDING as types } from 'api/models/channel-recording'; export default factory.extend({ id: () => generateId('srcc_'), diff --git a/addons/api/mirage/factories/connection.js b/addons/api/mirage/factories/connection-recording.js similarity index 73% rename from addons/api/mirage/factories/connection.js rename to addons/api/mirage/factories/connection-recording.js index 455c4941f..13619fa22 100644 --- a/addons/api/mirage/factories/connection.js +++ b/addons/api/mirage/factories/connection-recording.js @@ -3,7 +3,7 @@ * SPDX-License-Identifier: MPL-2.0 */ -import factory from '../generated/factories/connection'; +import factory from '../generated/factories/connection-recording'; import generateId from '../helpers/id'; export default factory.extend({ diff --git a/addons/api/mirage/factories/scope.js b/addons/api/mirage/factories/scope.js index 568efe1df..d94b84186 100644 --- a/addons/api/mirage/factories/scope.js +++ b/addons/api/mirage/factories/scope.js @@ -40,7 +40,7 @@ export default factory.extend({ // Session recording resources are only available on global or org scope if (this.type === 'global' || this.type === 'org') { collectionActions['storage-buckets'] = ['create', 'list']; - collectionActions.recordings = ['list']; + collectionActions['session-recordings'] = ['list']; } return collectionActions; diff --git a/addons/api/mirage/factories/recording.js b/addons/api/mirage/factories/session-recording.js similarity index 68% rename from addons/api/mirage/factories/recording.js rename to addons/api/mirage/factories/session-recording.js index ce2cf9c99..7d7977b4b 100644 --- a/addons/api/mirage/factories/recording.js +++ b/addons/api/mirage/factories/session-recording.js @@ -3,12 +3,12 @@ * SPDX-License-Identifier: MPL-2.0 */ -import factory from '../generated/factories/recording'; +import factory from '../generated/factories/session-recording'; import permissions from '../helpers/permissions'; import generateId from '../helpers/id'; import { faker } from '@faker-js/faker'; import { trait } from 'miragejs'; -import { TYPES_RECORDING as types } from 'api/models/recording'; +import { TYPES_SESSION_RECORDING as types } from 'api/models/session-recording'; const pickRandomElement = (arr) => faker.helpers.arrayElement(arr); export default factory.extend({ @@ -18,14 +18,14 @@ export default factory.extend({ type: (i) => types[i % types.length], authorized_actions: () => - permissions.authorizedActionsFor('recording') || [ + permissions.authorizedActionsFor('session-recording') || [ 'no-op', 'read', 'download', ], withNonExistingUserAndTarget: trait({ - afterCreate(recording, server) { + afterCreate(sessionRecording, server) { const user = pickRandomElement(server.schema.users.all().models); user.id = 'deleted_user'; const session = pickRandomElement(server.schema.sessions.all().models); @@ -33,7 +33,7 @@ export default factory.extend({ const target = session.target; target.id = 'deleted_target'; - recording.update({ + sessionRecording.update({ user, target, session, @@ -42,12 +42,12 @@ export default factory.extend({ }), withExistingUserAndTarget: trait({ - afterCreate(recording, server) { + afterCreate(sessionRecording, server) { const user = pickRandomElement(server.schema.users.all().models); const session = pickRandomElement(server.schema.sessions.all().models); const target = session.target; - recording.update({ + sessionRecording.update({ user, target, session, @@ -56,11 +56,11 @@ export default factory.extend({ }), withConnectionAndChannels: trait({ - afterCreate(recording, server) { + afterCreate(session_recording, server) { server - .createList('connection', 3, { recording }) - .forEach((connection) => { - server.createList('channel', 3, { connection }); + .createList('connection-recording', 3, { session_recording }) + .forEach((connection_recording) => { + server.createList('channel-recording', 3, { connection_recording }); }); }, }), diff --git a/addons/api/mirage/generated/factories/channel.js b/addons/api/mirage/generated/factories/channel-recording.js similarity index 91% rename from addons/api/mirage/generated/factories/channel.js rename to addons/api/mirage/generated/factories/channel-recording.js index e4e37b0f4..8c9602e57 100644 --- a/addons/api/mirage/generated/factories/channel.js +++ b/addons/api/mirage/generated/factories/channel-recording.js @@ -7,7 +7,7 @@ import { Factory } from 'miragejs'; import { faker } from '@faker-js/faker'; /** - * GeneratedChannelModelFactory + * GeneratedChannelRecordingModelFactory */ export default Factory.extend({ bytes_up: () => faker.datatype.number(), diff --git a/addons/api/mirage/generated/factories/connection.js b/addons/api/mirage/generated/factories/connection-recording.js similarity index 91% rename from addons/api/mirage/generated/factories/connection.js rename to addons/api/mirage/generated/factories/connection-recording.js index c58040ded..3f9eb3452 100644 --- a/addons/api/mirage/generated/factories/connection.js +++ b/addons/api/mirage/generated/factories/connection-recording.js @@ -7,7 +7,7 @@ import { Factory } from 'miragejs'; import { faker } from '@faker-js/faker'; /** - * GeneratedConnectionModelFactory + * GeneratedConnectionRecordingModelFactory */ export default Factory.extend({ bytes_up: () => faker.datatype.number(), diff --git a/addons/api/mirage/generated/factories/recording.js b/addons/api/mirage/generated/factories/session-recording.js similarity index 93% rename from addons/api/mirage/generated/factories/recording.js rename to addons/api/mirage/generated/factories/session-recording.js index 51824fd59..731e3dc3b 100644 --- a/addons/api/mirage/generated/factories/recording.js +++ b/addons/api/mirage/generated/factories/session-recording.js @@ -7,7 +7,7 @@ import { Factory } from 'miragejs'; import { faker } from '@faker-js/faker'; /** - * GeneratedRecordModelFactory + * GeneratedSessionRecordingModelFactory */ export default Factory.extend({ bytes_up: () => faker.datatype.number(), diff --git a/addons/api/mirage/models/channel.js b/addons/api/mirage/models/channel-recording.js similarity index 81% rename from addons/api/mirage/models/channel.js rename to addons/api/mirage/models/channel-recording.js index 19ee5e425..857e81844 100644 --- a/addons/api/mirage/models/channel.js +++ b/addons/api/mirage/models/channel-recording.js @@ -6,5 +6,5 @@ import { belongsTo, Model } from 'miragejs'; export default Model.extend({ - connection: belongsTo(), + connection_recording: belongsTo(), }); diff --git a/addons/api/mirage/models/connection.js b/addons/api/mirage/models/connection-recording.js similarity index 71% rename from addons/api/mirage/models/connection.js rename to addons/api/mirage/models/connection-recording.js index 5706ffe4b..eeb2f98de 100644 --- a/addons/api/mirage/models/connection.js +++ b/addons/api/mirage/models/connection-recording.js @@ -6,6 +6,6 @@ import { belongsTo, hasMany, Model } from 'miragejs'; export default Model.extend({ - recording: belongsTo(), - channels: hasMany(), + session_recording: belongsTo(), + channel_recordings: hasMany(), }); diff --git a/addons/api/mirage/models/recording.js b/addons/api/mirage/models/session-recording.js similarity index 87% rename from addons/api/mirage/models/recording.js rename to addons/api/mirage/models/session-recording.js index ec60ca095..c9ad6b47c 100644 --- a/addons/api/mirage/models/recording.js +++ b/addons/api/mirage/models/session-recording.js @@ -10,5 +10,5 @@ export default Model.extend({ user: belongsTo(), session: belongsTo(), target: belongsTo(), - connections: hasMany(), + connection_recordings: hasMany(), }); diff --git a/addons/api/mirage/scenarios/default.js b/addons/api/mirage/scenarios/default.js index e174d7d79..8b90d290c 100644 --- a/addons/api/mirage/scenarios/default.js +++ b/addons/api/mirage/scenarios/default.js @@ -114,20 +114,20 @@ export default function (server) { server.createList('storage-bucket', 3, { scope: globalScope }); server.createList('storage-bucket', 2, { scope: orgScope }); server.createList( - 'recording', + 'session-recording', 3, { scope: globalScope }, 'withConnectionAndChannels', 'withExistingUserAndTarget' ); server.create( - 'recording', + 'session-recording', { scope: globalScope }, 'withConnectionAndChannels', 'withNonExistingUserAndTarget' ); server.createList( - 'recording', + 'session-recording', 2, { scope: orgScope }, 'withConnectionAndChannels', diff --git a/addons/api/mirage/serializers/channel.js b/addons/api/mirage/serializers/channel-recording.js similarity index 84% rename from addons/api/mirage/serializers/channel.js rename to addons/api/mirage/serializers/channel-recording.js index 839e46f34..2fdc38fd8 100644 --- a/addons/api/mirage/serializers/channel.js +++ b/addons/api/mirage/serializers/channel-recording.js @@ -6,5 +6,5 @@ import ApplicationSerializer from './application'; export default ApplicationSerializer.extend({ - modelName: 'channel', + modelName: 'channel-recording', }); diff --git a/addons/api/mirage/serializers/connection.js b/addons/api/mirage/serializers/connection-recording.js similarity index 59% rename from addons/api/mirage/serializers/connection.js rename to addons/api/mirage/serializers/connection-recording.js index 6de18bbec..273b5a45b 100644 --- a/addons/api/mirage/serializers/connection.js +++ b/addons/api/mirage/serializers/connection-recording.js @@ -4,19 +4,19 @@ */ import ApplicationSerializer from './application'; -import ChannelSerializer from './channel'; +import ChannelSerializer from './channel-recording'; export default ApplicationSerializer.extend({ - modelName: 'connection', + modelName: 'connection-recording', _hashForModel(model) { const json = ApplicationSerializer.prototype._hashForModel.apply( this, arguments ); - const { channels } = this.schema; - if (model.channelIds) { - json.channels = model.channelIds.map((id) => { - const channel = channels.find(id); + const { channelRecordings } = this.schema; + if (model.channelRecordingIds) { + json.channel_recordings = model.channelRecordingIds.map((id) => { + const channel = channelRecordings.find(id); return ChannelSerializer.prototype._hashForModel.apply(this, [channel]); }); } diff --git a/addons/api/mirage/serializers/recording.js b/addons/api/mirage/serializers/session-recording.js similarity index 65% rename from addons/api/mirage/serializers/recording.js rename to addons/api/mirage/serializers/session-recording.js index a4ce487d3..59eb43c67 100644 --- a/addons/api/mirage/serializers/recording.js +++ b/addons/api/mirage/serializers/session-recording.js @@ -4,26 +4,27 @@ */ import ApplicationSerializer from './application'; -import ConnectionSerializer from './connection'; +import ConnectionRecordingSerializer from './connection-recording'; import UserSerializer from './user'; import TargetSerializer from './target'; export default ApplicationSerializer.extend({ - modelName: 'recording', + modelName: 'session-recording', _hashForModel(model) { const json = ApplicationSerializer.prototype._hashForModel.apply( this, arguments ); - const { connections, users, targets } = this.schema; + const { connectionRecordings, users, targets } = this.schema; // Manually map our models to the actual embedded json representation - if (model.connectionIds) { - json.connections = model.connectionIds.map((id) => { - const connection = connections.find(id); - return ConnectionSerializer.prototype._hashForModel.apply(this, [ - connection, - ]); + if (model.connectionRecordingIds) { + json.connection_recordings = model.connectionRecordingIds.map((id) => { + const connection = connectionRecordings.find(id); + return ConnectionRecordingSerializer.prototype._hashForModel.apply( + this, + [connection] + ); }); } if (model.userId) { diff --git a/addons/api/tests/unit/models/channel-test.js b/addons/api/tests/unit/models/channel-recording-test.js similarity index 60% rename from addons/api/tests/unit/models/channel-test.js rename to addons/api/tests/unit/models/channel-recording-test.js index 7447e0eb6..0a73c18d0 100644 --- a/addons/api/tests/unit/models/channel-test.js +++ b/addons/api/tests/unit/models/channel-recording-test.js @@ -1,23 +1,23 @@ import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; -import { TYPE_CHANNEL_SESSION } from 'api/models/channel'; +import { TYPE_CHANNEL_RECORDING_SESSION } from 'api/models/channel-recording'; -module('Unit | Model | channel', function (hooks) { +module('Unit | Model | channel-recording', function (hooks) { setupTest(hooks); test('it exists', function (assert) { let store = this.owner.lookup('service:store'); - let model = store.createRecord('channel', {}); + let model = store.createRecord('channel-recording', {}); assert.ok(model); }); test('it has isUnknown property and returns the expected values', async function (assert) { assert.expect(2); const store = this.owner.lookup('service:store'); - const modelA = store.createRecord('channel', { - type: TYPE_CHANNEL_SESSION, + const modelA = store.createRecord('channel-recording', { + type: TYPE_CHANNEL_RECORDING_SESSION, }); - const modelB = store.createRecord('channel', { + const modelB = store.createRecord('channel-recording', { type: 'no-such-type', }); assert.false(modelA.isUnknown); @@ -27,10 +27,10 @@ module('Unit | Model | channel', function (hooks) { test('it has isSession property and returns the expected values', async function (assert) { assert.expect(2); const store = this.owner.lookup('service:store'); - const modelA = store.createRecord('channel', { - type: TYPE_CHANNEL_SESSION, + const modelA = store.createRecord('channel-recording', { + type: TYPE_CHANNEL_RECORDING_SESSION, }); - const modelB = store.createRecord('channel', { + const modelB = store.createRecord('channel-recording', { type: 'random', }); assert.true(modelA.isSession); diff --git a/addons/api/tests/unit/models/connection-test.js b/addons/api/tests/unit/models/connection-recording-test.js similarity index 50% rename from addons/api/tests/unit/models/connection-test.js rename to addons/api/tests/unit/models/connection-recording-test.js index e6d50eaa9..30325bf4c 100644 --- a/addons/api/tests/unit/models/connection-test.js +++ b/addons/api/tests/unit/models/connection-recording-test.js @@ -1,23 +1,23 @@ import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; -module('Unit | Model | connection', function (hooks) { +module('Unit | Model | connection-recording', function (hooks) { setupTest(hooks); test('it exists', function (assert) { let store = this.owner.lookup('service:store'); - let model = store.createRecord('connection', {}); + let model = store.createRecord('connection-recording', {}); assert.ok(model); }); test('it has channels as a relationship', async function (assert) { assert.expect(1); const store = this.owner.lookup('service:store'); - const model = store.createRecord('connection', { - channels: [store.createRecord('channel')], + const model = store.createRecord('connection-recording', { + channel_recordings: [store.createRecord('channel-recording')], }); - const channels = await model.channels; - assert.strictEqual(channels.length, 1); + const channel_recordings = await model.channel_recordings; + assert.strictEqual(channel_recordings.length, 1); }); }); diff --git a/addons/api/tests/unit/models/recording-test.js b/addons/api/tests/unit/models/session-recording-test.js similarity index 56% rename from addons/api/tests/unit/models/recording-test.js rename to addons/api/tests/unit/models/session-recording-test.js index 096954c8b..ca6705d00 100644 --- a/addons/api/tests/unit/models/recording-test.js +++ b/addons/api/tests/unit/models/session-recording-test.js @@ -1,25 +1,25 @@ import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; -import { TYPE_RECORDING_SSH } from 'api/models/recording'; +import { TYPE_SESSION_RECORDING_SSH } from 'api/models/session-recording'; import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; -module('Unit | Model | recording', function (hooks) { +module('Unit | Model | session-recording', function (hooks) { setupTest(hooks); setupMirage(hooks); test('it exists', function (assert) { let store = this.owner.lookup('service:store'); - let model = store.createRecord('recording', {}); + let model = store.createRecord('session-recording', {}); assert.ok(model); }); test('it has isUnknown property and returns the expected values', async function (assert) { assert.expect(2); const store = this.owner.lookup('service:store'); - const modelA = store.createRecord('recording', { - type: TYPE_RECORDING_SSH, + const modelA = store.createRecord('session-recording', { + type: TYPE_SESSION_RECORDING_SSH, }); - const modelB = store.createRecord('recording', { + const modelB = store.createRecord('session-recording', { type: 'no-such-type', }); assert.false(modelA.isUnknown); @@ -29,10 +29,10 @@ module('Unit | Model | recording', function (hooks) { test('it has isSSH property and returns the expected values', async function (assert) { assert.expect(2); const store = this.owner.lookup('service:store'); - const modelA = store.createRecord('recording', { - type: TYPE_RECORDING_SSH, + const modelA = store.createRecord('session-recording', { + type: TYPE_SESSION_RECORDING_SSH, }); - const modelB = store.createRecord('recording', { + const modelB = store.createRecord('session-recording', { type: 'random', }); assert.true(modelA.isSSH); @@ -42,12 +42,12 @@ module('Unit | Model | recording', function (hooks) { test('it has connections as a relationship', async function (assert) { assert.expect(1); const store = this.owner.lookup('service:store'); - const model = store.createRecord('recording', { - type: TYPE_RECORDING_SSH, - connections: [store.createRecord('connection')], + const model = store.createRecord('session-recording', { + type: TYPE_SESSION_RECORDING_SSH, + connection_recordings: [store.createRecord('connection-recording')], }); - const connections = await model.connections; - assert.strictEqual(connections.length, 1); + const connection_recordings = await model.connection_recordings; + assert.strictEqual(connection_recordings.length, 1); }); }); diff --git a/addons/api/tests/unit/serializers/recording-test.js b/addons/api/tests/unit/serializers/connection-recording-test.js similarity index 68% rename from addons/api/tests/unit/serializers/recording-test.js rename to addons/api/tests/unit/serializers/connection-recording-test.js index 458e02c16..9a72a2f69 100644 --- a/addons/api/tests/unit/serializers/recording-test.js +++ b/addons/api/tests/unit/serializers/connection-recording-test.js @@ -1,20 +1,20 @@ import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; -module('Unit | Serializer | recording', function (hooks) { +module('Unit | Serializer | connection-recording-recording', function (hooks) { setupTest(hooks); // Replace this with your real tests. test('it exists', function (assert) { let store = this.owner.lookup('service:store'); - let serializer = store.serializerFor('recording'); + let serializer = store.serializerFor('connection-recording'); assert.ok(serializer); }); test('it serializes records', function (assert) { let store = this.owner.lookup('service:store'); - let record = store.createRecord('recording', {}); + let record = store.createRecord('connection-recording', {}); let serializedRecord = record.serialize(); diff --git a/addons/api/tests/unit/serializers/connection-test.js b/addons/api/tests/unit/serializers/session-recording-test.js similarity index 70% rename from addons/api/tests/unit/serializers/connection-test.js rename to addons/api/tests/unit/serializers/session-recording-test.js index 02a53897d..b1073919a 100644 --- a/addons/api/tests/unit/serializers/connection-test.js +++ b/addons/api/tests/unit/serializers/session-recording-test.js @@ -1,20 +1,20 @@ import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; -module('Unit | Serializer | connection', function (hooks) { +module('Unit | Serializer | session-recording', function (hooks) { setupTest(hooks); // Replace this with your real tests. test('it exists', function (assert) { let store = this.owner.lookup('service:store'); - let serializer = store.serializerFor('connection'); + let serializer = store.serializerFor('session-recording'); assert.ok(serializer); }); test('it serializes records', function (assert) { let store = this.owner.lookup('service:store'); - let record = store.createRecord('connection', {}); + let record = store.createRecord('session-recording', {}); let serializedRecord = record.serialize(); diff --git a/ui/admin/app/abilities/recording.js b/ui/admin/app/abilities/session-recording.js similarity index 83% rename from ui/admin/app/abilities/recording.js rename to ui/admin/app/abilities/session-recording.js index 3365397c8..ed0a53499 100644 --- a/ui/admin/app/abilities/recording.js +++ b/ui/admin/app/abilities/session-recording.js @@ -3,10 +3,10 @@ * SPDX-License-Identifier: MPL-2.0 */ -import RecordingAbility from 'api/abilities/recording'; +import SessionRecordingAbility from 'api/abilities/session-recording'; import { inject as service } from '@ember/service'; -export default class OverrideRecordingAbility extends RecordingAbility { +export default class OverrideSessionRecordingAbility extends SessionRecordingAbility { // =service @service features; diff --git a/ui/admin/tests/unit/abilities/recording-test.js b/ui/admin/tests/unit/abilities/recording-test.js deleted file mode 100644 index 05a46b2b5..000000000 --- a/ui/admin/tests/unit/abilities/recording-test.js +++ /dev/null @@ -1,221 +0,0 @@ -/** - * Copyright (c) HashiCorp, Inc. - * SPDX-License-Identifier: MPL-2.0 - */ - -import { module, test } from 'qunit'; -import { setupTest } from 'ember-qunit'; -import { TYPE_RECORDING_SSH } from 'api/models/recording'; - -module('Unit | Abilities | session-recording', function (hooks) { - setupTest(hooks); - - let features; - let canService; - let store; - - hooks.beforeEach(function () { - features = this.owner.lookup('service:features'); - features.enable('session-recording'); - canService = this.owner.lookup('service:can'); - store = this.owner.lookup('service:store'); - }); - - test('can read session recording feature is enabled', function (assert) { - assert.expect(2); - - const recordingWithAuthorizedAction = store.createRecord('recording', { - authorized_actions: ['read'], - type: TYPE_RECORDING_SSH, - }); - const recordingWithoutAuthorizedAction = store.createRecord('recording', { - authorized_actions: [], - type: TYPE_RECORDING_SSH, - }); - - assert.true( - canService.can('read recording', recordingWithAuthorizedAction) - ); - assert.false( - canService.can('read recording', recordingWithoutAuthorizedAction) - ); - }); - - test('cannot read session recording when feature is disabled', function (assert) { - assert.expect(2); - features.disable('session-recording'); - - const recordingWithAuthorizedAction = store.createRecord('recording', { - authorized_actions: ['read'], - type: TYPE_RECORDING_SSH, - }); - const recordingWithoutAuthorizedAction = store.createRecord('recording', { - authorized_actions: [], - type: TYPE_RECORDING_SSH, - }); - - assert.false( - canService.can('read recording', recordingWithAuthorizedAction) - ); - assert.false( - canService.can('read recording', recordingWithoutAuthorizedAction) - ); - }); - - test('can list session recording when in global scope', function (assert) { - assert.expect(2); - - const scopeModelWithAuthorizedAction = store.createRecord('scope', { - authorized_collection_actions: { recordings: ['list'] }, - type: 'global', - id: 'first', - }); - const scopeModelWithoutAuthorizedAction = store.createRecord('scope', { - authorized_collection_actions: { recordings: [] }, - type: 'global', - id: 'second', - }); - - assert.true( - canService.can('list recording', scopeModelWithAuthorizedAction, { - collection: 'recordings', - }) - ); - assert.false( - canService.can('list recording', scopeModelWithoutAuthorizedAction, { - collection: 'recordings', - }) - ); - }); - - test('cannot list session recording when in org scope', function (assert) { - assert.expect(2); - - const scopeModelWithAuthorizedAction = store.createRecord('scope', { - authorized_collection_actions: { recordings: ['list'] }, - type: 'org', - id: 'first', - }); - const scopeModelWithoutAuthorizedAction = store.createRecord('scope', { - authorized_collection_actions: { recordings: [] }, - type: 'org', - id: 'second', - }); - - assert.false( - canService.can('list recording', scopeModelWithAuthorizedAction, { - collection: 'recordings', - }) - ); - assert.false( - canService.can('list recording', scopeModelWithoutAuthorizedAction, { - collection: 'recordings', - }) - ); - }); - - test('can navigate to session recording when feature is enabled', function (assert) { - assert.expect(2); - - const scopeModelWithAuthorizedAction = store.createRecord('scope', { - authorized_collection_actions: { recordings: ['list'] }, - type: 'global', - id: 'first', - }); - const scopeModelWithoutAuthorizedAction = store.createRecord('scope', { - authorized_collection_actions: { recordings: [] }, - type: 'global', - id: 'second', - }); - - assert.true( - canService.can('navigate recording', scopeModelWithAuthorizedAction, { - collection: 'recordings', - }) - ); - assert.false( - canService.can('navigate recording', scopeModelWithoutAuthorizedAction, { - collection: 'recordings', - }) - ); - }); - - test('cannot navigate to session recording when feature is disabled', function (assert) { - assert.expect(2); - features.disable('session-recording'); - - const scopeModelWithAuthorizedAction = store.createRecord('scope', { - authorized_collection_actions: { recordings: ['list'] }, - type: 'global', - id: 'first', - }); - const scopeModelWithoutAuthorizedAction = store.createRecord('scope', { - authorized_collection_actions: { recordings: [] }, - type: 'global', - id: 'second', - }); - - assert.false( - canService.can('navigate recording', scopeModelWithAuthorizedAction, { - collection: 'recordings', - }) - ); - assert.false( - canService.can('navigate recording', scopeModelWithoutAuthorizedAction, { - collection: 'recordings', - }) - ); - }); - - test('can download asciicast when an ssh recording has download authorization', function (assert) { - assert.expect(2); - - const recordingWithAuthorizedAction = store.createRecord('recording', { - authorized_actions: ['download'], - type: TYPE_RECORDING_SSH, - }); - const recordingWithoutAuthorizedAction = store.createRecord('recording', { - authorized_actions: [], - type: TYPE_RECORDING_SSH, - }); - - assert.true( - canService.can( - 'downloadAsciiCast recording', - recordingWithAuthorizedAction - ) - ); - assert.false( - canService.can( - 'downloadAsciiCast recording', - recordingWithoutAuthorizedAction - ) - ); - }); - - test('cannot download asciicast when a recording is not ssh type', function (assert) { - assert.expect(2); - - const recordingWithAuthorizedAction = store.createRecord('recording', { - authorized_actions: ['download'], - type: 'unknown', - }); - const recordingWithoutAuthorizedAction = store.createRecord('recording', { - authorized_actions: [], - type: 'unknown', - }); - - assert.false( - canService.can( - 'downloadAsciiCast recording', - recordingWithAuthorizedAction - ) - ); - assert.false( - canService.can( - 'downloadAsciiCast recording', - recordingWithoutAuthorizedAction - ) - ); - }); -}); diff --git a/ui/admin/tests/unit/abilities/session-recording-test.js b/ui/admin/tests/unit/abilities/session-recording-test.js new file mode 100644 index 000000000..027d716bc --- /dev/null +++ b/ui/admin/tests/unit/abilities/session-recording-test.js @@ -0,0 +1,269 @@ +/** + * Copyright (c) HashiCorp, Inc. + * SPDX-License-Identifier: MPL-2.0 + */ + +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; +import { TYPE_SESSION_RECORDING_SSH } from 'api/models/session-recording'; + +module('Unit | Abilities | session-recording', function (hooks) { + setupTest(hooks); + + let features; + let canService; + let store; + + hooks.beforeEach(function () { + features = this.owner.lookup('service:features'); + features.enable('session-recording'); + canService = this.owner.lookup('service:can'); + store = this.owner.lookup('service:store'); + }); + + test('can read session recording feature is enabled', function (assert) { + assert.expect(2); + + const recordingWithAuthorizedAction = store.createRecord( + 'session-recording', + { + authorized_actions: ['read'], + type: TYPE_SESSION_RECORDING_SSH, + } + ); + const recordingWithoutAuthorizedAction = store.createRecord( + 'session-recording', + { + authorized_actions: [], + type: TYPE_SESSION_RECORDING_SSH, + } + ); + + assert.true( + canService.can('read session-recording', recordingWithAuthorizedAction) + ); + assert.false( + canService.can('read session-recording', recordingWithoutAuthorizedAction) + ); + }); + + test('cannot read session recording when feature is disabled', function (assert) { + assert.expect(2); + features.disable('session-recording'); + + const recordingWithAuthorizedAction = store.createRecord( + 'session-recording', + { + authorized_actions: ['read'], + type: TYPE_SESSION_RECORDING_SSH, + } + ); + const recordingWithoutAuthorizedAction = store.createRecord( + 'session-recording', + { + authorized_actions: [], + type: TYPE_SESSION_RECORDING_SSH, + } + ); + + assert.false( + canService.can('read session-recording', recordingWithAuthorizedAction) + ); + assert.false( + canService.can('read session-recording', recordingWithoutAuthorizedAction) + ); + }); + + test('can list session recording when in global scope', function (assert) { + assert.expect(2); + + const scopeModelWithAuthorizedAction = store.createRecord('scope', { + authorized_collection_actions: { ['session-recordings']: ['list'] }, + type: 'global', + id: 'first', + }); + const scopeModelWithoutAuthorizedAction = store.createRecord('scope', { + authorized_collection_actions: { ['session-recordings']: [] }, + type: 'global', + id: 'second', + }); + + assert.true( + canService.can('list session-recording', scopeModelWithAuthorizedAction, { + collection: 'session-recordings', + }) + ); + assert.false( + canService.can( + 'list session-recording', + scopeModelWithoutAuthorizedAction, + { + collection: 'session-recordings', + } + ) + ); + }); + + test('cannot list session recording when in org scope', function (assert) { + assert.expect(2); + + const scopeModelWithAuthorizedAction = store.createRecord('scope', { + authorized_collection_actions: { ['session-recordings']: ['list'] }, + type: 'org', + id: 'first', + }); + const scopeModelWithoutAuthorizedAction = store.createRecord('scope', { + authorized_collection_actions: { ['session-recordings']: [] }, + type: 'org', + id: 'second', + }); + + assert.false( + canService.can('list session-recording', scopeModelWithAuthorizedAction, { + collection: 'session-recordings', + }) + ); + assert.false( + canService.can( + 'list session-recording', + scopeModelWithoutAuthorizedAction, + { + collection: 'session-recordings', + } + ) + ); + }); + + test('can navigate to session recording when feature is enabled', function (assert) { + assert.expect(2); + + const scopeModelWithAuthorizedAction = store.createRecord('scope', { + authorized_collection_actions: { ['session-recordings']: ['list'] }, + type: 'global', + id: 'first', + }); + const scopeModelWithoutAuthorizedAction = store.createRecord('scope', { + authorized_collection_actions: { ['session-recordings']: [] }, + type: 'global', + id: 'second', + }); + + assert.true( + canService.can( + 'navigate session-recording', + scopeModelWithAuthorizedAction, + { + collection: 'session-recordings', + } + ) + ); + assert.false( + canService.can( + 'navigate session-recording', + scopeModelWithoutAuthorizedAction, + { + collection: 'session-recordings', + } + ) + ); + }); + + test('cannot navigate to session recording when feature is disabled', function (assert) { + assert.expect(2); + features.disable('session-recording'); + + const scopeModelWithAuthorizedAction = store.createRecord('scope', { + authorized_collection_actions: { ['session-recordings']: ['list'] }, + type: 'global', + id: 'first', + }); + const scopeModelWithoutAuthorizedAction = store.createRecord('scope', { + authorized_collection_actions: { ['session-recordings']: [] }, + type: 'global', + id: 'second', + }); + + assert.false( + canService.can( + 'navigate session-recording', + scopeModelWithAuthorizedAction, + { + collection: 'session-recordings', + } + ) + ); + assert.false( + canService.can( + 'navigate session-recording', + scopeModelWithoutAuthorizedAction, + { + collection: 'session-recordings', + } + ) + ); + }); + + test('can download asciicast when an ssh recording has download authorization', function (assert) { + assert.expect(2); + + const recordingWithAuthorizedAction = store.createRecord( + 'session-recording', + { + authorized_actions: ['download'], + type: TYPE_SESSION_RECORDING_SSH, + } + ); + const recordingWithoutAuthorizedAction = store.createRecord( + 'session-recording', + { + authorized_actions: [], + type: TYPE_SESSION_RECORDING_SSH, + } + ); + + assert.true( + canService.can( + 'downloadAsciiCast session-recording', + recordingWithAuthorizedAction + ) + ); + assert.false( + canService.can( + 'downloadAsciiCast session-recording', + recordingWithoutAuthorizedAction + ) + ); + }); + + test('cannot download asciicast when a recording is not ssh type', function (assert) { + assert.expect(2); + + const recordingWithAuthorizedAction = store.createRecord( + 'session-recording', + { + authorized_actions: ['download'], + type: 'unknown', + } + ); + const recordingWithoutAuthorizedAction = store.createRecord( + 'session-recording', + { + authorized_actions: [], + type: 'unknown', + } + ); + + assert.false( + canService.can( + 'downloadAsciiCast session-recording', + recordingWithAuthorizedAction + ) + ); + assert.false( + canService.can( + 'downloadAsciiCast session-recording', + recordingWithoutAuthorizedAction + ) + ); + }); +});