Skip to content

Commit b3e27ff

Browse files
committed
mirage: Replace GET /me/crate_owner_invitations route handlers with generic implementation
1 parent 6241941 commit b3e27ff

File tree

7 files changed

+106
-71
lines changed

7 files changed

+106
-71
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { Factory } from 'ember-cli-mirage';
2+
3+
export default Factory.extend({
4+
createdAt: '2016-12-24T12:34:56Z',
5+
6+
afterCreate(invite) {
7+
if (!invite.crateId) {
8+
throw new Error(`Missing \`crate\` relationship on \`crate-owner-invitation:${invite.id}\``);
9+
}
10+
if (!invite.inviteeId) {
11+
throw new Error(`Missing \`invitee\` relationship on \`crate-owner-invitation:${invite.id}\``);
12+
}
13+
if (!invite.inviterId) {
14+
throw new Error(`Missing \`inviter\` relationship on \`crate-owner-invitation:${invite.id}\``);
15+
}
16+
},
17+
});
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { belongsTo, Model } from 'ember-cli-mirage';
2+
3+
export default Model.extend({
4+
crate: belongsTo(),
5+
invitee: belongsTo('user'),
6+
inviter: belongsTo('user'),
7+
});

mirage/models/crate-owner-invite.js

Lines changed: 0 additions & 3 deletions
This file was deleted.

mirage/route-handlers/me.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,6 @@ export function register(server) {
105105
return new Response(403, {}, { errors: [{ detail: 'must be logged in to perform that action' }] });
106106
}
107107

108-
return { crate_owner_invitations: [] };
108+
return schema.crateOwnerInvitations.where({ inviteeId: user.id });
109109
});
110110
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import BaseSerializer from './application';
2+
3+
export default BaseSerializer.extend({
4+
// eslint-disable-next-line ember/avoid-leaking-state-in-ember-objects
5+
include: ['inviter'],
6+
7+
getHashForResource() {
8+
let [hash, addToIncludes] = BaseSerializer.prototype.getHashForResource.apply(this, arguments);
9+
10+
if (Array.isArray(hash)) {
11+
for (let resource of hash) {
12+
this._adjust(resource);
13+
}
14+
} else {
15+
this._adjust(hash);
16+
}
17+
18+
return [hash, addToIncludes];
19+
},
20+
21+
_adjust(hash) {
22+
delete hash.id;
23+
24+
let crate = this.schema.crates.find(hash.crate_id);
25+
hash.crate_name = crate.name;
26+
27+
hash.invitee_id = Number(hash.invitee_id);
28+
hash.inviter_id = Number(hash.inviter_id);
29+
30+
let inviter = this.schema.users.find(hash.inviter_id);
31+
hash.invited_by_username = inviter.login;
32+
},
33+
});

tests/acceptance/invites-test.js

Lines changed: 35 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -12,36 +12,32 @@ module('Acceptance | /me/pending-invites', function (hooks) {
1212
setupApplicationTest(hooks);
1313

1414
function prepare(context) {
15-
let user = context.server.create('user');
16-
context.authenticateAs(user);
17-
1815
let inviter = context.server.create('user', { name: 'janed' });
1916
let inviter2 = context.server.create('user', { name: 'wycats' });
20-
context.server.get('/api/v1/me/crate_owner_invitations', function () {
21-
let users = [this.serialize(inviter, 'user').user, this.serialize(inviter2, 'user').user];
22-
23-
return {
24-
crate_owner_invitations: [
25-
{
26-
invited_by_username: 'janed',
27-
crate_name: 'nanomsg',
28-
crate_id: 42,
29-
created_at: '2016-12-24T12:34:56Z',
30-
invitee_id: parseInt(user.id, 10),
31-
inviter_id: parseInt(inviter.id, 10),
32-
},
33-
{
34-
invited_by_username: 'wycats',
35-
crate_name: 'ember-rs',
36-
crate_id: 1,
37-
created_at: '2020-12-31T12:34:56Z',
38-
invitee_id: parseInt(user.id, 10),
39-
inviter_id: parseInt(inviter2.id, 10),
40-
},
41-
],
42-
users,
43-
};
17+
18+
let user = context.server.create('user');
19+
20+
let nanomsg = context.server.create('crate', { name: 'nanomsg' });
21+
context.server.create('version', { crate: nanomsg });
22+
context.server.create('crate-owner-invitation', {
23+
crate: nanomsg,
24+
createdAt: '2016-12-24T12:34:56Z',
25+
invitee: user,
26+
inviter,
4427
});
28+
29+
let ember = context.server.create('crate', { name: 'ember-rs' });
30+
context.server.create('version', { crate: ember });
31+
context.server.create('crate-owner-invitation', {
32+
crate: ember,
33+
createdAt: '2020-12-31T12:34:56Z',
34+
invitee: user,
35+
inviter: inviter2,
36+
});
37+
38+
context.authenticateAs(user);
39+
40+
return { nanomsg };
4541
}
4642

4743
test('redirects to / when not logged in', async function (assert) {
@@ -76,7 +72,7 @@ module('Acceptance | /me/pending-invites', function (hooks) {
7672
test('shows empty list message', async function (assert) {
7773
prepare(this);
7874

79-
this.server.get('/api/v1/me/crate_owner_invitations', { crate_owner_invitations: [] });
75+
this.server.schema.crateOwnerInvitations.all().destroy();
8076

8177
await visit('/me/pending-invites');
8278
assert.equal(currentURL(), '/me/pending-invites');
@@ -87,14 +83,14 @@ module('Acceptance | /me/pending-invites', function (hooks) {
8783
test('invites can be declined', async function (assert) {
8884
assert.expect(9);
8985

90-
prepare(this);
86+
let { nanomsg } = prepare(this);
9187

92-
this.server.put('/api/v1/me/crate_owner_invitations/:crate', (schema, request) => {
93-
assert.deepEqual(request.params, { crate: '42' });
88+
this.server.put('/api/v1/me/crate_owner_invitations/:crate_id', (schema, request) => {
89+
assert.deepEqual(request.params, { crate_id: nanomsg.id });
9490

9591
let body = JSON.parse(request.requestBody);
9692
assert.strictEqual(body.crate_owner_invite.accepted, false);
97-
assert.strictEqual(body.crate_owner_invite.crate_id, 42);
93+
assert.strictEqual(body.crate_owner_invite.crate_id, nanomsg.id);
9894

9995
return { crate_owner_invitation: { crate_id: 42, accepted: false } };
10096
});
@@ -115,7 +111,7 @@ module('Acceptance | /me/pending-invites', function (hooks) {
115111
test('error message is shown if decline request fails', async function (assert) {
116112
prepare(this);
117113

118-
this.server.put('/api/v1/me/crate_owner_invitations/:crate', () => new Response(500));
114+
this.server.put('/api/v1/me/crate_owner_invitations/:crate_id', () => new Response(500));
119115

120116
await visit('/me/pending-invites');
121117
assert.equal(currentURL(), '/me/pending-invites');
@@ -129,14 +125,14 @@ module('Acceptance | /me/pending-invites', function (hooks) {
129125
test('invites can be accepted', async function (assert) {
130126
assert.expect(9);
131127

132-
prepare(this);
128+
let { nanomsg } = prepare(this);
133129

134-
this.server.put('/api/v1/me/crate_owner_invitations/:crate', (schema, request) => {
135-
assert.deepEqual(request.params, { crate: '42' });
130+
this.server.put('/api/v1/me/crate_owner_invitations/:crate_id', (schema, request) => {
131+
assert.deepEqual(request.params, { crate_id: nanomsg.id });
136132

137133
let body = JSON.parse(request.requestBody);
138134
assert.strictEqual(body.crate_owner_invite.accepted, true);
139-
assert.strictEqual(body.crate_owner_invite.crate_id, 42);
135+
assert.strictEqual(body.crate_owner_invite.crate_id, nanomsg.id);
140136

141137
return { crate_owner_invitation: { crate_id: 42, accepted: true } };
142138
});
@@ -159,7 +155,7 @@ module('Acceptance | /me/pending-invites', function (hooks) {
159155
test('error message is shown if accept request fails', async function (assert) {
160156
prepare(this);
161157

162-
this.server.put('/api/v1/me/crate_owner_invitations/:crate', () => new Response(500));
158+
this.server.put('/api/v1/me/crate_owner_invitations/:crate_id', () => new Response(500));
163159

164160
await visit('/me/pending-invites');
165161
assert.equal(currentURL(), '/me/pending-invites');
@@ -176,7 +172,7 @@ module('Acceptance | /me/pending-invites', function (hooks) {
176172
let errorMessage =
177173
'The invitation to become an owner of the demo_crate crate expired. Please reach out to an owner of the crate to request a new invitation.';
178174
let payload = { errors: [{ detail: errorMessage }] };
179-
this.server.put('/api/v1/me/crate_owner_invitations/:crate', payload, 410);
175+
this.server.put('/api/v1/me/crate_owner_invitations/:crate_id', payload, 410);
180176

181177
await visit('/me/pending-invites');
182178
assert.equal(currentURL(), '/me/pending-invites');

tests/mirage/invitations-test.js

Lines changed: 13 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { module, test } from 'qunit';
22

33
import fetch from 'fetch';
4-
import timekeeper from 'timekeeper';
54

65
import { setupTest } from 'cargo/tests/helpers';
76

@@ -23,9 +22,7 @@ module('Mirage | Crate Owner Invitations', function (hooks) {
2322
assert.deepEqual(responsePayload, { crate_owner_invitations: [] });
2423
});
2524

26-
test('returns a paginated crates list', async function (assert) {
27-
timekeeper.freeze(new Date('2016-12-24T12:34:56Z'));
28-
25+
test('returns the list of invitations for the authenticated user', async function (assert) {
2926
let nanomsg = this.server.create('crate', { name: 'nanomsg' });
3027
this.server.create('version', { crate: nanomsg });
3128

@@ -36,31 +33,19 @@ module('Mirage | Crate Owner Invitations', function (hooks) {
3633
this.server.create('mirage-session', { user });
3734

3835
let inviter = this.server.create('user', { name: 'janed' });
36+
this.server.create('crate-owner-invitation', {
37+
crate: nanomsg,
38+
createdAt: '2016-12-24T12:34:56Z',
39+
invitee: user,
40+
inviter,
41+
});
42+
3943
let inviter2 = this.server.create('user', { name: 'wycats' });
40-
this.server.get('/api/v1/me/crate_owner_invitations', function () {
41-
let users = [this.serialize(inviter, 'user').user, this.serialize(inviter2, 'user').user];
42-
43-
return {
44-
crate_owner_invitations: [
45-
{
46-
invited_by_username: 'janed',
47-
crate_name: nanomsg.name,
48-
crate_id: nanomsg.id,
49-
created_at: '2016-12-24T12:34:56Z',
50-
invitee_id: parseInt(user.id, 10),
51-
inviter_id: parseInt(inviter.id, 10),
52-
},
53-
{
54-
invited_by_username: 'wycats',
55-
crate_name: ember.name,
56-
crate_id: ember.id,
57-
created_at: '2020-12-31T12:34:56Z',
58-
invitee_id: parseInt(user.id, 10),
59-
inviter_id: parseInt(inviter2.id, 10),
60-
},
61-
],
62-
users,
63-
};
44+
this.server.create('crate-owner-invitation', {
45+
crate: ember,
46+
createdAt: '2020-12-31T12:34:56Z',
47+
invitee: user,
48+
inviter: inviter2,
6449
});
6550

6651
let response = await fetch('/api/v1/me/crate_owner_invitations');

0 commit comments

Comments
 (0)