ui: Adds ember-data blueprints for Consul specific HTTP adapter etc (#6461)
* ui: Adds ember-data blueprints for Consul specific HTTP adapter etc These are currently quite Consul specific, but we also overwrite the default model-test blueprint to keep the names consistent (dasherized) for easy test filtering. ``` ember generate [adapter|serializer|model|repository|route] <name> ```
This commit is contained in:
parent
4c24e8b072
commit
39010d2b76
|
@ -0,0 +1,27 @@
|
|||
/*eslint node/no-extraneous-require: "off"*/
|
||||
'use strict';
|
||||
|
||||
const useTestFrameworkDetector = require('@ember-data/-build-infra/src/utilities/test-framework-detector');
|
||||
const path = require('path');
|
||||
|
||||
module.exports = useTestFrameworkDetector({
|
||||
description: 'Generates a Consul HTTP ember-data adapter unit and integration tests',
|
||||
|
||||
root: __dirname,
|
||||
|
||||
fileMapTokens(options) {
|
||||
return {
|
||||
__root__() {
|
||||
return 'tests';
|
||||
},
|
||||
__path__() {
|
||||
return '';
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
locals(options) {
|
||||
return {
|
||||
};
|
||||
},
|
||||
});
|
|
@ -0,0 +1,36 @@
|
|||
import { module, test } from 'qunit';
|
||||
import { setupTest } from 'ember-qunit';
|
||||
|
||||
module('Integration | Adapter | <%= dasherizedModuleName %>', function(hooks) {
|
||||
setupTest(hooks);
|
||||
const dc = 'dc-1';
|
||||
const id = 'slug';
|
||||
test('requestForQuery returns the correct url/method', function(assert) {
|
||||
const adapter = this.owner.lookup('adapter:<%= dasherizedModuleName %>');
|
||||
const client = this.owner.lookup('service:client/http');
|
||||
const expected = `GET /v1/<%= dasherizedModuleName %>?dc=${dc}`;
|
||||
const actual = adapter.requestForQuery(client.url, {
|
||||
dc: dc,
|
||||
});
|
||||
assert.equal(actual, expected);
|
||||
});
|
||||
test('requestForQueryRecord returns the correct url/method', function(assert) {
|
||||
const adapter = this.owner.lookup('adapter:<%= dasherizedModuleName %>');
|
||||
const client = this.owner.lookup('service:client/http');
|
||||
const expected = `GET /v1/<%= dasherizedModuleName %>/${id}?dc=${dc}`;
|
||||
const actual = adapter.requestForQueryRecord(client.url, {
|
||||
dc: dc,
|
||||
id: id,
|
||||
});
|
||||
assert.equal(actual, expected);
|
||||
});
|
||||
test("requestForQueryRecord throws if you don't specify an id", function(assert) {
|
||||
const adapter = this.owner.lookup('adapter:<%= dasherizedModuleName %>');
|
||||
const client = this.owner.lookup('service:client/http');
|
||||
assert.throws(function() {
|
||||
adapter.requestForQueryRecord(client.url, {
|
||||
dc: dc,
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
|
@ -0,0 +1,12 @@
|
|||
import { module, test } from 'qunit';
|
||||
import { setupTest } from 'ember-qunit';
|
||||
|
||||
module('Unit | Adapter | <%= dasherizedModuleName %>', function(hooks) {
|
||||
setupTest(hooks);
|
||||
|
||||
// Replace this with your real tests.
|
||||
test('it exists', function(assert) {
|
||||
let adapter = this.owner.lookup('adapter:<%= dasherizedModuleName %>');
|
||||
assert.ok(adapter);
|
||||
});
|
||||
});
|
|
@ -0,0 +1,21 @@
|
|||
import Adapter from './application';
|
||||
|
||||
export default Adapter.extend({
|
||||
requestForQuery: function(request, { dc, index }) {
|
||||
return request`
|
||||
GET /v1/<%= dasherizedModuleName %>?${{ dc }}
|
||||
|
||||
${{ index }}
|
||||
`;
|
||||
},
|
||||
requestForQueryRecord: function(request, { dc, index, id }) {
|
||||
if (typeof id === 'undefined') {
|
||||
throw new Error('You must specify an id');
|
||||
}
|
||||
return request`
|
||||
GET /v1/<%= dasherizedModuleName %>/${id}?${{ dc }}
|
||||
|
||||
${{ index }}
|
||||
`;
|
||||
},
|
||||
});
|
|
@ -0,0 +1,37 @@
|
|||
/*eslint node/no-extraneous-require: "off"*/
|
||||
'use strict';
|
||||
|
||||
const path = require('path');
|
||||
const isModuleUnificationProject = require('@ember-data/-build-infra/src/utilities/module-unification').isModuleUnificationProject;
|
||||
module.exports = {
|
||||
description: 'Generates a Consul HTTP ember-data adapter',
|
||||
|
||||
availableOptions: [{ name: 'base-class', type: String }],
|
||||
|
||||
root: __dirname,
|
||||
|
||||
fileMapTokens(options) {
|
||||
if (isModuleUnificationProject(this.project)) {
|
||||
return {
|
||||
__root__() {
|
||||
return 'src';
|
||||
},
|
||||
__path__(options) {
|
||||
return path.join('data', 'models', options.dasherizedModuleName);
|
||||
},
|
||||
__name__() {
|
||||
return 'adapter';
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
locals(options) {
|
||||
// Return custom template variables here.
|
||||
return {
|
||||
};
|
||||
}
|
||||
|
||||
// afterInstall(options) {
|
||||
// // Perform extra work here.
|
||||
// }
|
||||
};
|
|
@ -0,0 +1,27 @@
|
|||
/*eslint node/no-extraneous-require: "off"*/
|
||||
'use strict';
|
||||
|
||||
const useTestFrameworkDetector = require('@ember-data/-build-infra/src/utilities/test-framework-detector');
|
||||
const path = require('path');
|
||||
|
||||
module.exports = useTestFrameworkDetector({
|
||||
description: 'Generates a Consul ember-data model unit tests',
|
||||
|
||||
root: __dirname,
|
||||
|
||||
fileMapTokens(options) {
|
||||
return {
|
||||
__root__() {
|
||||
return 'tests';
|
||||
},
|
||||
__path__() {
|
||||
return '';
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
locals(options) {
|
||||
return {
|
||||
};
|
||||
},
|
||||
});
|
|
@ -0,0 +1,13 @@
|
|||
import { module, test } from 'qunit';
|
||||
import { setupTest } from 'ember-qunit';
|
||||
|
||||
module('Unit | Model | <%= dasherizedModuleName %>', function(hooks) {
|
||||
setupTest(hooks);
|
||||
|
||||
// Replace this with your real tests.
|
||||
test('it exists', function(assert) {
|
||||
let store = this.owner.lookup('service:store');
|
||||
let model = store.createRecord('<%= dasherizedModuleName %>', {});
|
||||
assert.ok(model);
|
||||
});
|
||||
});
|
|
@ -0,0 +1,10 @@
|
|||
import Model from 'ember-data/model';
|
||||
import attr from 'ember-data/attr';
|
||||
|
||||
export const PRIMARY_KEY = 'uid';
|
||||
export const SLUG_KEY = 'ID';
|
||||
export default Model.extend({
|
||||
[PRIMARY_KEY]: attr('string'),
|
||||
[SLUG_KEY]: attr('string'),
|
||||
Datacenter: attr('string'),
|
||||
});
|
|
@ -0,0 +1,37 @@
|
|||
/*eslint node/no-extraneous-require: "off"*/
|
||||
'use strict';
|
||||
|
||||
const path = require('path');
|
||||
const isModuleUnificationProject = require('@ember-data/-build-infra/src/utilities/module-unification').isModuleUnificationProject;
|
||||
module.exports = {
|
||||
description: 'Generates a Consul HTTP ember-data model',
|
||||
|
||||
availableOptions: [],
|
||||
|
||||
root: __dirname,
|
||||
|
||||
fileMapTokens(options) {
|
||||
if (isModuleUnificationProject(this.project)) {
|
||||
return {
|
||||
__root__() {
|
||||
return 'src';
|
||||
},
|
||||
__path__(options) {
|
||||
return path.join('data', 'models', options.dasherizedModuleName);
|
||||
},
|
||||
__name__() {
|
||||
return 'model';
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
locals(options) {
|
||||
// Return custom template variables here.
|
||||
return {
|
||||
};
|
||||
}
|
||||
|
||||
// afterInstall(options) {
|
||||
// // Perform extra work here.
|
||||
// }
|
||||
};
|
|
@ -0,0 +1,28 @@
|
|||
/*eslint node/no-extraneous-require: "off"*/
|
||||
'use strict';
|
||||
|
||||
const useTestFrameworkDetector = require('@ember-data/-build-infra/src/utilities/test-framework-detector');
|
||||
const path = require('path');
|
||||
|
||||
module.exports = useTestFrameworkDetector({
|
||||
description: 'Generates a Consul HTTP ember-data serializer unit and integration tests',
|
||||
|
||||
root: __dirname,
|
||||
|
||||
fileMapTokens(options) {
|
||||
return {
|
||||
__root__() {
|
||||
return 'tests';
|
||||
},
|
||||
__path__() {
|
||||
return '';
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
locals(options) {
|
||||
return {
|
||||
screamingSnakeCaseModuleName: options.entity.name.replace('-', '_').toUpperCase()
|
||||
};
|
||||
},
|
||||
});
|
|
@ -0,0 +1,75 @@
|
|||
import { moduleFor, test } from 'ember-qunit';
|
||||
import repo from 'consul-ui/tests/helpers/repo';
|
||||
|
||||
moduleFor('service:repository/<%= dasherizedModuleName %>', 'Integration | Repository | <%= dasherizedModuleName %>', {
|
||||
// Specify the other units that are required for this test.
|
||||
integration: true,
|
||||
});
|
||||
const dc = 'dc-1';
|
||||
const id = 'slug';
|
||||
const now = new Date().getTime();
|
||||
test('findByDatacenter returns the correct data for list endpoint', function(assert) {
|
||||
get(this.subject(), 'store').serializerFor('<%= dasherizedModuleName %>').timestamp = function() {
|
||||
return now;
|
||||
};
|
||||
return repo(
|
||||
'Service',
|
||||
'findAllByDatacenter',
|
||||
this.subject(),
|
||||
function retrieveStub(stub) {
|
||||
return stub(`/v1/<%= dasherizedModuleName %>?dc=${dc}`, {
|
||||
CONSUL_<%= screamingSnakeCaseModuleName %>_COUNT: '100',
|
||||
});
|
||||
},
|
||||
function performTest(service) {
|
||||
return service.findAllByDatacenter(dc);
|
||||
},
|
||||
function performAssertion(actual, expected) {
|
||||
assert.deepEqual(
|
||||
actual,
|
||||
expected(function(payload) {
|
||||
return payload.map(item =>
|
||||
Object.assign({}, item, {
|
||||
SyncTime: now,
|
||||
Datacenter: dc,
|
||||
uid: `["${dc}","${item.Name}"]`,
|
||||
})
|
||||
);
|
||||
})
|
||||
);
|
||||
}
|
||||
);
|
||||
});
|
||||
test('findBySlug returns the correct data for item endpoint', function(assert) {
|
||||
return repo(
|
||||
'Service',
|
||||
'findBySlug',
|
||||
this.subject(),
|
||||
function retrieveStub(stub) {
|
||||
return stub(`/v1/<%= dasherizedModuleName %>/${id}?dc=${dc}`, {
|
||||
CONSUL_<%= screamingSnakeCaseModuleName %>_COUNT: 1,
|
||||
});
|
||||
},
|
||||
function performTest(service) {
|
||||
return service.findBySlug(id, dc);
|
||||
},
|
||||
function performAssertion(actual, expected) {
|
||||
assert.deepEqual(
|
||||
actual,
|
||||
expected(function(payload) {
|
||||
return Object.assign(
|
||||
{},
|
||||
{
|
||||
Datacenter: dc,
|
||||
uid: `["${dc}","${id}"]`,
|
||||
meta: {
|
||||
cursor: undefined
|
||||
}
|
||||
},
|
||||
payload
|
||||
);
|
||||
})
|
||||
);
|
||||
}
|
||||
);
|
||||
});
|
|
@ -0,0 +1,12 @@
|
|||
import { module, test } from 'qunit';
|
||||
import { setupTest } from 'ember-qunit';
|
||||
|
||||
module('Unit | Repository | <%= dasherizedModuleName %>', function(hooks) {
|
||||
setupTest(hooks);
|
||||
|
||||
// Replace this with your real tests.
|
||||
test('it exists', function(assert) {
|
||||
let repo = this.owner.lookup('service:repository/<%= dasherizedModuleName %>');
|
||||
assert.ok(repo);
|
||||
});
|
||||
});
|
|
@ -0,0 +1,8 @@
|
|||
import RepositoryService from 'consul-ui/services/repository';
|
||||
|
||||
const modelName = '<%= dasherizedModuleName %>';
|
||||
export default RepositoryService.extend({
|
||||
getModelName: function() {
|
||||
return modelName;
|
||||
},
|
||||
});
|
|
@ -0,0 +1,27 @@
|
|||
'use strict';
|
||||
|
||||
const path = require('path');
|
||||
module.exports = {
|
||||
description: 'Generates a Consul repository',
|
||||
|
||||
availableOptions: [],
|
||||
|
||||
root: __dirname,
|
||||
|
||||
fileMapTokens(options) {
|
||||
return {
|
||||
__path__() {
|
||||
return path.join('services', 'repository');
|
||||
}
|
||||
};
|
||||
},
|
||||
locals(options) {
|
||||
// Return custom template variables here.
|
||||
return {
|
||||
};
|
||||
}
|
||||
|
||||
// afterInstall(options) {
|
||||
// // Perform extra work here.
|
||||
// }
|
||||
};
|
|
@ -0,0 +1,4 @@
|
|||
import Route from '@ember/routing/route';
|
||||
|
||||
export default Route.extend({
|
||||
});
|
|
@ -0,0 +1 @@
|
|||
{{outlet}}
|
|
@ -0,0 +1,43 @@
|
|||
/* eslint-env node */
|
||||
const chalk = require('chalk');
|
||||
|
||||
module.exports = Object.assign(
|
||||
require('ember-source/blueprints/route/index.js'),
|
||||
{
|
||||
afterInstall: function(options) {
|
||||
updateRouter.call(this, 'add', options);
|
||||
},
|
||||
|
||||
afterUninstall: function(options) {
|
||||
updateRouter.call(this, 'remove', options);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
function updateRouter(action, options) {
|
||||
var entity = options.entity;
|
||||
var actionColorMap = {
|
||||
add: 'green',
|
||||
remove: 'red'
|
||||
};
|
||||
var color = actionColorMap[action] || 'gray';
|
||||
|
||||
if (this.shouldTouchRouter(entity.name, options)) {
|
||||
|
||||
this.ui.writeLine(`we don't currently update the router for you, please edit ${findRouter(options).join('/')}`);
|
||||
this._writeStatusToUI(chalk[color], action + ' route', entity.name);
|
||||
}
|
||||
}
|
||||
|
||||
function findRouter(options) {
|
||||
var routerPathParts = [options.project.root];
|
||||
|
||||
if (options.dummy && options.project.isEmberCLIAddon()) {
|
||||
routerPathParts = routerPathParts.concat(['tests', 'dummy', 'app', 'router.js']);
|
||||
} else {
|
||||
routerPathParts = routerPathParts.concat(['app', 'router.js']);
|
||||
}
|
||||
|
||||
return routerPathParts;
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
/*eslint node/no-extraneous-require: "off"*/
|
||||
'use strict';
|
||||
|
||||
const useTestFrameworkDetector = require('@ember-data/-build-infra/src/utilities/test-framework-detector');
|
||||
const path = require('path');
|
||||
|
||||
module.exports = useTestFrameworkDetector({
|
||||
description: 'Generates a Consul HTTP ember-data serializer unit and integration tests',
|
||||
|
||||
root: __dirname,
|
||||
|
||||
fileMapTokens(options) {
|
||||
return {
|
||||
__root__() {
|
||||
return 'tests';
|
||||
},
|
||||
__path__() {
|
||||
return '';
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
locals(options) {
|
||||
return {
|
||||
};
|
||||
},
|
||||
});
|
|
@ -0,0 +1,62 @@
|
|||
import { module, test } from 'qunit';
|
||||
import { setupTest } from 'ember-qunit';
|
||||
|
||||
import { get } from 'consul-ui/tests/helpers/api';
|
||||
import { HEADERS_SYMBOL as META } from 'consul-ui/utils/http/consul';
|
||||
|
||||
module('Integration | Serializer | <%= dasherizedModuleName %>', function(hooks) {
|
||||
setupTest(hooks);
|
||||
test('respondForQuery returns the correct data for list endpoint', function(assert) {
|
||||
const serializer = this.owner.lookup('serializer:<%= dasherizedModuleName %>');
|
||||
const dc = 'dc-1';
|
||||
const request = {
|
||||
url: `/v1/<%= dasherizedModuleName %>?dc=${dc}`,
|
||||
};
|
||||
return get(request.url).then(function(payload) {
|
||||
const expected = payload.map(item =>
|
||||
Object.assign({}, item, {
|
||||
Datacenter: dc,
|
||||
uid: `["${dc}","${item.Name}"]`,
|
||||
})
|
||||
);
|
||||
const actual = serializer.respondForQuery(
|
||||
function(cb) {
|
||||
const headers = {};
|
||||
const body = payload;
|
||||
return cb(headers, body);
|
||||
},
|
||||
{
|
||||
dc: dc,
|
||||
}
|
||||
);
|
||||
assert.deepEqual(actual, expected);
|
||||
});
|
||||
});
|
||||
test('respondForQueryRecord returns the correct data for item endpoint', function(assert) {
|
||||
const serializer = this.owner.lookup('serializer:<%= dasherizedModuleName %>');
|
||||
const dc = 'dc-1';
|
||||
const id = 'slug';
|
||||
const request = {
|
||||
url: `/v1/<%= dasherizedModuleName %>/${id}?dc=${dc}`,
|
||||
};
|
||||
return get(request.url).then(function(payload) {
|
||||
const expected = {
|
||||
Datacenter: dc,
|
||||
[META]: {},
|
||||
uid: `["${dc}","${id}"]`,
|
||||
};
|
||||
const actual = serializer.respondForQueryRecord(
|
||||
function(cb) {
|
||||
const headers = {};
|
||||
const body = payload;
|
||||
return cb(headers, body);
|
||||
},
|
||||
{
|
||||
dc: dc,
|
||||
id: id,
|
||||
}
|
||||
);
|
||||
assert.deepEqual(actual, expected);
|
||||
});
|
||||
});
|
||||
});
|
|
@ -0,0 +1,23 @@
|
|||
import { module, test } from 'qunit';
|
||||
import { setupTest } from 'ember-qunit';
|
||||
|
||||
module('Unit | Serializer | <%= dasherizedModuleName %>', 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('<%= dasherizedModuleName %>');
|
||||
|
||||
assert.ok(serializer);
|
||||
});
|
||||
|
||||
test('it serializes records', function(assert) {
|
||||
let store = this.owner.lookup('service:store');
|
||||
let record = store.createRecord('<%= dasherizedModuleName %>', {});
|
||||
|
||||
let serializedRecord = record.serialize();
|
||||
|
||||
assert.ok(serializedRecord);
|
||||
});
|
||||
});
|
|
@ -0,0 +1,24 @@
|
|||
import Serializer from './application';
|
||||
import { PRIMARY_KEY, SLUG_KEY } from 'consul-ui/models/<%= dasherizedModuleName %>';
|
||||
|
||||
export default Serializer.extend({
|
||||
primaryKey: PRIMARY_KEY,
|
||||
slugKey: SLUG_KEY,
|
||||
// respondForQueryRecord: function(respond, query) {
|
||||
// return this._super(
|
||||
// function(cb) {
|
||||
// return respond(
|
||||
// function(headers, body) {
|
||||
|
||||
// return cb(
|
||||
// headers,
|
||||
// body
|
||||
// );
|
||||
|
||||
// }
|
||||
// )
|
||||
// },
|
||||
// query
|
||||
// );
|
||||
// },
|
||||
});
|
|
@ -0,0 +1,37 @@
|
|||
/*eslint node/no-extraneous-require: "off"*/
|
||||
'use strict';
|
||||
|
||||
const path = require('path');
|
||||
const isModuleUnificationProject = require('@ember-data/-build-infra/src/utilities/module-unification').isModuleUnificationProject;
|
||||
module.exports = {
|
||||
description: 'Generates a Consul HTTP ember-data serializer',
|
||||
|
||||
availableOptions: [{ name: 'base-class', type: String }],
|
||||
|
||||
root: __dirname,
|
||||
|
||||
fileMapTokens(options) {
|
||||
if (isModuleUnificationProject(this.project)) {
|
||||
return {
|
||||
__root__() {
|
||||
return 'src';
|
||||
},
|
||||
__path__(options) {
|
||||
return path.join('data', 'models', options.dasherizedModuleName);
|
||||
},
|
||||
__name__() {
|
||||
return 'serializer';
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
locals(options) {
|
||||
// Return custom template variables here.
|
||||
return {
|
||||
};
|
||||
}
|
||||
|
||||
// afterInstall(options) {
|
||||
// // Perform extra work here.
|
||||
// }
|
||||
};
|
Loading…
Reference in New Issue