diff --git a/api-v3/test/unit/survey-execution-authorization.test.ts b/api-v3/test/unit/survey-execution-authorization.test.ts deleted file mode 100644 index 9a7f7c4..0000000 --- a/api-v3/test/unit/survey-execution-authorization.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -import 'reflect-metadata'; -import assert from 'node:assert/strict'; -import test from 'node:test'; -import { REQUIRED_PERMISSIONS_KEY } from '../../src/authorization/decorators/require-permissions.decorator'; -import { SurveyExecutionController } from '../../src/survey-execution/survey-execution.controller'; - -function permissionFor(method: string): string[] { - const controller = SurveyExecutionController.prototype; - const handler = controller[method as keyof typeof controller]; - return Reflect.getMetadata(REQUIRED_PERMISSIONS_KEY, handler) as string[]; -} - -test('survey report endpoints separate reading, capture and review', () => { - assert.deepEqual(permissionFor('get'), ['surveys.read_reports']); - assert.deepEqual(permissionFor('save'), ['surveys.capture']); - assert.deepEqual(permissionFor('submit'), ['surveys.capture']); - assert.deepEqual(permissionFor('review'), ['surveys.review']); -}); diff --git a/api-v3/test/unit/survey-execution-dto.test.ts b/api-v3/test/unit/survey-execution-dto.test.ts deleted file mode 100644 index fa7a655..0000000 --- a/api-v3/test/unit/survey-execution-dto.test.ts +++ /dev/null @@ -1,48 +0,0 @@ -import 'reflect-metadata'; -import assert from 'node:assert/strict'; -import test from 'node:test'; -import { validate } from 'class-validator'; -import { ReviewSurveyReportDto } from '../../src/survey-execution/dto/review-survey-report.dto'; -import { SaveSurveyReportDto } from '../../src/survey-execution/dto/save-survey-report.dto'; - -const MEDIA_ID = '16e54e65-60cf-4739-b0d1-ccdd904fbfd5'; - -test('field report DTO accepts outcome, GPS and protected media references', async () => { - const dto = Object.assign(new SaveSurveyReportDto(), { - outcome: 'CONFIRMED', - observedAt: '2026-08-14T18:00:00.000Z', - latitude: -32.8895, - longitude: -68.8458, - accuracyM: 4.25, - notes: 'Activo verificado en campo.', - mediaIds: [MEDIA_ID], - }); - assert.deepEqual(await validate(dto), []); -}); - -test('field report DTO rejects invalid coordinates and repeated evidence', async () => { - const dto = Object.assign(new SaveSurveyReportDto(), { - outcome: 'CONFIRMED', - observedAt: 'not-a-date', - latitude: -95, - longitude: -68.8458, - accuracyM: 4.25, - mediaIds: [MEDIA_ID, MEDIA_ID], - }); - const properties = new Set((await validate(dto)).map((error) => error.property)); - assert.equal(properties.has('observedAt'), true); - assert.equal(properties.has('latitude'), true); - assert.equal(properties.has('mediaIds'), true); -}); - -test('review DTO only accepts explicit approval or rejection decisions', async () => { - const dto = Object.assign(new ReviewSurveyReportDto(), { - decision: 'APPROVE', - notes: null, - }); - assert.deepEqual(await validate(dto), []); - - dto.decision = 'MAYBE' as typeof dto.decision; - const properties = new Set((await validate(dto)).map((error) => error.property)); - assert.equal(properties.has('decision'), true); -}); diff --git a/api-v3/test/unit/survey-planning-authorization.test.ts b/api-v3/test/unit/survey-planning-authorization.test.ts deleted file mode 100644 index 63949ae..0000000 --- a/api-v3/test/unit/survey-planning-authorization.test.ts +++ /dev/null @@ -1,31 +0,0 @@ -import 'reflect-metadata'; -import assert from 'node:assert/strict'; -import test from 'node:test'; -import { REQUIRED_PERMISSIONS_KEY } from '../../src/authorization/decorators/require-permissions.decorator'; -import { - SurveyCampaignsController, - SurveyCampaignTargetsController, -} from '../../src/survey-planning/survey-campaigns.controller'; - -function permissionFor(controller: object, method: string): string[] { - const handler = controller[method as keyof typeof controller]; - return Reflect.getMetadata(REQUIRED_PERMISSIONS_KEY, handler) as string[]; -} - -test('campaign endpoints separate reading, management and assignment', () => { - const controller = SurveyCampaignsController.prototype; - assert.deepEqual(permissionFor(controller, 'list'), ['surveys.read']); - assert.deepEqual(permissionFor(controller, 'get'), ['surveys.read']); - assert.deepEqual(permissionFor(controller, 'assignees'), ['surveys.assign']); - assert.deepEqual(permissionFor(controller, 'create'), ['surveys.manage']); - assert.deepEqual(permissionFor(controller, 'update'), ['surveys.manage']); - assert.deepEqual(permissionFor(controller, 'changeStatus'), ['surveys.manage']); - assert.deepEqual(permissionFor(controller, 'addTarget'), ['surveys.manage']); -}); - -test('target planning, assignment and execution use distinct permissions', () => { - const controller = SurveyCampaignTargetsController.prototype; - assert.deepEqual(permissionFor(controller, 'update'), ['surveys.manage']); - assert.deepEqual(permissionFor(controller, 'assign'), ['surveys.assign']); - assert.deepEqual(permissionFor(controller, 'changeStatus'), ['surveys.execute']); -}); diff --git a/api-v3/test/unit/survey-planning-dto.test.ts b/api-v3/test/unit/survey-planning-dto.test.ts deleted file mode 100644 index 4df9a52..0000000 --- a/api-v3/test/unit/survey-planning-dto.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -import 'reflect-metadata'; -import assert from 'node:assert/strict'; -import test from 'node:test'; -import { validate } from 'class-validator'; -import { AddSurveyTargetDto } from '../../src/survey-planning/dto/add-survey-target.dto'; -import { CreateSurveyCampaignDto } from '../../src/survey-planning/dto/create-survey-campaign.dto'; - -const ASSET_ID = '16e54e65-60cf-4739-b0d1-ccdd904fbfd5'; - -test('campaign DTO accepts dynamic asset scope and ISO planning dates', async () => { - const dto = Object.assign(new CreateSurveyCampaignDto(), { - code: 'REL-2026-001', - name: 'CampaƱa operativa', - description: null, - plannedStartAt: '2026-08-15T12:00:00.000Z', - plannedEndAt: '2026-08-20T12:00:00.000Z', - scopeAssetId: ASSET_ID, - coordinatorUserId: null, - }); - assert.deepEqual(await validate(dto), []); -}); - -test('target DTO references an existing Maestro asset instead of copying it', async () => { - const dto = Object.assign(new AddSurveyTargetDto(), { - assetId: ASSET_ID, - assignedUserId: null, - dueAt: null, - instructions: null, - }); - assert.deepEqual(await validate(dto), []); - - dto.assetId = 'not-a-uuid'; - const properties = new Set((await validate(dto)).map((error) => error.property)); - assert.equal(properties.has('assetId'), true); -});