Skip to content

Commit

Permalink
release: 3.0.0-rc.15
Browse files Browse the repository at this point in the history
  • Loading branch information
thomas.nisolle-ext committed Feb 1, 2022
1 parent aac103d commit 50dd49d
Show file tree
Hide file tree
Showing 35 changed files with 208 additions and 220 deletions.
8 changes: 7 additions & 1 deletion angular.json
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,13 @@
"options": {
"main": "projects/ngx-firebase-repository/src/test.ts",
"tsConfig": "projects/ngx-firebase-repository/tsconfig.spec.json",
"karmaConfig": "projects/ngx-firebase-repository/karma.conf.js"
"karmaConfig": "projects/ngx-firebase-repository/karma.conf.js",
"fileReplacements": [
{
"replace": "projects/ngx-firebase-repository/src/lib/firestore.ts",
"with": "projects/ngx-firebase-repository/src/e2e/util/firestore-mock.spec.ts"
}
]
}
},
"lint": {
Expand Down
13 changes: 8 additions & 5 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
"@witty-services/ngx-common": "^2.0.0-rc.3",
"@witty-services/ngx-serializer": "^1.0.3",
"@witty-services/rxjs-common": "^1.2.0",
"@witty-services/ts-serializer": "^1.0.5",
"@witty-services/ts-serializer": "^1.0.9",
"angular-in-memory-web-api": "^0.10.0",
"chance": "^1.1.4",
"firebase": "^9.6.1",
Expand Down
6 changes: 3 additions & 3 deletions projects/ngx-firebase-repository/package.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
{
"name": "@witty-services/ngx-firebase-repository",
"version": "3.0.0-rc.14",
"version": "3.0.0-rc.15",
"peerDependencies": {
"@angular/common": ">=8.0.3-rc.0 || >=8.0.3",
"@angular/core": ">=8.0.3-rc.0 || >=8.0.3",
"@witty-services/ngx-repository": "^3.0.0",
"firebase": ">= 8.3.1"
"@witty-services/ngx-repository": "^3.0.0-rc.0 || ^3.0.0",
"firebase": ">= 9.0.0"
},
"repository": {
"type": "git",
Expand Down
3 changes: 2 additions & 1 deletion projects/ngx-firebase-repository/src/e2e/column.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Column, Id, Page } from '@witty-services/ngx-repository';
/*import { Column, Id, Page } from '@witty-services/ngx-repository';
import { FirebaseRepository, FirebaseResource } from '../public-api';
import { expectCollectionAdd, expectDocumentDelete, expectDocumentUpdate, testFirestoreRepository } from './util/test-firestore-repository.spec';
Expand Down Expand Up @@ -493,3 +493,4 @@ describe('Column', () => {
it('should serialize sub types');
it('should serialize field path');
});
*/
100 changes: 25 additions & 75 deletions projects/ngx-firebase-repository/src/e2e/util/firestore-mock.spec.ts
Original file line number Diff line number Diff line change
@@ -1,86 +1,36 @@
import firebase from 'firebase';
import { from, Observable, Subject } from 'rxjs';
import { omit } from 'lodash';
import { arrayMap } from '@witty-services/rxjs-common';
import { map } from 'rxjs/operators';
import CollectionReference = firebase.firestore.CollectionReference;
import DocumentData = firebase.firestore.DocumentData;
import DocumentReference = firebase.firestore.DocumentReference;
import createSpy = jasmine.createSpy;
import { from, Observable, of } from 'rxjs';
import { CollectionReference, DocumentData, DocumentReference, Firestore } from 'firebase/firestore';
import { PartialWithFieldValue, WithFieldValue } from '@firebase/firestore';

export class FirestoreMock {

public readonly collectionAdd: any = createSpy('collectionAdd');
public readonly documentDelete: any = createSpy('documentDelete');
public readonly documentUpdate: any = createSpy('documentUpdate');
private readonly data: Map<string, Observable<any>> = new Map<string, Observable<any>>();

public mock(path: string, ...values: any[]): void {
this.data.set(path, from(values));
}

public collection(path: string): CollectionReference<DocumentData> {
const firestore: FirestoreMock = this;

return {
add: (data: any): Promise<DocumentReference<DocumentData>> => {
firestore.collectionAdd(path, data);
export function collection(firestore: Firestore, path: string): CollectionReference<DocumentData> {
return {} as CollectionReference;
}

return this.getDocumentReference(path).toPromise();
},
onSnapshot: (subscriber: any) => {
this.getData(path).pipe(
arrayMap((item: any) => ({
id: item.id,
data: () => omit(item, ['id'])
}))
).subscribe((docs: any) => {
subscriber.next({docs});
}, () => void 0, () => {
subscriber.complete();
});
}
} as CollectionReference;
}
export function doc(firestore: Firestore, path: string): DocumentReference<DocumentData> {
return {} as DocumentReference;
}

public doc(path: string): DocumentReference<DocumentData> {
const firestore: FirestoreMock = this;
export function addDoc<T>(reference: CollectionReference<T>, data: WithFieldValue<T>): Promise<DocumentReference<T>> {
return of({}).toPromise() as Promise<DocumentReference<T>>;
}

return {
delete(): Promise<void> {
firestore.documentDelete(path);
export function updateDoc(reference: DocumentReference<unknown>, value: unknown, ...moreFieldsAndValues: unknown[]): Promise<void> {
return of(void 0).toPromise() as Promise<void>;
}

return Promise.resolve();
},
update(data: any): Promise<void> {
firestore.documentUpdate(path, data);
export function setDoc<T>(reference: DocumentReference<T>, data: PartialWithFieldValue<T>): Promise<void> {
return of(void 0).toPromise() as Promise<void>;
}

return Promise.resolve();
},
onSnapshot: (subscriber: any) => {
this.getDocumentReference(path).subscribe((value: any) => {
subscriber.next(value);
}, () => void 0, () => {
subscriber.complete();
});
}
} as DocumentReference;
}
export function deleteDoc(reference: DocumentReference<unknown>): Promise<void> {
return of(void 0).toPromise() as Promise<void>;
}

private getData(path: string): Observable<any> {
if (!this.data.has(path)) {
this.data.set(path, new Subject<any>());
}
export class FirestoreMock {

return this.data.get(path);
}
private static readonly data: Map<string, Observable<any>> = new Map<string, Observable<any>>();

private getDocumentReference(path: string): Observable<any> {
return this.getData(path).pipe(
map((item: any) => ({
id: item.id,
data: () => omit(item, ['id'])
}))
);
public static mock(path: string, ...values: any[]): void {
FirestoreMock.data.set(path, from(values));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,25 @@ import { Injectable, Type } from '@angular/core';
import { InjectRepository, NgxRepositoryModule } from '@witty-services/ngx-repository';
import { TestBed } from '@angular/core/testing';
import { FirebaseRepository, FIRESTORE_APP, NgxFirebaseRepositoryModule } from '../../public-api';
import { FirestoreMock } from './firestore-mock.spec';
import { Firestore } from 'firebase/firestore';
import { Firestore, getFirestore } from 'firebase/firestore';
import { initializeApp } from 'firebase/app';

export interface RepositoryContext<T> {
repository: FirebaseRepository<T, string>;
firestore: FirestoreMock;
firestore: Firestore;
}

export function createFirestore(): Firestore {
return getFirestore(initializeApp({
apiKey: 'AIzaSyDSd6EXdQWaWcBMxbTYp-kFAV3zxNu-ArM',
authDomain: 'ngx-repository.firebaseapp.com',
databaseURL: 'https://ngx-repository.firebaseio.com',
projectId: 'ngx-repository',
storageBucket: 'ngx-repository.appspot.com',
messagingSenderId: '352664344689',
appId: '1:352664344689:web:20ec56387616cba621e3d0',
measurementId: 'G-0RD9MTX3PB'
}));
}

export function mockCollection(firestore: Firestore, value: any): void {
Expand Down Expand Up @@ -38,14 +51,14 @@ export function initializeRepository<T>(bookImpl: Type<T>, providers: any[] = []
BookServiceImpl,
{
provide: FIRESTORE_APP,
useClass: FirestoreMock
useFactory: createFirestore
},
...providers
]
});

return {
repository: TestBed.get(BookServiceImpl).repository,
firestore: TestBed.get(FIRESTORE_APP)
repository: TestBed.inject(BookServiceImpl).repository,
firestore: TestBed.inject(FIRESTORE_APP)
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,48 +2,50 @@ import { Type } from '@angular/core';
import { FirebaseRepository } from '../../lib/repository/firebase.repository';
import { forOwn } from 'lodash';
import { initializeRepository, RepositoryContext } from './repository-intializer.spec';
import { addDoc, deleteDoc, updateDoc } from '../../lib/firestore';
import { CollectionReference, DocumentReference } from 'firebase/firestore';
import { FirestoreMock } from './firestore-mock.spec';

export interface FirestoreTestContext {
entity: Type<any>;
request: (repository: FirebaseRepository<any>) => Promise<any>;
expectedPath: string;
expectedResponse: any;
expectedRequest: (firestore: FirestoreMock, path: string) => void;
expectedRequest: (reference: { path: string }) => void;
mockedResponse: any;
}

export function testFirestoreRepository(tests: { [key: string]: Partial<FirestoreTestContext> }): void {
forOwn(tests, (context: Partial<FirestoreTestContext>, name: string) => {
it(name, async () => {
const {repository, firestore}: RepositoryContext<any> = initializeRepository(context.entity);
const {repository}: RepositoryContext<any> = initializeRepository(context.entity);

firestore.mock(context.expectedPath, context.mockedResponse);
FirestoreMock.mock(context.expectedPath, context.mockedResponse);

const response: any = await context.request(repository);

expect(response).toEqual(context.expectedResponse);
if (context.expectedRequest) {
context.expectedRequest(firestore, context.expectedPath);
context.expectedRequest({path: context.expectedPath});
}
});
});
}

export function expectCollectionAdd(value: any): (firestore: FirestoreMock, path: string) => void {
return (firestore: FirestoreMock, path: string) => {
expect(firestore.collectionAdd).toHaveBeenCalledWith(path, value);
export function expectCollectionAdd<T>(value: any): (reference: CollectionReference<T>) => void {
return (reference: CollectionReference<T>) => {
expect(addDoc).toHaveBeenCalledWith(reference, value);
};
}

export function expectDocumentUpdate(value: any): (firestore: FirestoreMock, path: string) => void {
return (firestore: FirestoreMock, path: string) => {
expect(firestore.documentUpdate).toHaveBeenCalledWith(path, value);
export function expectDocumentUpdate<T>(value: any): (reference: DocumentReference<T>) => void {
return (reference: DocumentReference<T>) => {
expect(updateDoc as any).toHaveBeenCalledWith(reference, value);
};
}

export function expectDocumentDelete(): (firestore: FirestoreMock, path: string) => void {
return (firestore: FirestoreMock, path: string) => {
expect(firestore.documentDelete).toHaveBeenCalledWith(path);
export function expectDocumentDelete<T>(): (reference: DocumentReference<T>) => void {
return (reference: DocumentReference<T>) => {
expect(deleteDoc).toHaveBeenCalledWith(reference);
};
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import firebase from 'firebase';
import { PropertyKeyConfiguration } from '@witty-services/ngx-repository';
import WhereFilterOp = firebase.firestore.WhereFilterOp;
import {WhereFilterOp} from 'firebase/firestore';

export interface FirebaseCriteriaContext {
field: string;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import firebase from 'firebase';
import { PropertyKeyConfiguration } from '@witty-services/ngx-repository';
import FieldPath = firebase.firestore.FieldPath;
import OrderByDirection = firebase.firestore.OrderByDirection;
import {PropertyKeyConfiguration} from '@witty-services/ngx-repository';
import {FieldPath, OrderByDirection} from 'firebase/firestore';

export interface FirebaseOrderByContext {
field: string | FieldPath;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import firebase from 'firebase';
import { Converter } from '@witty-services/ngx-repository';
import Timestamp = firebase.firestore.Timestamp;
import {Converter} from '@witty-services/ngx-repository';
import {Timestamp} from 'firebase/firestore';

/**
* @ignore
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import { Column, ColumnContext } from '@witty-services/ngx-repository';
import { FbTimestampConverter } from '../converter/fb-timestamp.converter';
import firebase from 'firebase';
import {Column, ColumnContext} from '@witty-services/ngx-repository';
import {FbTimestampConverter} from '../converter/fb-timestamp.converter';
import {
FirebaseCreatedAtContext,
FirebaseCreatedAtContextConfiguration
} from '../configuration/context/firebase-created-at-context.configuration';
import Timestamp = firebase.firestore.Timestamp;
import {Timestamp} from 'firebase/firestore';

/**
* @ignore
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,22 @@ import {FIREBASE_ORDER_BY_METADATA_KEY, FirebaseOrderBy} from './firebase-order-

describe('FirebaseOrderByDecorator', () => {

it('should place the decorator on good attribute', () => {
const obj: any = {foo: 'bar'};
it('should place all contexts in good place', () => {
const obj: any = {
foo: 'bar',
test: 'value'
};

FirebaseOrderBy()(obj, 'foo');
expect(Reflect.getMetadata(FIREBASE_ORDER_BY_METADATA_KEY, obj)[`propertyKey`]).toEqual('foo');
FirebaseOrderBy()(obj, 'test');

expect(Reflect.getMetadata(FIREBASE_ORDER_BY_METADATA_KEY, obj)).toEqual([
{
propertyKey: 'foo'
},
{
propertyKey: 'test'
}
]);
});
});
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
/**
* @ignore
*/
import {FirebaseOrderByContextConfiguration} from '../configuration/context/firebase-order-by-context.configuration';
import { FirebaseOrderByContextConfiguration } from '../configuration/context/firebase-order-by-context.configuration';

export const FIREBASE_ORDER_BY_METADATA_KEY: string = 'firebaseOrderBy';
export const FIREBASE_ORDER_BY_METADATA_KEY: string = 'firebaseOrderBys';

export function FirebaseOrderBy(): any {
return (target: any, propertyKey: string) => {
const firebaseOrderByContextConfiguration: FirebaseOrderByContextConfiguration = {
propertyKey
};

Reflect.defineMetadata(FIREBASE_ORDER_BY_METADATA_KEY, firebaseOrderByContextConfiguration, target);
let metas: FirebaseOrderByContextConfiguration[] = [];
if (Reflect.hasMetadata(FIREBASE_ORDER_BY_METADATA_KEY, target)) {
metas = Reflect.getMetadata(FIREBASE_ORDER_BY_METADATA_KEY, target);
}
Reflect.defineMetadata(FIREBASE_ORDER_BY_METADATA_KEY, metas.concat(firebaseOrderByContextConfiguration), target);
};
}
Loading

0 comments on commit 50dd49d

Please sign in to comment.