Skip to content

Commit d26033f

Browse files
authored
chore: export adapter types, fix adapter test arrangements (#332)
* Export adapter types * Cleanup * Snapshot * export * Revert
1 parent aea8e34 commit d26033f

File tree

3 files changed

+64
-49
lines changed

3 files changed

+64
-49
lines changed

addon/adapters/cloud-firestore-modular.ts

+14-12
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import type { Snapshot as _Snapshot } from '@ember-data/legacy-compat/legacy-net
77
import type { SnapshotRecordArray as _SnapshotRecordArray } from '@ember-data/legacy-compat/-private';
88
import type { Collection } from '@ember-data/store/-private/record-arrays/identifier-array';
99
import type {
10-
LegacyBelongsToField,
11-
LegacyHasManyField,
10+
LegacyBelongsToField as _LegacyBelongsToField,
11+
LegacyHasManyField as _LegacyHasManyField,
1212
} from '@warp-drive/core-types/schema/fields';
1313
import type Model from 'ember-data/model';
1414
import RSVP from 'rsvp';
@@ -48,19 +48,21 @@ export interface AdapterOption {
4848
[key: string]: unknown;
4949
}
5050

51-
interface Snapshot extends _Snapshot {
51+
export interface Snapshot extends _Snapshot {
5252
adapterOptions: AdapterOption;
5353
}
5454

55-
interface SnapshotRecordArray extends _SnapshotRecordArray {
55+
export interface SnapshotRecordArray extends _SnapshotRecordArray {
5656
adapterOptions: AdapterOption;
5757
}
5858

59-
type BelongsToRelationshipMeta = LegacyBelongsToField & {
60-
options: { isRealtime?: boolean };
59+
export type LegacyBelongsToField = _LegacyBelongsToField & {
60+
options: {
61+
isRealtime?: boolean;
62+
};
6163
};
6264

63-
type HasManyRelationshipMeta = LegacyHasManyField & {
65+
export type LegacyHasManyField = _LegacyHasManyField & {
6466
key: string;
6567
options: {
6668
isRealtime?: boolean;
@@ -82,9 +84,9 @@ export default class CloudFirestoreAdapter extends Adapter {
8284
return !!fastboot && fastboot.isFastBoot;
8385
}
8486

85-
public generateIdForRecord(_store: Store, type: unknown): string {
87+
public generateIdForRecord(_store: Store, type: string): string {
8688
const db = getFirestore();
87-
const collectionName = buildCollectionName(type as string); // TODO: EmberData types incorrect
89+
const collectionName = buildCollectionName(type);
8890

8991
return doc(collection(db, collectionName)).id;
9092
}
@@ -268,7 +270,7 @@ export default class CloudFirestoreAdapter extends Adapter {
268270
_store: Store,
269271
_snapshot: Snapshot,
270272
url: string,
271-
relationship: BelongsToRelationshipMeta,
273+
relationship: LegacyBelongsToField,
272274
): Promise<AdapterPayload> {
273275
return new RSVP.Promise(async (resolve, reject) => {
274276
try {
@@ -307,7 +309,7 @@ export default class CloudFirestoreAdapter extends Adapter {
307309
store: Store,
308310
snapshot: Snapshot,
309311
url: string,
310-
relationship: HasManyRelationshipMeta,
312+
relationship: LegacyHasManyField,
311313
): Promise<AdapterPayload> {
312314
return new RSVP.Promise(async (resolve, reject) => {
313315
try {
@@ -391,7 +393,7 @@ export default class CloudFirestoreAdapter extends Adapter {
391393
store: Store,
392394
snapshot: Snapshot,
393395
url: string,
394-
relationship: HasManyRelationshipMeta,
396+
relationship: LegacyHasManyField,
395397
): CollectionReference | Query {
396398
const db = getFirestore();
397399

tests/dummy/app/models/user.ts

+3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ export default class UserModel extends Model {
1616
@attr('number')
1717
public declare age: number;
1818

19+
@attr('string')
20+
public declare username: string;
21+
1922
@hasMany('group', { async: true, inverse: 'members' })
2023
public declare groups: AsyncHasMany<GroupModel>;
2124

tests/unit/adapters/cloud-firestore-modular-test.ts

+47-37
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ import {
2929
} from 'ember-cloud-firestore-adapter/firebase/firestore';
3030
import type CloudFirestoreModularAdapter from 'ember-cloud-firestore-adapter/adapters/cloud-firestore-modular';
3131
import AdapterRecordNotFoundError from 'ember-cloud-firestore-adapter/utils/custom-errors';
32+
import type { Snapshot } from 'ember-cloud-firestore-adapter/adapters/cloud-firestore-modular';
33+
import type UserModel from 'dummy/tests/dummy/app/models/user';
3234
import resetFixtureData from '../../helpers/reset-fixture-data';
3335

3436
module('Unit | Adapter | cloud firestore modular', function (hooks) {
@@ -62,8 +64,14 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) {
6264
test('should proxy a call to updateRecord and return with the created doc', async function (assert) {
6365
// Arrange
6466
const store = this.owner.lookup('service:store');
65-
const modelClass = { modelName: 'user' } as ModelSchema;
66-
const snapshot = { id: 'user_100', age: 30, username: 'user_100' };
67+
const modelClass = store.modelFor('user');
68+
const snapshot = store
69+
.createRecord<UserModel>('user', {
70+
id: 'user_100',
71+
age: 30,
72+
username: 'user_100',
73+
})
74+
._createSnapshot() as Snapshot;
6775
const adapter = this.owner.lookup(
6876
'adapter:cloud-firestore-modular',
6977
) as CloudFirestoreModularAdapter;
@@ -73,16 +81,12 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) {
7381
.returns(Promise.resolve({ foo: 'foo' }));
7482

7583
// Act
76-
const result = await adapter.createRecord(
77-
store,
78-
modelClass,
79-
snapshot as any,
80-
);
84+
const result = await adapter.createRecord(store, modelClass, snapshot);
8185

8286
// Assert
8387
assert.deepEqual(result, { foo: 'foo' });
8488
assert.ok(
85-
updateRecordStub.calledWithExactly(store, modelClass, snapshot as any),
89+
updateRecordStub.calledWithExactly(store, modelClass, snapshot),
8690
);
8791
});
8892
});
@@ -91,11 +95,13 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) {
9195
test('should update record and resolve with the updated doc', async function (assert) {
9296
// Arrange
9397
const store = this.owner.lookup('service:store');
94-
const modelClass = { modelName: 'user' } as ModelSchema;
95-
const snapshot = {
96-
id: 'user_a',
97-
age: 50,
98-
};
98+
const modelClass = store.modelFor('user');
99+
const snapshot = store
100+
.createRecord<UserModel>('user', {
101+
id: 'user_a',
102+
age: 50,
103+
})
104+
._createSnapshot() as Snapshot;
99105
const adapter = this.owner.lookup(
100106
'adapter:cloud-firestore-modular',
101107
) as CloudFirestoreModularAdapter;
@@ -106,11 +112,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) {
106112
});
107113

108114
// Act
109-
const result = await adapter.updateRecord(
110-
store,
111-
modelClass,
112-
snapshot as any,
113-
);
115+
const result = await adapter.updateRecord(store, modelClass, snapshot);
114116

115117
// Assert
116118
assert.deepEqual(result, { age: 50, username: 'user_a' });
@@ -124,7 +126,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) {
124126
test('should update record in a custom collection and resolve with the updated resource', async function (assert) {
125127
// Arrange
126128
const store = this.owner.lookup('service:store');
127-
const modelClass = { modelName: 'user' } as ModelSchema;
129+
const modelClass = store.modelFor('user');
128130
const snapshot = {
129131
id: 'user_a',
130132
age: 50,
@@ -158,7 +160,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) {
158160
test('should update record and process additional batched writes', async function (assert) {
159161
// Arrange
160162
const store = this.owner.lookup('service:store');
161-
const modelClass = { modelName: 'user' } as ModelSchema;
163+
const modelClass = store.modelFor('user');
162164
const snapshot = {
163165
id: 'user_a',
164166
age: 50,
@@ -203,14 +205,16 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) {
203205
test('should delete record', async function (assert) {
204206
// Arrange
205207
const store = this.owner.lookup('service:store');
206-
const modelClass = { modelName: 'user' } as ModelSchema;
207-
const snapshot = { id: 'user_a' };
208+
const modelClass = store.modelFor('user');
209+
const snapshot = store
210+
.createRecord<UserModel>('user', { id: 'user_a' })
211+
._createSnapshot() as Snapshot;
208212
const adapter = this.owner.lookup(
209213
'adapter:cloud-firestore-modular',
210214
) as CloudFirestoreModularAdapter;
211215

212216
// Act
213-
await adapter.deleteRecord(store, modelClass, snapshot as any);
217+
await adapter.deleteRecord(store, modelClass, snapshot);
214218

215219
// Assert
216220
const userA = await getDoc(doc(db, 'users/user_a'));
@@ -221,7 +225,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) {
221225
test('should delete record in a custom collection', async function (assert) {
222226
// Arrange
223227
const store = this.owner.lookup('service:store');
224-
const modelClass = { modelName: 'post' } as ModelSchema;
228+
const modelClass = store.modelFor('post');
225229
const snapshot = {
226230
id: 'post_b',
227231

@@ -247,7 +251,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) {
247251
test('should delete record and process additional batched writes', async function (assert) {
248252
// Arrange
249253
const store = this.owner.lookup('service:store');
250-
const modelClass = { modelName: 'user' } as ModelSchema;
254+
const modelClass = store.modelFor('user');
251255
const snapshot = {
252256
id: 'user_a',
253257
adapterOptions: {
@@ -282,7 +286,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) {
282286
const store = this.owner.lookup('service:store');
283287
store.normalize = sinon.stub();
284288
(store.push as (data: EmptyResourceDocument) => null) = sinon.stub();
285-
const modelClass = { modelName: 'user' } as ModelSchema;
289+
const modelClass = store.modelFor('user');
286290
const adapter = this.owner.lookup(
287291
'adapter:cloud-firestore-modular',
288292
) as CloudFirestoreModularAdapter;
@@ -320,9 +324,11 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) {
320324
const store = this.owner.lookup('service:store');
321325
store.normalize = sinon.stub();
322326
(store.push as (data: EmptyResourceDocument) => null) = sinon.stub();
323-
const modelClass = { modelName: 'user' } as ModelSchema;
327+
const modelClass = store.modelFor('user');
324328
const modelId = 'user_a';
325-
const snapshot = {};
329+
const snapshot = store
330+
.createRecord<UserModel>('user', {})
331+
._createSnapshot() as Snapshot;
326332
const adapter = this.owner.lookup(
327333
'adapter:cloud-firestore-modular',
328334
) as CloudFirestoreModularAdapter;
@@ -332,7 +338,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) {
332338
store,
333339
modelClass,
334340
modelId,
335-
snapshot as any,
341+
snapshot,
336342
);
337343

338344
// Assert
@@ -349,7 +355,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) {
349355
const store = this.owner.lookup('service:store');
350356
store.normalize = sinon.stub();
351357
(store.push as (data: EmptyResourceDocument) => null) = sinon.stub();
352-
const modelClass = { modelName: 'user' } as ModelSchema;
358+
const modelClass = store.modelFor('user');
353359
const modelId = 'user_a';
354360
const snapshot = {
355361
adapterOptions: {
@@ -381,16 +387,18 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) {
381387
const store = this.owner.lookup('service:store');
382388
store.normalize = sinon.stub();
383389
(store.push as (data: EmptyResourceDocument) => null) = sinon.stub();
384-
const modelClass = { modelName: 'user' } as ModelSchema;
390+
const modelClass = store.modelFor('user');
385391
const modelId = 'user_100';
386-
const snapshot = {};
392+
const snapshot = store
393+
.createRecord<UserModel>('user', {})
394+
._createSnapshot() as Snapshot;
387395
const adapter = this.owner.lookup(
388396
'adapter:cloud-firestore-modular',
389397
) as CloudFirestoreModularAdapter;
390398

391399
try {
392400
// Act
393-
await adapter.findRecord(store, modelClass, modelId, snapshot as any);
401+
await adapter.findRecord(store, modelClass, modelId, snapshot);
394402
} catch (error) {
395403
// Assert
396404
assert.ok(error instanceof AdapterRecordNotFoundError);
@@ -408,7 +416,9 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) {
408416
const store = this.owner.lookup('service:store');
409417
store.normalize = sinon.stub();
410418
(store.push as (data: EmptyResourceDocument) => null) = sinon.stub();
411-
const snapshot = {};
419+
const snapshot = store
420+
.createRecord<UserModel>('user', {})
421+
._createSnapshot() as Snapshot;
412422
const url = 'users/user_a';
413423
const relationship = { type: 'user', options: {} };
414424
const adapter = this.owner.lookup(
@@ -418,7 +428,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) {
418428
// Act
419429
const result = await adapter.findBelongsTo(
420430
store,
421-
snapshot as any,
431+
snapshot,
422432
url,
423433
relationship as any,
424434
);
@@ -648,7 +658,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) {
648658
test('should query for records', async function (assert) {
649659
// Arrange
650660
const store = this.owner.lookup('service:store');
651-
const modelClass = { modelName: 'user' } as ModelSchema;
661+
const modelClass = store.modelFor('user');
652662
const queryRef = {
653663
filter(reference: CollectionReference) {
654664
return query(reference, where('age', '>=', 15), limit(1));
@@ -680,7 +690,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) {
680690
test('should query for records in a custom collection', async function (assert) {
681691
// Arrange
682692
const store = this.owner.lookup('service:store');
683-
const modelClass = { modelName: 'user' } as ModelSchema;
693+
const modelClass = store.modelFor('user');
684694
const queryRef = {
685695
buildReference(firestore: Firestore) {
686696
return collection(firestore, 'admins');

0 commit comments

Comments
 (0)