2025-01-24 17:11:10 +01:00
|
|
|
import { test } from '@japa/runner';
|
|
|
|
import { ReferenceIdentifierTypes } from '#contracts/enums';
|
|
|
|
import vine from '@vinejs/vine';
|
|
|
|
|
|
|
|
// node ace test functional --groups "ReferenceValidation"
|
|
|
|
test.group('ReferenceValidation', () => {
|
|
|
|
test('validate valid DOI', async ({ assert }) => {
|
|
|
|
const validator = vine.compile(
|
|
|
|
vine.object({
|
|
|
|
reference: vine.string().validateReference({ typeField: 'type' }),
|
|
|
|
type: vine.enum(Object.values(ReferenceIdentifierTypes)),
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
|
|
|
|
const data = {
|
|
|
|
reference: 'https://doi.org/10.24341/tethys.236',
|
|
|
|
type: ReferenceIdentifierTypes.DOI,
|
|
|
|
};
|
|
|
|
|
|
|
|
try {
|
|
|
|
const payload = await validator.validate(data);
|
|
|
|
assert.deepEqual(payload, data);
|
|
|
|
} catch {
|
|
|
|
assert.isTrue(false);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
test('validate invalid DOI', async ({ assert }) => {
|
|
|
|
const validator = vine.compile(
|
|
|
|
vine.object({
|
|
|
|
reference: vine.string().validateReference({ typeField: 'type' }),
|
|
|
|
type: vine.enum(Object.values(ReferenceIdentifierTypes)),
|
|
|
|
}),
|
|
|
|
);
|
|
|
|
|
|
|
|
const data = {
|
|
|
|
reference: 'https://doi.org/invalid-doi',
|
|
|
|
type: ReferenceIdentifierTypes.DOI,
|
|
|
|
};
|
|
|
|
|
|
|
|
let payload = {};
|
|
|
|
try {
|
|
|
|
payload = await validator.validate(data);
|
|
|
|
} catch {
|
|
|
|
assert.notDeepEqual(payload, data);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
test('validate valid Handle', async ({ assert }) => {
|
|
|
|
const validator = vine.compile(
|
|
|
|
vine.object({
|
|
|
|
reference: vine.string().validateReference({ typeField: 'type' }),
|
|
|
|
type: vine.enum(Object.values(ReferenceIdentifierTypes)),
|
2025-01-29 11:26:21 +01:00
|
|
|
}),
|
2025-01-24 17:11:10 +01:00
|
|
|
);
|
|
|
|
|
|
|
|
const data = {
|
|
|
|
reference: '20.5000/abc123',
|
|
|
|
type: ReferenceIdentifierTypes.Handle,
|
|
|
|
};
|
|
|
|
|
|
|
|
try {
|
|
|
|
const payload = await validator.validate(data);
|
|
|
|
assert.deepEqual(payload, data);
|
|
|
|
} catch {
|
|
|
|
assert.isTrue(false);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
test('validate valid ISBN', async ({ assert }) => {
|
|
|
|
const validator = vine.compile(
|
|
|
|
vine.object({
|
|
|
|
reference: vine.string().validateReference({ typeField: 'type' }),
|
|
|
|
type: vine.enum(Object.values(ReferenceIdentifierTypes)),
|
2025-01-29 11:26:21 +01:00
|
|
|
}),
|
2025-01-24 17:11:10 +01:00
|
|
|
);
|
|
|
|
|
|
|
|
const data = {
|
|
|
|
// reference: '978-3-85316-090-9',
|
|
|
|
// reference: '9783853160909',
|
2025-01-29 11:26:21 +01:00
|
|
|
// reference: '978-3-900312-64-0', // Geologische Karte der Republik Österreich 1 : 50.000
|
feat: Add alternate mimetype support, enhance validation for alternate mimetypes, and improve script loading performance
- mime_type.ts: Added a new column `public alternate_mimetype: string;`
- MimetypeController.ts: Extended validation and storage logic to accommodate the new `alternate_mimetype` attribute
- adonisrc.ts: Integrated new validation rule to validate user-provided mimetypes
- vite.ts: Set `defer: true` for script attributes to improve loading performance
- update_1_to_mime_types.ts: Added migration for the new `alternate_mimetype` column in the database
- UI improvements: Updated components such as AsideMenuLayer.vue, FormCheckRadioGroup.vue, MimeTypeInput.vue, NavBar.vue (lime-green background), NavBarMenu.vue, SectionBannerStarOnGitea.vue, Admin/mimetype/Create.vue, Admin/mimetype/Delete.vue, Admin/mimetype/Index.vue
- allowed_extensions_mimetype.ts: Enhanced rule to also check for alternate mimetypes
- referenceValidation.ts: Improved validation to allow only ISBNs with a '-' delimiter
- package-lock.json: Updated npm dependencie
2025-02-13 15:49:09 +01:00
|
|
|
reference: '3-90031-264-8', // Geologische Karte der Republik Österreich 1 : 50.000
|
2025-01-24 17:11:10 +01:00
|
|
|
type: ReferenceIdentifierTypes.ISBN,
|
|
|
|
};
|
|
|
|
|
|
|
|
try {
|
|
|
|
const payload = await validator.validate(data);
|
|
|
|
assert.deepEqual(payload, data);
|
|
|
|
} catch {
|
|
|
|
assert.isTrue(false);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
test('validate invalid ISBN', async ({ assert }) => {
|
|
|
|
const validator = vine.compile(
|
|
|
|
vine.object({
|
|
|
|
reference: vine.string().validateReference({ typeField: 'type' }),
|
|
|
|
type: vine.enum(Object.values(ReferenceIdentifierTypes)),
|
2025-01-29 11:26:21 +01:00
|
|
|
}),
|
2025-01-24 17:11:10 +01:00
|
|
|
);
|
|
|
|
|
|
|
|
const data = {
|
|
|
|
reference: 'invalid-isbn',
|
|
|
|
type: ReferenceIdentifierTypes.ISBN,
|
|
|
|
};
|
|
|
|
|
|
|
|
let payload = {};
|
|
|
|
try {
|
|
|
|
payload = await validator.validate(data);
|
|
|
|
} catch {
|
|
|
|
assert.notDeepEqual(payload, data);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
test('validate valid URN', async ({ assert }) => {
|
|
|
|
const validator = vine.compile(
|
|
|
|
vine.object({
|
|
|
|
reference: vine.string().validateReference({ typeField: 'type' }),
|
|
|
|
type: vine.enum(Object.values(ReferenceIdentifierTypes)),
|
2025-01-29 11:26:21 +01:00
|
|
|
}),
|
2025-01-24 17:11:10 +01:00
|
|
|
);
|
|
|
|
|
|
|
|
const data = {
|
|
|
|
reference: 'urn:isbn:0451450523',
|
|
|
|
type: ReferenceIdentifierTypes.URN,
|
|
|
|
};
|
|
|
|
|
|
|
|
try {
|
|
|
|
const payload = await validator.validate(data);
|
|
|
|
assert.deepEqual(payload, data);
|
|
|
|
} catch {
|
|
|
|
assert.isTrue(false);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
test('validate invalid URN', async ({ assert }) => {
|
|
|
|
const validator = vine.compile(
|
|
|
|
vine.object({
|
|
|
|
reference: vine.string().validateReference({ typeField: 'type' }),
|
|
|
|
type: vine.enum(Object.values(ReferenceIdentifierTypes)),
|
2025-01-29 11:26:21 +01:00
|
|
|
}),
|
2025-01-24 17:11:10 +01:00
|
|
|
);
|
|
|
|
|
|
|
|
const data = {
|
|
|
|
reference: 'invalid-urn',
|
|
|
|
type: ReferenceIdentifierTypes.URN,
|
|
|
|
};
|
|
|
|
|
|
|
|
let payload = {};
|
|
|
|
try {
|
|
|
|
payload = await validator.validate(data);
|
|
|
|
} catch {
|
|
|
|
assert.notDeepEqual(payload, data);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
test('validate valid ISSN', async ({ assert }) => {
|
|
|
|
const validator = vine.compile(
|
|
|
|
vine.object({
|
|
|
|
reference: vine.string().validateReference({ typeField: 'type' }),
|
|
|
|
type: vine.enum(Object.values(ReferenceIdentifierTypes)),
|
2025-01-29 11:26:21 +01:00
|
|
|
}),
|
2025-01-24 17:11:10 +01:00
|
|
|
);
|
|
|
|
|
|
|
|
const data = {
|
|
|
|
reference: '1234-567X',
|
|
|
|
type: ReferenceIdentifierTypes.ISSN,
|
|
|
|
};
|
|
|
|
|
|
|
|
try {
|
|
|
|
const payload = await validator.validate(data);
|
|
|
|
assert.deepEqual(payload, data);
|
|
|
|
} catch {
|
|
|
|
assert.isTrue(false);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
test('validate invalid ISSN', async ({ assert }) => {
|
|
|
|
const validator = vine.compile(
|
|
|
|
vine.object({
|
|
|
|
reference: vine.string().validateReference({ typeField: 'type' }),
|
|
|
|
type: vine.enum(Object.values(ReferenceIdentifierTypes)),
|
2025-01-29 11:26:21 +01:00
|
|
|
}),
|
2025-01-24 17:11:10 +01:00
|
|
|
);
|
|
|
|
|
|
|
|
const data = {
|
|
|
|
reference: 'invalid-issn',
|
|
|
|
type: ReferenceIdentifierTypes.ISSN,
|
|
|
|
};
|
|
|
|
|
|
|
|
let payload = {};
|
|
|
|
try {
|
|
|
|
payload = await validator.validate(data);
|
|
|
|
} catch {
|
|
|
|
assert.notDeepEqual(payload, data);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
// test('validate invalid Handle', async ({ assert }) => {
|
|
|
|
// const validator = vine.compile(
|
|
|
|
// vine.object({
|
|
|
|
// reference: vine.string().validateReference({ typeField: 'type' }),
|
|
|
|
// type: vine.enum(Object.values(ReferenceIdentifierTypes)),
|
|
|
|
// })
|
|
|
|
// );
|
|
|
|
|
|
|
|
// const data = {
|
|
|
|
// reference: 'invalid-handle',
|
|
|
|
// type: ReferenceIdentifierTypes.Handle,
|
|
|
|
// };
|
|
|
|
|
|
|
|
// const result = await validator.validate(data);
|
|
|
|
// assert.isFalse(result.valid);
|
|
|
|
// });
|
|
|
|
|
|
|
|
// Add more tests for other reference types as needed
|
|
|
|
});
|