|
@@ -2,10 +2,19 @@ import { describe, test, vi, expect, beforeEach, afterEach } from 'vitest'
|
|
|
import { Repository } from 'pinia-orm'
|
|
import { Repository } from 'pinia-orm'
|
|
|
import type { Element } from 'pinia-orm'
|
|
import type { Element } from 'pinia-orm'
|
|
|
import { Str, Uid } from 'pinia-orm/dist/decorators'
|
|
import { Str, Uid } from 'pinia-orm/dist/decorators'
|
|
|
-import EntityManager from '~/services/data/entityManager'
|
|
|
|
|
import ApiResource from '~/models/ApiResource'
|
|
import ApiResource from '~/models/ApiResource'
|
|
|
import ApiModel from '~/models/ApiModel'
|
|
import ApiModel from '~/models/ApiModel'
|
|
|
import ApiRequestService from '~/services/data/apiRequestService'
|
|
import ApiRequestService from '~/services/data/apiRequestService'
|
|
|
|
|
+import EntityManager from '~/services/data/entityManager'
|
|
|
|
|
+
|
|
|
|
|
+class TestableEntityManager extends EntityManager {
|
|
|
|
|
+ public removeTempAfterPersist(
|
|
|
|
|
+ model: typeof ApiResource,
|
|
|
|
|
+ tempInstanceId: number | string,
|
|
|
|
|
+ ): void {
|
|
|
|
|
+ return super.removeTempAfterPersist(model, tempInstanceId)
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
class DummyApiResource extends ApiResource {
|
|
class DummyApiResource extends ApiResource {
|
|
|
static entity = 'dummyResource'
|
|
static entity = 'dummyResource'
|
|
@@ -46,7 +55,7 @@ vi.mock('~/models/models', async () => {
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
let apiRequestService: ApiRequestService
|
|
let apiRequestService: ApiRequestService
|
|
|
-let entityManager: EntityManager
|
|
|
|
|
|
|
+let entityManager: TestableEntityManager
|
|
|
let repo: Repository<ApiResource>
|
|
let repo: Repository<ApiResource>
|
|
|
let _getRepo: (model: typeof ApiResource) => Repository<ApiResource>
|
|
let _getRepo: (model: typeof ApiResource) => Repository<ApiResource>
|
|
|
|
|
|
|
@@ -58,7 +67,7 @@ beforeEach(() => {
|
|
|
apiRequestService = vi.fn() as ApiRequestService
|
|
apiRequestService = vi.fn() as ApiRequestService
|
|
|
_getRepo = vi.fn((model: typeof ApiResource) => repo)
|
|
_getRepo = vi.fn((model: typeof ApiResource) => repo)
|
|
|
|
|
|
|
|
- entityManager = new EntityManager(apiRequestService, _getRepo)
|
|
|
|
|
|
|
+ entityManager = new TestableEntityManager(apiRequestService, _getRepo)
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
afterEach(() => {
|
|
afterEach(() => {
|
|
@@ -76,6 +85,31 @@ describe('getRepository', () => {
|
|
|
})
|
|
})
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
+describe('getQuery', () => {
|
|
|
|
|
+ test('simple call', () => {
|
|
|
|
|
+ // @ts-ignore
|
|
|
|
|
+ const repo = vi.fn()
|
|
|
|
|
+
|
|
|
|
|
+ // @ts-ignore
|
|
|
|
|
+ entityManager.getRepository = vi.fn(() => repo)
|
|
|
|
|
+
|
|
|
|
|
+ const query = vi.fn()
|
|
|
|
|
+
|
|
|
|
|
+ // @ts-ignore
|
|
|
|
|
+ repo.where = vi.fn((method) => {
|
|
|
|
|
+ // Query method is supposed to exclude NaN ids values
|
|
|
|
|
+ expect(method({ id: 123 })).toBeTruthy()
|
|
|
|
|
+ expect(method({ id: 'abc' })).toBeFalsy()
|
|
|
|
|
+
|
|
|
|
|
+ return query
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ const result = entityManager.getQuery(DummyApiResource)
|
|
|
|
|
+
|
|
|
|
|
+ expect(result).toEqual(query)
|
|
|
|
|
+ })
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
describe('cast', () => {
|
|
describe('cast', () => {
|
|
|
test('simple cast', () => {
|
|
test('simple cast', () => {
|
|
|
// @ts-ignore
|
|
// @ts-ignore
|
|
@@ -324,12 +358,14 @@ describe('fetchCollection', () => {
|
|
|
},
|
|
},
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
|
|
+ const piniaOrmQuery = vi.fn()
|
|
|
|
|
+
|
|
|
|
|
+ // @ts-ignore
|
|
|
|
|
+ entityManager.getQuery = vi.fn((model: typeof ApiResource) => piniaOrmQuery)
|
|
|
|
|
+
|
|
|
const result = await entityManager.fetchCollection(DummyApiResource, null)
|
|
const result = await entityManager.fetchCollection(DummyApiResource, null)
|
|
|
|
|
|
|
|
- expect(apiRequestService.get).toHaveBeenCalledWith(
|
|
|
|
|
- 'api/dummyResource',
|
|
|
|
|
- null,
|
|
|
|
|
- )
|
|
|
|
|
|
|
+ expect(apiRequestService.get).toHaveBeenCalledWith('api/dummyResource')
|
|
|
expect(entityManager.newInstance).toHaveBeenCalledTimes(3)
|
|
expect(entityManager.newInstance).toHaveBeenCalledTimes(3)
|
|
|
expect(entityManager.newInstance).toHaveBeenCalledWith(DummyApiResource, {
|
|
expect(entityManager.newInstance).toHaveBeenCalledWith(DummyApiResource, {
|
|
|
id: 1,
|
|
id: 1,
|
|
@@ -347,13 +383,20 @@ describe('fetchCollection', () => {
|
|
|
_model: undefined,
|
|
_model: undefined,
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
- expect(result.items).toEqual([
|
|
|
|
|
|
|
+ // @ts-ignore
|
|
|
|
|
+ piniaOrmQuery.get = vi.fn(() => [
|
|
|
new DummyApiResource({ id: 1 }),
|
|
new DummyApiResource({ id: 1 }),
|
|
|
new DummyApiResource({ id: 2 }),
|
|
new DummyApiResource({ id: 2 }),
|
|
|
new DummyApiResource({ id: 3 }),
|
|
new DummyApiResource({ id: 3 }),
|
|
|
])
|
|
])
|
|
|
|
|
|
|
|
- expect(result.pagination, 'default pagination').toEqual({
|
|
|
|
|
|
|
+ expect(result.value.items).toEqual([
|
|
|
|
|
+ new DummyApiResource({ id: 1 }),
|
|
|
|
|
+ new DummyApiResource({ id: 2 }),
|
|
|
|
|
+ new DummyApiResource({ id: 3 }),
|
|
|
|
|
+ ])
|
|
|
|
|
+
|
|
|
|
|
+ expect(result.value.pagination, 'default pagination').toEqual({
|
|
|
first: 1,
|
|
first: 1,
|
|
|
last: 1,
|
|
last: 1,
|
|
|
next: undefined,
|
|
next: undefined,
|
|
@@ -371,6 +414,11 @@ describe('fetchCollection', () => {
|
|
|
// @ts-ignore
|
|
// @ts-ignore
|
|
|
apiRequestService.get = vi.fn(async (url: string) => collection)
|
|
apiRequestService.get = vi.fn(async (url: string) => collection)
|
|
|
|
|
|
|
|
|
|
+ const piniaOrmQuery = vi.fn()
|
|
|
|
|
+
|
|
|
|
|
+ // @ts-ignore
|
|
|
|
|
+ entityManager.getQuery = vi.fn((model: typeof ApiResource) => piniaOrmQuery)
|
|
|
|
|
+
|
|
|
// @ts-ignore
|
|
// @ts-ignore
|
|
|
entityManager.newInstance = vi.fn(
|
|
entityManager.newInstance = vi.fn(
|
|
|
(model: typeof ApiResource, props: object) => {
|
|
(model: typeof ApiResource, props: object) => {
|
|
@@ -386,7 +434,6 @@ describe('fetchCollection', () => {
|
|
|
|
|
|
|
|
expect(apiRequestService.get).toHaveBeenCalledWith(
|
|
expect(apiRequestService.get).toHaveBeenCalledWith(
|
|
|
'api/dummyModel/100/dummyResource',
|
|
'api/dummyModel/100/dummyResource',
|
|
|
- null,
|
|
|
|
|
)
|
|
)
|
|
|
})
|
|
})
|
|
|
|
|
|
|
@@ -397,6 +444,19 @@ describe('fetchCollection', () => {
|
|
|
'hydra:member': [{ id: 1 }, { id: 2 }, { id: 3 }],
|
|
'hydra:member': [{ id: 1 }, { id: 2 }, { id: 3 }],
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ const query = vi.fn()
|
|
|
|
|
+
|
|
|
|
|
+ // @ts-ignore
|
|
|
|
|
+ query.getUrlQuery = vi.fn(() => 'foo=bar')
|
|
|
|
|
+
|
|
|
|
|
+ // @ts-ignore
|
|
|
|
|
+ query.applyToPiniaOrmQuery = vi.fn((q) => q)
|
|
|
|
|
+
|
|
|
|
|
+ const piniaOrmQuery = vi.fn()
|
|
|
|
|
+
|
|
|
|
|
+ // @ts-ignore
|
|
|
|
|
+ entityManager.getQuery = vi.fn((model: typeof ApiResource) => piniaOrmQuery)
|
|
|
|
|
+
|
|
|
// @ts-ignore
|
|
// @ts-ignore
|
|
|
apiRequestService.get = vi.fn(async (url: string) => collection)
|
|
apiRequestService.get = vi.fn(async (url: string) => collection)
|
|
|
|
|
|
|
@@ -407,37 +467,16 @@ describe('fetchCollection', () => {
|
|
|
},
|
|
},
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
- await entityManager.fetchCollection(DummyApiResource, null, { page: 10 })
|
|
|
|
|
-
|
|
|
|
|
- expect(apiRequestService.get).toHaveBeenCalledWith('api/dummyResource', {
|
|
|
|
|
- page: 10,
|
|
|
|
|
- })
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
- test('with pagination', async () => {
|
|
|
|
|
- const collection = {
|
|
|
|
|
- '@type': 'hydra:Collection',
|
|
|
|
|
- 'hydra:totalItems': 1000,
|
|
|
|
|
- 'hydra:member': [],
|
|
|
|
|
- 'hydra:view': {
|
|
|
|
|
- '@id': '/api/subdomains?organization=498&page=50',
|
|
|
|
|
- 'hydra:first': '/api/subdomains?organization=498&page=1',
|
|
|
|
|
- 'hydra:last': '/api/subdomains?organization=498&page=100',
|
|
|
|
|
- 'hydra:next': '/api/subdomains?organization=498&page=51',
|
|
|
|
|
- 'hydra:previous': '/api/subdomains?organization=498&page=49',
|
|
|
|
|
- },
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
// @ts-ignore
|
|
// @ts-ignore
|
|
|
- apiRequestService.get = vi.fn(async (url: string) => collection)
|
|
|
|
|
-
|
|
|
|
|
- const result = await entityManager.fetchCollection(DummyApiResource, null)
|
|
|
|
|
|
|
+ await entityManager.fetchCollection(DummyApiResource, null, query)
|
|
|
|
|
|
|
|
- expect(result.totalItems).toEqual(1000)
|
|
|
|
|
- expect(result.pagination.first).toEqual(1)
|
|
|
|
|
- expect(result.pagination.last).toEqual(100)
|
|
|
|
|
- expect(result.pagination.previous).toEqual(49)
|
|
|
|
|
- expect(result.pagination.next).toEqual(51)
|
|
|
|
|
|
|
+ expect(apiRequestService.get).toHaveBeenCalledWith(
|
|
|
|
|
+ 'api/dummyResource?foo=bar',
|
|
|
|
|
+ )
|
|
|
|
|
+ // @ts-ignore
|
|
|
|
|
+ expect(query.getUrlQuery).toHaveBeenCalledWith()
|
|
|
|
|
+ // @ts-ignore
|
|
|
|
|
+ expect(query.applyToPiniaOrmQuery).toHaveBeenCalledWith(piniaOrmQuery)
|
|
|
})
|
|
})
|
|
|
})
|
|
})
|
|
|
|
|
|