Skip to content

Commit

Permalink
feat: CMS-2557 invites resource
Browse files Browse the repository at this point in the history
  • Loading branch information
simon-scherzinger committed Feb 10, 2017
1 parent bb4de8b commit 3bf79b6
Show file tree
Hide file tree
Showing 8 changed files with 184 additions and 4 deletions.
36 changes: 36 additions & 0 deletions src/Accounts.js
Expand Up @@ -10,6 +10,7 @@ import {
} from './helper';
import AccountList from './resources/AccountList';
import AccountResource from './resources/AccountResource';
import InvitesResource from './resources/InvitesResource';
import TokenStoreFactory from './TokenStore';

const urls = {
Expand Down Expand Up @@ -285,4 +286,39 @@ export default class Accounts extends Core {
return postEmpty(this.environment, request, { email });
});
}

/**
* Create new invites. Specify number of invites to create with count.
*
* @param {number} count the number of invites to create
* @returns {Promise<InvitesResource>} Promise resolving to the invites resource
*/
createInvites(count) {
return Promise.resolve()
.then(() => {
if (count && typeof count !== 'number') {
throw new Error('count must be a number');
}

const request = this.newRequest().follow('ec:invites');

return post(this.environment, request, { count: count || 1 })
.then(([invites, traversal]) => new InvitesResource(invites, this.environment, traversal));
});
}

/**
* Load the {@link InvitesResource}.
*
* @returns {Promise.<InvitesResource>} Promise resolving to the invites resource
*/
invites() {
return Promise.resolve()
.then(() => {
const request = this.newRequest().follow('ec:invites');

return get(this.environment, request)
.then(([invites, traversal]) => new InvitesResource(invites, this.environment, traversal));
});
}
}
15 changes: 15 additions & 0 deletions src/resources/InvitesResource.js
@@ -0,0 +1,15 @@
import Resource from './Resource';

/**
* Invites Resource. Will contain an {@link Array} containing all unused invites.
*/
export default class InvitesResource extends Resource {
/**
* Get the invites {@link Array}
*
* @returns {Array<string>} Array containing unused invites
*/
getInvites() {
return this.getProperty('invites');
}
}
49 changes: 49 additions & 0 deletions test/Account.test.js
Expand Up @@ -11,6 +11,7 @@ const Accounts = require('../lib/Accounts').default;
const ListResource = require('../lib/resources/ListResource').default;
const AccountList = require('../lib/resources/AccountList').default;
const AccountResource = require('../lib/resources/AccountResource').default;
const InvitesResource = require('../lib/resources/InvitesResource').default;
const Resource = require('../lib/resources/Resource').default;

chai.should();
Expand Down Expand Up @@ -227,6 +228,54 @@ describe('Accounts class', () => {
};
return reject().should.be.rejectedWith(Error);
});
it('should create invites', () => {
const accounts = new Accounts();
const stub = sinon.stub(helper, 'post');
stub.returns(resolver('invites.json'), accounts.traversal);

return accounts.createInvites(5)
.then((invites) => {
invites.should.be.instanceOf(InvitesResource);
stub.restore();
})
.catch((err) => {
stub.restore();
throw err;
});
});
it('should create invite', () => {
const accounts = new Accounts();
const stub = sinon.stub(helper, 'post');
stub.returns(resolver('invites.json'), accounts.traversal);

return accounts.createInvites()
.then((invites) => {
invites.should.be.instanceOf(InvitesResource);
stub.restore();
})
.catch((err) => {
stub.restore();
throw err;
});
});
it('should be rejected in count not a number', () => {
return new Accounts().createInvites('notANumber').should.be.rejectedWith(Error);
});
it('should load invites', () => {
const accounts = new Accounts();
const stub = sinon.stub(helper, 'get');
stub.returns(resolver('invites.json'), accounts.traversal);

return accounts.invites()
.then((invites) => {
invites.should.be.instanceOf(InvitesResource);
stub.restore();
})
.catch((err) => {
stub.restore();
throw err;
});
});
});

describe('Account ListResource', () => {
Expand Down
45 changes: 45 additions & 0 deletions test/InviteResource.test.js
@@ -0,0 +1,45 @@
/* eslint no-unused-expressions: "off" */

const chai = require('chai');
const fs = require('fs');

const Resource = require('../lib/resources/Resource').default;
const InvitesResource = require('../lib/resources/InvitesResource').default;

const should = chai.should();

describe('InvitesResource', () => {
let resourceJson;
let resource;
before((done) => {
fs.readFile(`${__dirname}/mocks/invites.json`, 'utf-8', (err, res) => {
if (err) {
return done(err);
}
resourceJson = JSON.parse(res);
return done();
});
});
beforeEach(() => {
resource = new InvitesResource(resourceJson);
});
afterEach(() => {
resource = null;
});
it('should be instance of Resource', () => {
resource.should.be.instanceOf(Resource);
});
it('should be instance of InvitesResource', () => {
resource.should.be.instanceOf(InvitesResource);
});
it('should instantiate with traversal and environment', () => {
const res = new Resource(resourceJson, 'stage', {});
res.environment.should.be.equal('stage');
should.exist(res.traversal);
});
it('should get invites', () => {
const invites = resource.getInvites();
invites.should.be.instanceOf(Array);
invites.forEach(invite => (typeof invite).should.be.equal('string'));
});
});
7 changes: 3 additions & 4 deletions test/Resource.test.js
Expand Up @@ -14,7 +14,6 @@ const Resource = require('../lib/resources/Resource').default;

const should = chai.should();

chai.should();
chai.use(sinonChai);
chai.use(chaiAsPromised);

Expand All @@ -40,9 +39,9 @@ describe('Resource', () => {
resource.should.be.instanceOf(Resource);
});
it('should instantiate with traversal and environment', () => {
const resource = new Resource(resourceJson, 'stage', {});
resource.environment.should.be.equal('stage');
should.exist(resource.traversal);
const res = new Resource(resourceJson, 'stage', {});
res.environment.should.be.equal('stage');
should.exist(res.traversal);
});
it('should have environment live', () => {
resource.environment.should.be.equal('live');
Expand Down
26 changes: 26 additions & 0 deletions test/mocks/invites.json
@@ -0,0 +1,26 @@
{
"invites": [
"375476f6-4732-4dfe-bd4c-0fe0dc57e19b",
"26e1e48f-a11d-427f-8392-4aee6371e95e",
"dcc4bafd-5fc4-47d1-b90b-2efe67be49f9",
"6614ab11-14e1-40d8-8ed0-50693ef2113e",
"7d04e725-e113-4e0d-8e33-2192a0f832f0",
"4e8076c0-2e5a-423e-9a86-c4abdc283c21",
"c3ec6ea9-8c84-43d7-9fa0-e0a1ee5d6214",
"70b85711-d6ee-46b8-9a5b-8af2c7502df2",
"ef5fa711-884a-40d2-9754-311b8b4bb309",
"fbbdc462-7774-40f5-9d57-4148a395d472"
],
"_links": {
"self": {
"href": "https://accounts.entrecode.de/invite"
},
"curies": {
"href": "https://entrecode.de/doc/rel/{rel}",
"templated": true
},
"collection": {
"href": "https://accounts.entrecode.de/"
}
}
}
5 changes: 5 additions & 0 deletions typings/Accounts.d.ts
Expand Up @@ -2,6 +2,7 @@ import { Core } from './Core';
import { AccountList } from './resources/AccountList';
import { AccountResource } from './resources/AccountResource';
import { filterOptions } from './interfaces';
import { InvitesResource } from './resources/InvitesResource';

export declare class Accounts extends Core {
constructor(environment?: environment);
Expand All @@ -25,6 +26,10 @@ export declare class Accounts extends Core {
resetPassword(email: string): Promise<undefined>;

changeEmail(email: string): Promise<undefined>;

createInvites(count: number): Promise<InvitesResource>;

invites(): Promise<InvitesResource>
}

interface tokenResponse {
Expand Down
5 changes: 5 additions & 0 deletions typings/resources/InvitesResource.d.ts
@@ -0,0 +1,5 @@
export declare class InvitesResource {
constructor(resource: any, environment: string, traversal?: any);

getInvites(): Array<string>;
}

0 comments on commit 3bf79b6

Please sign in to comment.