feat(api): get challenges directly from /curriculum
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
/* global describe xdescribe it expect */
|
||||
import { isEqual, first, find } from 'lodash';
|
||||
import { first, find } from 'lodash';
|
||||
import sinon from 'sinon';
|
||||
import { mockReq, mockRes } from 'sinon-express-mock';
|
||||
|
||||
@ -16,12 +16,10 @@ import {
|
||||
import {
|
||||
firstChallengeUrl,
|
||||
requestedChallengeUrl,
|
||||
mockAllChallenges,
|
||||
mockChallenge,
|
||||
mockFirstChallenge,
|
||||
mockUser,
|
||||
mockApp,
|
||||
mockGetFirstChallenge,
|
||||
firstChallengeQuery,
|
||||
mockCompletedChallenge,
|
||||
mockCompletedChallenges,
|
||||
mockPathMigrationMap
|
||||
@ -175,20 +173,26 @@ describe('boot/challenge', () => {
|
||||
|
||||
describe('challengeUrlResolver', () => {
|
||||
it('resolves to the first challenge url by default', async () => {
|
||||
const challengeUrlResolver = await createChallengeUrlResolver(mockApp, {
|
||||
_getFirstChallenge: mockGetFirstChallenge
|
||||
});
|
||||
const challengeUrlResolver = await createChallengeUrlResolver(
|
||||
mockAllChallenges,
|
||||
{
|
||||
_getFirstChallenge: mockGetFirstChallenge
|
||||
}
|
||||
);
|
||||
|
||||
return challengeUrlResolver().then(url => {
|
||||
expect(url).toEqual(firstChallengeUrl);
|
||||
});
|
||||
});
|
||||
}, 10000);
|
||||
|
||||
// eslint-disable-next-line max-len
|
||||
it('returns the first challenge url if the provided id does not relate to a challenge', async () => {
|
||||
const challengeUrlResolver = await createChallengeUrlResolver(mockApp, {
|
||||
_getFirstChallenge: mockGetFirstChallenge
|
||||
});
|
||||
const challengeUrlResolver = await createChallengeUrlResolver(
|
||||
mockAllChallenges,
|
||||
{
|
||||
_getFirstChallenge: mockGetFirstChallenge
|
||||
}
|
||||
);
|
||||
|
||||
return challengeUrlResolver('not-a-real-challenge').then(url => {
|
||||
expect(url).toEqual(firstChallengeUrl);
|
||||
@ -196,9 +200,12 @@ describe('boot/challenge', () => {
|
||||
});
|
||||
|
||||
it('resolves the correct url for the requested challenge', async () => {
|
||||
const challengeUrlResolver = await createChallengeUrlResolver(mockApp, {
|
||||
_getFirstChallenge: mockGetFirstChallenge
|
||||
});
|
||||
const challengeUrlResolver = await createChallengeUrlResolver(
|
||||
mockAllChallenges,
|
||||
{
|
||||
_getFirstChallenge: mockGetFirstChallenge
|
||||
}
|
||||
);
|
||||
|
||||
return challengeUrlResolver('123abc').then(url => {
|
||||
expect(url).toEqual(requestedChallengeUrl);
|
||||
@ -207,28 +214,14 @@ describe('boot/challenge', () => {
|
||||
});
|
||||
|
||||
describe('getFirstChallenge', () => {
|
||||
const createMockChallengeModel = success =>
|
||||
success
|
||||
? {
|
||||
findOne(query, cb) {
|
||||
return isEqual(query, firstChallengeQuery)
|
||||
? cb(null, mockFirstChallenge)
|
||||
: cb(new Error('no challenge found'));
|
||||
}
|
||||
}
|
||||
: {
|
||||
findOne(_, cb) {
|
||||
return cb(new Error('no challenge found'));
|
||||
}
|
||||
};
|
||||
it('returns the correct challenge url from the model', async () => {
|
||||
const result = await getFirstChallenge(createMockChallengeModel(true));
|
||||
const result = await getFirstChallenge(mockAllChallenges);
|
||||
|
||||
expect(result).toEqual(firstChallengeUrl);
|
||||
});
|
||||
|
||||
it('returns the learn base if no challenges found', async () => {
|
||||
const result = await getFirstChallenge(createMockChallengeModel(false));
|
||||
const result = await getFirstChallenge([]);
|
||||
|
||||
expect(result).toEqual('/learn');
|
||||
});
|
||||
@ -356,9 +349,12 @@ describe('boot/challenge', () => {
|
||||
|
||||
// eslint-disable-next-line max-len
|
||||
it('redirects to the url provided by the challengeUrlResolver', async done => {
|
||||
const challengeUrlResolver = await createChallengeUrlResolver(mockApp, {
|
||||
_getFirstChallenge: mockGetFirstChallenge
|
||||
});
|
||||
const challengeUrlResolver = await createChallengeUrlResolver(
|
||||
mockAllChallenges,
|
||||
{
|
||||
_getFirstChallenge: mockGetFirstChallenge
|
||||
}
|
||||
);
|
||||
const expectedUrl = `${mockHomeLocation}${requestedChallengeUrl}`;
|
||||
const redirectToCurrentChallenge = createRedirectToCurrentChallenge(
|
||||
challengeUrlResolver,
|
||||
@ -377,9 +373,12 @@ describe('boot/challenge', () => {
|
||||
|
||||
// eslint-disable-next-line max-len
|
||||
it('redirects to the first challenge for users without a currentChallengeId', async done => {
|
||||
const challengeUrlResolver = await createChallengeUrlResolver(mockApp, {
|
||||
_getFirstChallenge: mockGetFirstChallenge
|
||||
});
|
||||
const challengeUrlResolver = await createChallengeUrlResolver(
|
||||
mockAllChallenges,
|
||||
{
|
||||
_getFirstChallenge: mockGetFirstChallenge
|
||||
}
|
||||
);
|
||||
const redirectToCurrentChallenge = createRedirectToCurrentChallenge(
|
||||
challengeUrlResolver,
|
||||
{ _homeLocation: mockHomeLocation, _learnUrl: mockLearnUrl }
|
||||
|
@ -16,7 +16,10 @@ export const mockFirstChallenge = {
|
||||
id: '456def',
|
||||
block: 'first',
|
||||
superBlock: 'the',
|
||||
dashedName: 'challenge'
|
||||
dashedName: 'challenge',
|
||||
challengeOrder: 0,
|
||||
superOrder: 1,
|
||||
order: 0
|
||||
};
|
||||
|
||||
export const mockCompletedChallenge = {
|
||||
@ -117,16 +120,6 @@ export function createNewUserFromEmail(email) {
|
||||
|
||||
export const mockApp = {
|
||||
models: {
|
||||
Challenge: {
|
||||
find() {
|
||||
return firstChallengeUrl;
|
||||
},
|
||||
findById(id, cb) {
|
||||
return id === mockChallenge.id
|
||||
? cb(null, mockChallenge)
|
||||
: cb(new Error('challenge not found'));
|
||||
}
|
||||
},
|
||||
Donation: {
|
||||
findOne(query, cb) {
|
||||
return isEqual(query, matchSubscriptionIdQuery)
|
||||
@ -157,6 +150,8 @@ export const mockApp = {
|
||||
}
|
||||
};
|
||||
|
||||
export const mockAllChallenges = [mockFirstChallenge, mockChallenge];
|
||||
|
||||
export const mockGetFirstChallenge = () => firstChallengeUrl;
|
||||
|
||||
export const matchEmailQuery = {
|
||||
|
Reference in New Issue
Block a user