chore: 🤖 introduce Scope model with self relationships

This commit is contained in:
Randall Morey committed 2020-07-14 18:47:35 -04:00
1 parent a02c7c656b
commit eb4b29ac1b
5 files changed
+108

No files matched your search

@@ -0,0 +1,37 @@
import BaseModel from '../../models/base';
import { attr } from '@ember-data/model';
/**
*
*/
export default class GeneratedScopeModel extends BaseModel {
// =attributes
@attr('string', {
description: 'The type of the resource'
}) type;
@attr('string', {
description: 'Optional name for identification purposes',
})
name;
@attr('string', {
description: 'Optional user-set description for identification purposes',
})
description;
@attr('date', {
description: 'The time this resource was created\nOutput only.',
readOnly: true,
})
created_time;
@attr('date', {
description: 'The time this resource was last updated\nOutput only.',
readOnly: true,
})
updated_time;
}
+20
View File
@@ -0,0 +1,20 @@
import GeneratedScopeModel from '../generated/models/scope';
import { belongsTo, hasMany } from '@ember-data/model';
export default class ScopeModel extends GeneratedScopeModel {
// =relationships
/**
* The parent scope, if any.
* @type {ScopeModel}
*/
@belongsTo('scope', {inverse: 'childrenScopes'}) parentScope;
/**
* The inverse of parent scope, children.
* @type {ScopeModelp[]}
*/
@hasMany('scope', {inverse: 'parentScope'}) childrenScopes;
}
@@ -17,6 +17,15 @@ export default class ApplicationSerializer extends RESTSerializer {
return underscore(attr);
}
/**
* Generates an underscored key for the relationship ending in `_id`.
* @param {string} rel
* @return {string}
*/
keyForRelationship(rel) {
return `${underscore(rel)}_id`;
}
/**
* If an attribute is annotated as readOnly in the model, don't serialize it.
* Otherwise delegate to default attribute serializer.
+1
View File
@@ -0,0 +1 @@
export { default } from 'api/models/scope';
@@ -0,0 +1,41 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
import setupMirage from 'ember-cli-mirage/test-support/setup-mirage';
module('Unit | Model | scope', function(hooks) {
setupTest(hooks);
setupMirage(hooks);
test('it exists', function(assert) {
let store = this.owner.lookup('service:store');
let model = store.createRecord('scope', {});
assert.ok(model);
});
test('it has self-referential parent and child relationships', async function(assert) {
assert.expect(9);
const store = this.owner.lookup('service:store');
this.server.get('/v1/scopes', () => ({
items: [
{id: 'global', type: 'global'},
{id: 'o_1', type: 'org', parent_scope_id: 'global'},
{id: 'o_2', type: 'org', parent_scope_id: 'global'},
{id: 'p_1', type: 'project', parent_scope_id: 'o_1'},
{id: 'p_2', type: 'project', parent_scope_id: 'o_1'},
{id: 'p_3', type: 'project', parent_scope_id: 'o_2'}
]
}));
const scopes = await store.findAll('scope');
// check integrity of scope relationships
assert.notOk(await scopes.firstObject.get('parentScope'), 'Global scope has no parent');
assert.equal(await scopes.firstObject.get('childrenScopes.length'), 2, 'Global scope has two children scopes');
assert.equal(await scopes.objectAt(1).get('parentScope.id'), 'global', 'Org 1 parent scope is global');
assert.equal(await scopes.objectAt(2).get('parentScope.id'), 'global', 'Org 2 parent scope is global');
assert.equal(await scopes.objectAt(1).get('childrenScopes.length'), 2, 'Org 1 has two children scopes');
assert.equal(await scopes.objectAt(2).get('childrenScopes.length'), 1, 'Org 2 has one child scope');
assert.equal(await scopes.objectAt(3).get('parentScope.id'), 'o_1', 'Project 1 parent scope is org 1');
assert.equal(await scopes.objectAt(4).get('parentScope.id'), 'o_1', 'Project 2 parent scope is org 1');
assert.equal(await scopes.objectAt(5).get('parentScope.id'), 'o_2', 'Project 3 parent scope is org 2');
});
});