From b0bd75437839e247d6b3b85b4b5d593b9972bcc4 Mon Sep 17 00:00:00 2001 From: Tom Gobich Date: Thu, 25 Jul 2024 07:36:00 -0400 Subject: [PATCH] refactored(#1): test now uses ModelPaginator impl --- README.md | 15 +++++++++ test-utils/model_paginator.ts | 14 +++++++++ tests/dtos/base.spec.ts | 58 +++++++++++++++++------------------ 3 files changed, 58 insertions(+), 29 deletions(-) create mode 100644 test-utils/model_paginator.ts diff --git a/README.md b/README.md index be124b2..50ca19d 100644 --- a/README.md +++ b/README.md @@ -204,6 +204,21 @@ const paginationUrls = paginatorDto.meta.pagesInRange */ ``` +If, for example, you're using something like Inertia, you can then type your props accordingly + +```ts +import { SimplePaginatorDtoContract } from '@adocasts.com/dto/types' +import DifficultyDto from '#dtos/difficulty' + +const props = defineProps<{ + paginated: SimplePaginatorDtoContract +}>() + +const rows = props.paginated.data +const info = props.paginated.meta +const urls = props.paginated.meta.pagesInRange +``` + ## Things To Note - At present we assume the Model's name from the file name of the model. diff --git a/test-utils/model_paginator.ts b/test-utils/model_paginator.ts new file mode 100644 index 0000000..4490c90 --- /dev/null +++ b/test-utils/model_paginator.ts @@ -0,0 +1,14 @@ +import { SimplePaginator } from '@adonisjs/lucid/database' +import { ModelPaginatorContract, CherryPick } from '@ioc:Adonis/Lucid/Orm' + +export class ModelPaginator extends SimplePaginator implements ModelPaginatorContract { + /** + * Serialize models + */ + serialize(cherryPick?: CherryPick) { + return { + meta: this.getMeta(), + data: this.all().map((row) => row.serialize(cherryPick)), + } + } +} diff --git a/tests/dtos/base.spec.ts b/tests/dtos/base.spec.ts index 2e04675..756802c 100644 --- a/tests/dtos/base.spec.ts +++ b/tests/dtos/base.spec.ts @@ -1,8 +1,8 @@ import { test } from '@japa/runner' import { BaseDto, BaseModelDto } from '../../src/base/main.js' import { BaseModel, column } from '@adonisjs/lucid/orm' -// import { SimplePaginator } from '@adonisjs/lucid/database' -// import SimplePaginatorDto from '../../src/paginator/simple_paginator_dto.js' +import SimplePaginatorDto from '../../src/paginator/simple_paginator_dto.js' +import { ModelPaginator } from '../../test-utils/model_paginator.js' test.group('Internal DTOs', (group) => { group.each.teardown(async ({ context }) => { @@ -58,31 +58,31 @@ test.group('Internal DTOs', (group) => { dtoArray.map((dto) => assert.instanceOf(dto, TestDto)) }) - // test('should allow conversion to SimplePaginatorDto for Lucid Models', async ({ assert }) => { - // class Test extends BaseModel { - // @column() - // declare id: number - // } - - // class TestDto extends BaseModelDto { - // declare id: number - // constructor(instance: Test) { - // super() - // this.id = instance.id - // } - // } - - // const test1 = new Test().merge({ id: 1 }) - // const test2 = new Test().merge({ id: 2 }) - // const test3 = new Test().merge({ id: 3 }) - - // const paginator = new SimplePaginator(3, 2, 1, test1, test2, test3) - // const paginatorDto = TestDto.fromPaginator(paginator, { start: 1, end: 2 }) - - // assert.instanceOf(paginatorDto, SimplePaginatorDto) - // assert.isArray(paginatorDto.data) - // assert.lengthOf(paginatorDto.meta.pagesInRange!, 2) - - // paginatorDto.data.map((dto) => assert.instanceOf(dto, TestDto)) - // }) + test('should allow conversion to SimplePaginatorDto for Lucid Models', async ({ assert }) => { + class Test extends BaseModel { + @column() + declare id: number + } + + class TestDto extends BaseModelDto { + declare id: number + constructor(instance: Test) { + super() + this.id = instance.id + } + } + + const test1 = new Test().merge({ id: 1 }) + const test2 = new Test().merge({ id: 2 }) + const test3 = new Test().merge({ id: 3 }) + + const paginator = new ModelPaginator(3, 2, 1, test1, test2, test3) + const paginatorDto = TestDto.fromPaginator(paginator, { start: 1, end: 2 }) + + assert.instanceOf(paginatorDto, SimplePaginatorDto) + assert.isArray(paginatorDto.data) + assert.lengthOf(paginatorDto.meta.pagesInRange!, 2) + + paginatorDto.data.map((dto) => assert.instanceOf(dto, TestDto)) + }) })