| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047 |
- import { describe, test, vi, expect, beforeEach, afterEach } from 'vitest'
- import type { Repository, Element } from 'pinia-orm'
- import { Str, Uid } from 'pinia-orm/dist/decorators'
- import EntityManager from '~/services/data/entityManager'
- import ApiResource from '~/models/ApiResource'
- import ApiModel from '~/models/ApiModel'
- import type ApiRequestService from '~/services/data/apiRequestService'
- import { IdField } from '~/models/decorators'
- class DummyApiResource extends ApiResource {
- static entity = 'dummyResource'
- @Uid()
- declare id: number | string
- @Str(null)
- declare name: string
- }
- class DummyApiModel extends ApiModel {
- static entity = 'dummyModel'
- @Uid()
- declare id: number | string
- @Str(null)
- declare name: string
- }
- class TestableEntityManager extends EntityManager {
- public _getProfileMask: () => object
- public removeTempAfterPersist(
- model: typeof ApiResource,
- tempInstanceId: number | string,
- ) {
- return super.removeTempAfterPersist(model, tempInstanceId)
- }
- public makeProfileHash() {
- return super.makeProfileHash()
- }
- public validateEntity(instance: unknown): void {
- return super.validateEntity(instance)
- }
- }
- const _console: any = {
- log: console.log,
- warn: console.warn,
- error: console.error,
- }
- vi.mock('~/models/models', async () => {
- class MyModel {
- static entity = 'my-model'
- }
- const modelsIndex: Record<string, any> = { 'my-model': () => MyModel }
- return {
- default: modelsIndex,
- }
- })
- let apiRequestService: ApiRequestService
- let entityManager: TestableEntityManager
- let repo: Repository<ApiResource>
- let _getRepo: (model: typeof ApiResource) => Repository<ApiResource>
- let _getProfileMask: () => object
- beforeEach(() => {
- // @ts-ignore
- repo = vi.fn() as Repository<ApiResource>
- // @ts-ignore
- apiRequestService = vi.fn() as ApiRequestService
- _getRepo = vi.fn((model: typeof ApiResource) => repo)
- _getProfileMask = vi.fn(() => {
- return {}
- })
- entityManager = new TestableEntityManager(
- apiRequestService,
- _getRepo,
- _getProfileMask,
- )
- })
- afterEach(() => {
- // Reset console methods after mock
- console.log = _console.log
- console.warn = _console.warn
- console.error = _console.error
- })
- describe('getRepository', () => {
- test('simple call', () => {
- entityManager.getRepository(DummyApiResource)
- expect(_getRepo).toHaveBeenCalledWith(DummyApiResource)
- })
- })
- 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', () => {
- test('simple cast', () => {
- // @ts-ignore
- const result = entityManager.cast(DummyApiResource, { id: 1 })
- expect(result instanceof DummyApiResource).toEqual(true)
- })
- })
- describe('getModelFor', () => {
- test('simple call', async () => {
- const model = await entityManager.getModelFor('my-model')
- expect(model!.entity).toEqual('my-model')
- })
- test('non existing model', async () => {
- expect(
- async () => await entityManager.getModelFor('non-existing-model'),
- ).rejects.toThrowError(
- "No model found for entity name 'non-existing-model'",
- )
- })
- })
- describe('getModelFromIri', () => {
- test('simple call', async () => {
- // @ts-ignore
- entityManager.getModelFor = vi.fn(
- async (entityName: string) => DummyApiResource,
- )
- // @ts-ignore
- const result = await entityManager.getModelFromIri('/api/dummy/123')
- console.log(result)
- expect(result).toEqual(DummyApiResource)
- })
- test('invalide Iri', () => {
- expect(
- async () => await entityManager.getModelFromIri('/invalid'),
- ).rejects.toThrowError('cannot parse the IRI')
- })
- })
- describe('newInstance', () => {
- test('simple call', () => {
- const properties = { id: 1 }
- // @ts-ignore
- entityManager.getRepository = vi.fn((model: typeof ApiResource) => {
- return model === DummyApiResource ? repo : null
- })
- // @ts-ignore
- const entity = new DummyApiResource(properties)
- // @ts-ignore
- repo.make = vi.fn((properties: object) => {
- // @ts-ignore
- entity.id = properties.id
- return entity
- })
- // @ts-ignore
- entityManager.save = vi.fn(
- (entity: ApiResource, permanent: boolean) => entity,
- )
- const result = entityManager.newInstance(DummyApiResource, properties)
- expect(repo.make).toHaveBeenCalledWith(properties)
- expect(entityManager.save).toHaveBeenCalledWith(entity, true)
- expect(result.id).toEqual(properties.id)
- })
- test('with no id provided', () => {
- const properties = { name: 'bob' }
- // @ts-ignore
- const repo = vi.fn() as Repository<ApiResource>
- // @ts-ignore
- entityManager.getRepository = vi.fn((model: typeof ApiResource) => {
- return model === DummyApiResource ? repo : null
- })
- // @ts-ignore
- entityManager.saveInitialState = vi.fn(
- (model: typeof ApiResource, entity: ApiResource) => null,
- )
- // @ts-ignore
- const entity = new DummyApiResource(properties)
- // @ts-ignore
- repo.make = vi.fn((properties: object) => {
- // @ts-ignore
- entity.name = properties.name
- return entity
- })
- // @ts-ignore
- repo.save = vi.fn((record: Element) => entity)
- const result = entityManager.newInstance(DummyApiResource, properties)
- expect(result.id, "id is 'tmp' followed by a valid uuid-V4").toMatch(
- /tmp[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}/,
- )
- expect(result.name).toEqual(properties.name)
- })
- })
- describe('save', () => {
- test('simple call', () => {
- // @ts-ignore
- const repo = vi.fn() as Repository<ApiResource>
- // @ts-ignore
- entityManager.getRepository = vi.fn((model: typeof ApiResource) => {
- return model === DummyApiResource ? repo : null
- })
- entityManager.validateEntity = vi.fn((instance: unknown) => {})
- // @ts-ignore
- repo.save = vi.fn((record: Element) => entity)
- const entity = new DummyApiResource({ id: 1 })
- entityManager.save(entity)
- expect(entityManager.validateEntity).toHaveBeenCalledWith(entity)
- expect(repo.save).toHaveBeenCalledWith(entity)
- })
- })
- describe('find', () => {
- test('simple call', () => {
- // @ts-ignore
- const repo = vi.fn() as Repository<ApiResource>
- // @ts-ignore
- entityManager.getRepository = vi.fn((model: typeof ApiResource) => {
- return model === DummyApiResource ? repo : null
- })
- const entity = new DummyApiResource({ id: 1 })
- // @ts-ignore
- repo.find = vi.fn((id: string | number) => entity)
- entityManager.find(DummyApiResource, 1)
- expect(entityManager.getRepository).toHaveBeenCalledWith(DummyApiResource)
- expect(repo.find).toHaveBeenCalledWith(1)
- })
- })
- describe('fetch', () => {
- test('not in store, no force refresh', async () => {
- const properties = { id: 1 }
- const entity = new DummyApiResource({ id: 1 })
- // @ts-ignore
- entityManager.find = vi.fn(
- (model: typeof ApiResource, id: number) => undefined,
- )
- // @ts-ignore
- apiRequestService.get = vi.fn(async (url: string) => properties)
- // @ts-ignore
- entityManager.newInstance = vi.fn(
- (model: typeof ApiResource, props: object) => entity,
- )
- const result = await entityManager.fetch(DummyApiResource, 1)
- expect(entityManager.find).toHaveBeenCalledWith(DummyApiResource, 1)
- expect(apiRequestService.get).toHaveBeenCalledWith('api/dummyResource/1')
- expect(entityManager.newInstance).toHaveBeenCalledWith(DummyApiResource, {
- id: 1,
- name: null,
- _model: undefined,
- })
- expect(result).toEqual(entity)
- })
- test('in store, no force refresh', async () => {
- const properties = { id: 1 }
- const entity = new DummyApiResource({ id: 1 })
- // @ts-ignore
- entityManager.find = vi.fn(
- (model: typeof ApiResource, id: number) => entity,
- )
- const result = await entityManager.fetch(DummyApiResource, 1)
- expect(entityManager.find).toHaveBeenCalledWith(DummyApiResource, 1)
- expect(result).toEqual(entity)
- })
- test('in store, but with force refresh', async () => {
- const properties = { id: 1 }
- const entity = new DummyApiResource({ id: 1 })
- // @ts-ignore
- entityManager.find = vi.fn(
- (model: typeof ApiResource, id: number) => undefined,
- )
- // @ts-ignore
- apiRequestService.get = vi.fn(async (url: string) => properties)
- // @ts-ignore
- entityManager.newInstance = vi.fn(
- (model: typeof ApiResource, props: object) => entity,
- )
- const result = await entityManager.fetch(DummyApiResource, 1, true)
- expect(entityManager.find).toHaveBeenCalledTimes(0)
- expect(apiRequestService.get).toHaveBeenCalledWith('api/dummyResource/1')
- expect(entityManager.newInstance).toHaveBeenCalledWith(DummyApiResource, {
- id: 1,
- name: null,
- _model: undefined,
- })
- expect(result).toEqual(entity)
- })
- })
- describe('fetchCollection', () => {
- test('simple call', async () => {
- const collection = {
- '@type': 'Collection',
- totalItems: 3,
- member: [{ id: 1 }, { id: 2 }, { id: 3 }],
- }
- // @ts-ignore
- apiRequestService.get = vi.fn(async (url: string) => collection)
- // @ts-ignore
- entityManager.newInstance = vi.fn(
- (model: typeof ApiResource, props: object) => {
- return new DummyApiResource(props)
- },
- )
- const piniaOrmQuery = vi.fn()
- // @ts-ignore
- entityManager.getQuery = vi.fn((model: typeof ApiResource) => piniaOrmQuery)
- const result = await entityManager.fetchCollection(DummyApiResource, null)
- expect(apiRequestService.get).toHaveBeenCalledWith('api/dummyResource')
- expect(entityManager.newInstance).toHaveBeenCalledTimes(3)
- expect(entityManager.newInstance).toHaveBeenCalledWith(DummyApiResource, {
- id: 1,
- name: null,
- _model: undefined,
- })
- expect(entityManager.newInstance).toHaveBeenCalledWith(DummyApiResource, {
- id: 2,
- name: null,
- _model: undefined,
- })
- expect(entityManager.newInstance).toHaveBeenCalledWith(DummyApiResource, {
- id: 3,
- name: null,
- _model: undefined,
- })
- // @ts-ignore
- piniaOrmQuery.get = vi.fn(() => [
- new DummyApiResource({ id: 1 }),
- new DummyApiResource({ id: 2 }),
- new DummyApiResource({ id: 3 }),
- ])
- 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,
- last: 1,
- next: undefined,
- previous: undefined,
- })
- // @ts-expect-error Needed to avoid 'Cannot stringify non POJO' occasional bugs
- expect(result.toJSON()).toEqual(
- 'Computed result from fetchCollection at : api/dummyResource',
- )
- })
- test('with a parent', async () => {
- const collection = {
- '@type': 'Collection',
- totalItems: 3,
- member: [{ id: 1 }, { id: 2 }, { id: 3 }],
- }
- // @ts-ignore
- apiRequestService.get = vi.fn(async (url: string) => collection)
- const piniaOrmQuery = vi.fn()
- // @ts-ignore
- entityManager.getQuery = vi.fn((model: typeof ApiResource) => piniaOrmQuery)
- // @ts-ignore
- entityManager.newInstance = vi.fn(
- (model: typeof ApiResource, props: object) => {
- return new DummyApiResource(props)
- },
- )
- const parent = new DummyApiModel()
- parent.id = 100
- parent.entity = 'dummyModel' // TODO: je ne comprend pas pqoi cette ligne est nécessaire...
- await entityManager.fetchCollection(DummyApiResource, parent)
- expect(apiRequestService.get).toHaveBeenCalledWith(
- 'api/dummyModel/100/dummyResource',
- )
- })
- test('with a query', async () => {
- const collection = {
- '@type': 'Collection',
- totalItems: 3,
- 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
- apiRequestService.get = vi.fn(async (url: string) => collection)
- // @ts-ignore
- entityManager.newInstance = vi.fn(
- (model: typeof ApiResource, props: object) => {
- return new DummyApiResource(props)
- },
- )
- // @ts-ignore
- await entityManager.fetchCollection(DummyApiResource, null, query)
- expect(apiRequestService.get).toHaveBeenCalledWith(
- 'api/dummyResource?foo=bar',
- )
- // @ts-ignore
- expect(query.getUrlQuery).toHaveBeenCalledWith()
- // @ts-ignore
- expect(query.applyToPiniaOrmQuery).toHaveBeenCalledWith(piniaOrmQuery)
- })
- })
- describe('persist', () => {
- test('new entity (POST)', async () => {
- const instance = new DummyApiModel({ id: 'tmp1', name: 'bob' })
- instance.isNew = vi.fn(() => true)
- // @ts-ignore
- instance.$toJson = vi.fn(() => {
- return { id: 'tmp1', name: 'bob' }
- })
- // @ts-ignore
- entityManager.cast = vi.fn(
- (model: typeof ApiResource, entity: ApiResource): ApiResource => entity,
- )
- entityManager.validateEntity = vi.fn((instance: unknown) => {})
- const response = { id: 1, name: 'bob' }
- // @ts-ignore
- apiRequestService.post = vi.fn((url, data) => response)
- // @ts-ignore
- entityManager.newInstance = vi.fn((model, response) => {
- const newEntity = new DummyApiModel(response)
- // @ts-ignore
- newEntity.id = response.id
- // @ts-ignore
- newEntity.name = response.name
- return newEntity
- })
- // @ts-ignore
- entityManager.removeTempAfterPersist = vi.fn()
- entityManager.makeProfileHash = vi.fn(async () => await 'azerty')
- const result = await entityManager.persist(instance)
- // temp id should have been purged from the posted data
- expect(apiRequestService.post).toHaveBeenCalledWith(
- 'api/dummyModel',
- {
- name: 'bob',
- },
- null,
- { profileHash: 'azerty' },
- )
- expect(entityManager.newInstance).toHaveBeenCalledWith(
- DummyApiModel,
- response,
- )
- // @ts-ignore
- expect(entityManager.removeTempAfterPersist).toHaveBeenCalledWith(
- DummyApiModel,
- instance.id,
- )
- // @ts-ignore
- expect(entityManager.makeProfileHash).toHaveBeenCalledTimes(1)
- expect(result.id).toEqual(1)
- expect(result.name).toEqual('bob')
- expect(entityManager.validateEntity).toHaveBeenCalledWith(instance)
- })
- test('existing entity (PUT)', async () => {
- const props = { id: 1, name: 'bob' }
- const entity = new DummyApiModel(props)
- entity.id = 1
- entity.isNew = vi.fn(() => false)
- // @ts-ignore
- entity.$toJson = vi.fn(() => props)
- // TODO: attendre de voir si cet appel est nécessaire dans l'entity manager
- // entityManager.cast = vi.fn((model: typeof ApiResource, entity: ApiResource): ApiResource => entity)
- // @ts-ignore
- apiRequestService.patch = vi.fn((url, data) => props)
- // @ts-ignore
- entityManager.newInstance = vi.fn((model, response) => {
- const newEntity = new DummyApiModel(response)
- // @ts-ignore
- newEntity.id = response.id
- // @ts-ignore
- newEntity.name = response.name
- return newEntity
- })
- // @ts-ignore
- entityManager.removeTempAfterPersist = vi.fn()
- entityManager.makeProfileHash = vi.fn(async () => await 'azerty')
- entityManager.validateEntity = vi.fn((instance: unknown) => {})
- const result = await entityManager.persist(entity)
- expect(apiRequestService.patch).toHaveBeenCalledWith(
- 'api/dummyModel/1',
- {
- id: 1,
- name: 'bob',
- },
- null,
- { profileHash: 'azerty' },
- )
- expect(entityManager.newInstance).toHaveBeenCalledWith(DummyApiModel, props)
- // @ts-ignore
- expect(entityManager.removeTempAfterPersist).toHaveBeenCalledTimes(0)
- // @ts-ignore
- expect(entityManager.makeProfileHash).toHaveBeenCalledTimes(1)
- expect(result.id).toEqual(1)
- expect(result.name).toEqual('bob')
- expect(entityManager.validateEntity).toHaveBeenCalledWith(entity)
- })
- })
- describe('patch', () => {
- test('simple call', async () => {
- const props = { id: 1, name: 'bobby' }
- // @ts-ignore
- apiRequestService.put = vi.fn((url, data) => props)
- // @ts-ignore
- entityManager.newInstance = vi.fn((model, response) => {
- const newEntity = new DummyApiModel(response)
- // @ts-ignore
- newEntity.id = response.id
- // @ts-ignore
- newEntity.name = response.name
- return newEntity
- })
- const result = await entityManager.patch(DummyApiModel, 1, {
- name: 'bobby',
- })
- expect(apiRequestService.put).toHaveBeenCalledWith(
- 'api/dummyModel/1',
- '{"name":"bobby"}',
- )
- expect(entityManager.newInstance).toHaveBeenCalledWith(DummyApiModel, {
- id: 1,
- name: 'bobby',
- })
- expect(result.id).toEqual(1)
- expect(result.name).toEqual('bobby')
- })
- })
- describe('delete', () => {
- test('delete non persisted entity', () => {
- const entity = new DummyApiModel()
- entity.id = 'tmp123'
- // @ts-ignore
- const repo = vi.fn() as Repository<ApiResource>
- // @ts-ignore
- entityManager.getRepository = vi.fn((model: typeof ApiResource) => {
- return model === DummyApiModel ? repo : null
- })
- entityManager.validateEntity = vi.fn((instance: unknown) => {})
- apiRequestService.delete = vi.fn()
- // @ts-ignore
- repo.destroy = vi.fn((id: number) => null)
- entityManager.delete(entity)
- expect(entityManager.getRepository).toHaveBeenCalledWith(DummyApiModel)
- expect(apiRequestService.delete).toHaveBeenCalledTimes(0)
- expect(repo.destroy).toHaveBeenCalledWith('tmp123')
- expect(entityManager.validateEntity).toHaveBeenCalledWith(entity)
- })
- test('delete persisted entity', async () => {
- const entity = new DummyApiModel()
- entity.isNew = vi.fn(() => false)
- entity.id = 1
- // @ts-ignore
- const repo = vi.fn() as Repository<ApiResource>
- // @ts-ignore
- entityManager.getRepository = vi.fn((model: typeof ApiResource) => {
- return model === DummyApiModel ? repo : null
- })
- // @ts-ignore
- apiRequestService.delete = vi.fn((id: number) => null)
- // @ts-ignore
- repo.destroy = vi.fn((id: number) => null)
- await entityManager.delete(entity)
- expect(entityManager.getRepository).toHaveBeenCalledWith(DummyApiModel)
- expect(apiRequestService.delete).toHaveBeenCalledWith('api/dummyModel/1')
- expect(repo.destroy).toHaveBeenCalledWith(1)
- })
- })
- describe('reset', () => {
- test('simple call', () => {
- const entity = new DummyApiModel()
- entity.id = 1
- entity.name = 'paul'
- const initialEntity = new DummyApiModel()
- initialEntity.id = 1
- initialEntity.name = 'serge'
- // @ts-ignore
- entityManager.getInitialStateOf = vi.fn(
- (model: typeof ApiResource, id: string | number) => initialEntity,
- )
- // @ts-ignore
- const repo = vi.fn() as Repository<ApiResource>
- // @ts-ignore
- entityManager.getRepository = vi.fn((model: typeof ApiResource) => {
- return model === DummyApiModel ? repo : null
- })
- // @ts-ignore
- repo.save = vi.fn((data: any) => null)
- const result = entityManager.reset(initialEntity)
- // @ts-ignore
- expect(entityManager.getInitialStateOf).toHaveBeenCalledWith(
- DummyApiModel,
- 1,
- )
- expect(repo.save).toHaveBeenCalledWith(initialEntity)
- expect(result).toEqual(initialEntity)
- })
- test('no initial state stored', () => {
- const entity = new DummyApiModel()
- entity.id = 1
- // @ts-ignore
- entityManager.getInitialStateOf = vi.fn(
- (model: typeof ApiResource, id: string | number) => null,
- )
- // @ts-ignore
- entityManager.getModel = vi.fn((instance: ApiResource) => DummyApiModel)
- expect(() => entityManager.reset(entity)).toThrowError(
- 'no initial state recorded for this object - abort [dummyModel/1]',
- )
- })
- })
- describe('flush', () => {
- test('simple call', () => {
- // @ts-ignore
- const repo = vi.fn() as Repository<ApiResource>
- // @ts-ignore
- entityManager.getRepository = vi.fn((model: typeof ApiResource) => {
- return model === DummyApiModel ? repo : null
- })
- repo.flush = vi.fn()
- entityManager.flush(DummyApiModel)
- expect(repo.flush).toHaveBeenCalled()
- })
- })
- describe('isNewEntity', () => {
- test('with new entity', () => {
- const entity = new DummyApiModel()
- entity.isNew = vi.fn(() => true)
- // @ts-ignore
- const repo = vi.fn() as Repository<ApiResource>
- // @ts-ignore
- entityManager.getRepository = vi.fn((model: typeof ApiResource) => {
- return model === DummyApiModel ? repo : null
- })
- // @ts-ignore
- repo.find = vi.fn((id: number) => entity)
- const result = entityManager.isNewInstance(DummyApiModel, 1)
- expect(result).toBeTruthy()
- })
- test('with existing entity', () => {
- const entity = new DummyApiModel()
- entity.isNew = vi.fn(() => false)
- // @ts-ignore
- const repo = vi.fn() as Repository<ApiResource>
- // @ts-ignore
- entityManager.getRepository = vi.fn((model: typeof ApiResource) => {
- return model === DummyApiModel ? repo : null
- })
- // @ts-ignore
- repo.find = vi.fn((id: number) => entity)
- const result = entityManager.isNewInstance(DummyApiModel, 1)
- expect(result).toBeFalsy()
- })
- test('non-existing entity', () => {
- // @ts-ignore
- const repo = vi.fn() as Repository<ApiResource>
- // @ts-ignore
- entityManager.getRepository = vi.fn((model: typeof ApiResource) => {
- return model === DummyApiModel ? repo : null
- })
- // @ts-ignore
- repo.find = vi.fn((id: number) => null)
- console.error = vi.fn()
- const result = entityManager.isNewInstance(DummyApiModel, 1)
- expect(result).toBeFalsy()
- expect(console.error).toHaveBeenCalledWith('dummyModel/1 does not exist!')
- })
- })
- describe('saveInitialState', () => {
- test('simple call', () => {
- // @ts-ignore
- const entity = { id: 1, name: 'bob' } as DummyApiResource
- // @ts-ignore
- const repo = vi.fn() as Repository<ApiResource>
- // @ts-ignore
- entityManager.getRepository = vi.fn((model: typeof ApiResource) => {
- return model === DummyApiResource ? repo : null
- })
- // @ts-ignore
- repo.save = vi.fn((record: Element) => null)
- // @ts-ignore
- entityManager.saveInitialState(DummyApiResource, entity)
- expect(repo.save).toHaveBeenCalledWith({ id: '_clone_1', name: 'bob' })
- expect(entity.id).toEqual(1)
- })
- })
- describe('getInitialStateOf', () => {
- test('with initial state', () => {
- // @ts-ignore
- const entity = { id: 1, name: 'bob' } as DummyApiResource
- // @ts-ignore
- const repo = vi.fn() as Repository<ApiResource>
- // @ts-ignore
- entityManager.getRepository = vi.fn((model: typeof ApiResource) => {
- return model === DummyApiResource ? repo : null
- })
- // @ts-ignore
- repo.find = vi.fn((id: number | string) => {
- // @ts-ignore
- return { id: 1, name: 'robert' } as DummyApiResource
- })
- // @ts-ignore
- const result = entityManager.getInitialStateOf(
- DummyApiResource,
- 1,
- ) as DummyApiResource
- expect(repo.find).toHaveBeenCalledWith('_clone_1')
- expect(result.id).toEqual(1)
- expect(result.name).toEqual('robert')
- })
- test('without initial state', () => {
- // @ts-ignore
- const repo = vi.fn() as Repository<ApiResource>
- // @ts-ignore
- entityManager.getRepository = vi.fn((model: typeof ApiResource) => {
- return model === DummyApiResource ? repo : null
- })
- // @ts-ignore
- repo.find = vi.fn((id: number | string) => null)
- // @ts-ignore
- const result = entityManager.getInitialStateOf(
- DummyApiResource,
- 1,
- ) as DummyApiResource
- expect(repo.find).toHaveBeenCalledWith('_clone_1')
- expect(result).toEqual(null)
- })
- })
- describe('removeTempAfterPersist', () => {
- test('simple call', () => {
- // @ts-ignore
- const entity = new DummyApiResource()
- entity.id = 'tmp123'
- entity.isNew = vi.fn(() => true)
- // @ts-ignore
- const repo = vi.fn() as Repository<ApiResource>
- // @ts-ignore
- entityManager.getRepository = vi.fn((model: typeof ApiResource) => {
- return model === DummyApiResource ? repo : null
- })
- // @ts-ignore
- repo.find = vi.fn((id: number | string) => entity)
- // @ts-ignore
- repo.destroy = vi.fn()
- // @ts-ignore
- entityManager.removeTempAfterPersist(DummyApiResource, 'tmp123')
- expect(repo.destroy).toHaveBeenCalledWith('tmp123')
- expect(repo.destroy).toHaveBeenCalledWith('_clone_tmp123')
- })
- test('entity is not temporary', () => {
- // @ts-ignore
- const entity = new DummyApiResource()
- entity.id = 1
- entity.isNew = vi.fn(() => false)
- // @ts-ignore
- const repo = vi.fn() as Repository<ApiResource>
- // @ts-ignore
- entityManager.getRepository = vi.fn((model: typeof ApiResource) => {
- return model === DummyApiResource ? repo : null
- })
- // @ts-ignore
- repo.find = vi.fn((id: number | string) => entity)
- // @ts-ignore
- repo.destroy = vi.fn()
- // @ts-ignore
- expect(() =>
- entityManager.removeTempAfterPersist(DummyApiResource, 'tmp123'),
- ).toThrowError('Error: Can not remove a non-temporary model instance')
- expect(repo.destroy).toHaveBeenCalledTimes(0)
- })
- test('entity does not exist', () => {
- // @ts-ignore
- const repo = vi.fn() as Repository<ApiResource>
- // @ts-ignore
- entityManager.getRepository = vi.fn((model: typeof ApiResource) => {
- return model === DummyApiResource ? repo : null
- })
- // @ts-ignore
- repo.find = vi.fn((id: number | string) => null)
- // @ts-ignore
- repo.destroy = vi.fn()
- console.error = vi.fn()
- // @ts-ignore
- entityManager.removeTempAfterPersist(DummyApiResource, 'tmp123')
- expect(repo.destroy).toHaveBeenCalledTimes(0)
- expect(console.error).toHaveBeenCalledWith(
- 'dummyResource/tmp123 does not exist!',
- )
- })
- })
- describe('makeProfileHash', () => {
- test('simple call', async () => {
- entityManager._getProfileMask = vi.fn(() => {
- return { a: 1 }
- })
- expect(await entityManager.makeProfileHash()).toEqual(
- '9f89c740ceb46d7418c924a78ac57941d5e96520',
- )
- })
- })
- describe('validateEntity', () => {
- test('instance with numeric id', async () => {
- entityManager.validateEntity({ id: 123 })
- })
- test('instance with temp id', async () => {
- entityManager.validateEntity({ id: 'tmpazerty' })
- })
- test('invalid entity', async () => {
- expect(() => entityManager.validateEntity({ id: 'azerty' })).toThrowError(
- 'Definition error for the entity, did you use the entityManager.newInstance(...) method?\n{"id":"azerty"}',
- )
- })
- })
|