Skip to content

Commit 7035d8b

Browse files
authored
Merge pull request #563 from adopted-ember-addons/dev/bugfixes
Fix bugs and design issues found in audit
2 parents 6ec1fc8 + b548a3c commit 7035d8b

15 files changed

Lines changed: 189 additions & 68 deletions

addon/src/-private.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import FixtureBuilderFactory from './builder/fixture-builder-factory';
44
import MockStoreRequest from './mocks/mock-store-request';
5+
import RequestWrapper from './mocks/request-wrapper';
6+
import Sequence from './sequence';
57

68
import {
79
isEmptyObject,
@@ -13,6 +15,8 @@ import {
1315
export {
1416
FixtureBuilderFactory,
1517
MockStoreRequest,
18+
RequestWrapper,
19+
Sequence,
1620
isEmptyObject,
1721
param,
1822
isEquivalent,

addon/src/factory-guy.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,10 @@ class FactoryGuy {
450450
}
451451

452452
reset() {
453+
if (this._cacheOnlyOriginalAdapterFor && this.store) {
454+
this.store.adapterFor = this._cacheOnlyOriginalAdapterFor;
455+
this._cacheOnlyOriginalAdapterFor = null;
456+
}
453457
this.store = null;
454458
this.requestManager?.stop();
455459
this.requestManager = null;
@@ -499,6 +503,7 @@ class FactoryGuy {
499503
*/
500504
cacheOnlyMode({ except = [] } = {}) {
501505
let store = this.store;
506+
this._cacheOnlyOriginalAdapterFor = store.adapterFor;
502507
let findAdapter = store.adapterFor.bind(store);
503508

504509
store.adapterFor = function (name) {
@@ -592,7 +597,7 @@ class FactoryGuy {
592597

593598
assert(
594599
`[ember-data-factory-guy] Can't find that factory named [ ${name} ]`,
595-
!definition && assertItExists,
600+
!assertItExists,
596601
);
597602
}
598603

addon/src/mocks/exposed-request-functions.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ export function mock({ type = 'GET', url, responseText, status } = {}) {
2323
export function mockLinks(model, relationshipKey) {
2424
assert(
2525
'[ember-data-factory-guy] mockLinks requires at least model and relationshipKey',
26-
model,
27-
relationshipKey,
26+
model && relationshipKey,
2827
);
2928

3029
return new MockLinksRequest(model, relationshipKey);
@@ -108,10 +107,7 @@ export function mockReload(...args) {
108107
let record = args[0];
109108
modelName = record.constructor.modelName;
110109
id = record.id;
111-
} else if (
112-
typeof args[0] === 'string' &&
113-
typeof parseInt(args[1]) === 'number'
114-
) {
110+
} else if (typeof args[0] === 'string' && args[1] != null) {
115111
modelName = args[0];
116112
id = args[1];
117113
}

addon/src/mocks/mock-request.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { isEmptyObject, param } from '../utils/helper-functions';
33
import FactoryGuy from '../factory-guy';
44
import { isMatch, isEqual } from 'lodash';
55

6-
export default class {
6+
export default class MockRequest {
77
constructor() {
88
this.status = 200;
99
this.responseHeaders = new Headers();

addon/src/mocks/mock-store-request.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import FactoryGuy from '../factory-guy';
44
import MockRequest from './mock-request';
55
import { isEmptyObject, isEquivalent } from '../utils/helper-functions';
66

7-
export default class extends MockRequest {
7+
export default class MockStoreRequest extends MockRequest {
88
constructor(modelName, requestType) {
99
super();
1010
this.modelName = modelName;

addon/src/mocks/request-manager-msw.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,15 @@ export default class RequestManagerMSW extends RequestManager {
4444
wrapper = this.wrappers[key];
4545

4646
if (!wrapper) {
47-
wrapper = new RequestWrapper(); // this generates & returns the handler function
47+
wrapper = new RequestWrapper();
4848
const mswHandler = http[type.toLowerCase()](
4949
url,
5050
async ({ request, params }) => {
5151
await delay(this._settings.delay);
52-
return await wrapper({ request: request.clone(), params });
52+
return await wrapper.handleRequest({
53+
request: request.clone(),
54+
params,
55+
});
5356
},
5457
);
5558
this.worker.use(mswHandler);

addon/src/mocks/request-manager-pretender.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export default class RequestManagerPretender extends RequestManager {
3131
* For now, you can only set the response delay.
3232
*/
3333
settings(settings = {}) {
34-
super.setttings({
34+
super.settings({
3535
...settings,
3636
delay: settings.responseTime ?? settings.delay ?? 0,
3737
});
@@ -75,7 +75,7 @@ export default class RequestManagerPretender extends RequestManager {
7575
return cl;
7676
};
7777

78-
const response = await wrapper({
78+
const response = await wrapper.handleRequest({
7979
request: request.clone(),
8080
params: fakeRequest.params,
8181
});

addon/src/mocks/request-wrapper.js

Lines changed: 3 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,12 @@
11
/**
2-
* This request wrapper controls what will be returned by one url / http verb
3-
* Normally when you set up pretender, you give it one function to handle one url / verb.
4-
*
5-
* So, for example, you would:
6-
*
7-
* ```
8-
* pretender.get('/users', myfunction )
9-
* ```
10-
*
11-
* to mock a [GET /users] call
12-
*
13-
* This wrapper allows that GET /users call to be handled my many functions
14-
* instead of just one, since this request handler hold the ability to take
15-
* a list of hanlders.
16-
*
17-
* That way you can setup a few mocks like
18-
*
19-
* ```
20-
* mockFindAll('user')
21-
* mockQuery('user', {name: 'Dude'})
22-
* ```
23-
*
24-
* and both of these hanlders will reside in the list for the wrapper that
25-
* belongs to [GET /users]
2+
* This request wrapper controls what will be returned by one url / http verb.
3+
* Holds a list of handlers for a given url/verb pair so multiple mocks (e.g.
4+
* mockFindAll and mockQuery) can share the same route.
265
*/
276
export default class RequestWrapper {
287
constructor() {
298
this.index = 0;
309
this.handlers = [];
31-
return this.generateRequestHandler();
32-
}
33-
34-
/**
35-
* Generating a function that we can hand off to pretender that
36-
* will handle the request.
37-
*
38-
* Before passing back that function, add some other functions
39-
* to control the handlers array
40-
*
41-
* @returns {function(this:T)}
42-
*/
43-
generateRequestHandler() {
44-
const requestHandler = this.handleRequest.bind(this);
45-
requestHandler.getHandlers = this.getHandlers.bind(this);
46-
requestHandler.addHandler = this.addHandler.bind(this);
47-
requestHandler.removeHandler = this.removeHandler.bind(this);
48-
return requestHandler;
4910
}
5011

5112
/**

addon/src/scenario.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import {
1818
mock,
1919
} from './mocks/exposed-request-functions';
2020

21-
export default class {
21+
export default class Scenario {
2222
constructor() {
2323
this.make = make;
2424
this.makeNew = makeNew;

addon/src/sequence.js

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1-
export default function (fn) {
2-
let index = 1;
3-
this.next = function () {
4-
return fn.call(this, index++);
5-
};
6-
this.reset = function () {
7-
index = 1;
8-
};
1+
export default class Sequence {
2+
constructor(fn) {
3+
this._fn = fn;
4+
this._index = 1;
5+
}
6+
7+
next() {
8+
const fn = this._fn;
9+
return fn(this._index++);
10+
}
11+
12+
reset() {
13+
this._index = 1;
14+
}
915
}

0 commit comments

Comments
 (0)