Skip to content

Commit

Permalink
Implement experimental adapterAction() function (#37)
Browse files Browse the repository at this point in the history
  • Loading branch information
Turbo87 authored Nov 11, 2022
1 parent 5e8e2ac commit b1a5de9
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 0 deletions.
21 changes: 21 additions & 0 deletions addon/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,24 @@ export async function apiAction(

return await adapter.ajax(url, method, { data });
}

/** @experimental */
export async function adapterAction(
adapter,
modelName,
{ requestType = 'createRecord', method, path, data }
) {
assert(`Missing \`method\` option`, method);
assert(
[
`Invalid \`method\` option: ${method}`,
`Valid options: ${VALID_METHODS.join(', ')}`,
].join('\n'),
VALID_METHODS.includes(method)
);

let baseUrl = adapter.buildURL(modelName, null, null, requestType);
let url = path ? `${baseUrl}/${path}` : baseUrl;

return await adapter.ajax(url, method, { data });
}
51 changes: 51 additions & 0 deletions tests/unit/adapter-actions-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
import { adapterAction } from '@mainmatter/ember-api-actions';
import { ServerError } from '@ember-data/adapter/error';

module('adapterAction()', function (hooks) {
setupTest(hooks);

async function prepare(context) {
let { worker, rest } = window.msw;

worker.use(
rest.post('/users/validate-email', (req, res, ctx) => {
return res(ctx.json({ email: 'valid' }));
})
);

let store = context.owner.lookup('service:store');
let adapter = store.adapterFor('user');

return { worker, rest, adapter };
}

test('it works', async function (assert) {
let { adapter } = await prepare(this);

let response = await adapterAction(adapter, 'user', {
method: 'POST',
path: 'validate-email',
});
assert.deepEqual(response, { email: 'valid' });
});

test('it fails as expected', async function (assert) {
let { worker, rest, adapter } = await prepare(this);

worker.use(
rest.post('/users/validate-email', (req, res, ctx) => {
return res(ctx.status(500));
})
);

await assert.rejects(
adapterAction(adapter, 'user', {
method: 'POST',
path: 'validate-email',
}),
ServerError
);
});
});

0 comments on commit b1a5de9

Please sign in to comment.