Skip to content

Commit

Permalink
feat: add decorator for memberAction
Browse files Browse the repository at this point in the history
  • Loading branch information
alexlafroscia committed Apr 5, 2020
1 parent 678186e commit a1ed674
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 0 deletions.
10 changes: 10 additions & 0 deletions addon/decorators.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import instanceOp, { InstanceOperationOptions } from './utils/member-action';

export function memberAction<IN = any, OUT = any>(options: InstanceOperationOptions<IN, OUT>) {
return function createMemberActionDescriptor() {
return {
value: instanceOp(options)
};
}
}

52 changes: 52 additions & 0 deletions tests/unit/utils/decorators/member-action-test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { memberAction } from 'ember-api-actions/decorators';
import DS from 'ember-data';
import { setupTest } from 'ember-qunit';
import Pretender from 'pretender';
import { module, test } from 'qunit';

class Fruit extends DS.Model {
@memberAction({ path: 'doRipen' })
public ripen;
}

module('Unit | Utility | decorators/member-action', (hooks) => {
setupTest(hooks);

let server: any;
hooks.beforeEach(() => {
server = new Pretender();
});
hooks.afterEach(() => {
server.shutdown();
});

hooks.beforeEach(function() {
this.owner.unregister('model:fruit');
this.owner.register('model:fruit', Fruit);

this.store = this.owner.lookup('service:store');

this.fruit = this.store.createRecord('fruit', {
id: 1,
name: 'apple'
});
});

test('it adds a method through a decorator', async function(assert) {
assert.expect(4);

server.put('/fruits/:id/doRipen', (request: { url: string; requestBody: string }) => {
const data = JSON.parse(request.requestBody);
assert.deepEqual(data, { id: '1', name: 'apple' }, 'member action - request payload is correct');
assert.equal(request.url, '/fruits/1/doRipen', 'request was made to "doRipen"');
return [200, {}, '{"status": "ok"}'];
});

assert.equal(typeof this.fruit.ripen, 'function', 'Assigns a method on the type');

const { id, name } = this.fruit;
const result = await this.fruit.ripen({ id, name });

assert.deepEqual(result, { status: 'ok' }, 'Passes through the API response');
});
});

0 comments on commit a1ed674

Please sign in to comment.