@dossierhq/integration-test
Version:
Integration test to ensure that different Dossier database adapters work as expected.
260 lines • 13.7 kB
JavaScript
/// <reference types="./PublishedEntityGetEntitySubSuite.d.ts" />
import { copyEntity, createRichText, createRichTextComponentNode, createRichTextHeadingNode, createRichTextTextNode, EntityStatus, ErrorType, isEntityNameAsRequested, Schema, } from '@dossierhq/core';
import { assertEquals, assertErrorResult, assertOkResult, assertResultValue, assertSame, assertTruthy, } from '../Asserts.js';
import { assertIsPublishedChangeValidations, assertIsPublishedComponents, assertIsPublishedLocationsComponent, assertIsPublishedRichTexts, assertIsPublishedStrings, assertIsPublishedTitleOnly, } from '../SchemaTypes.js';
import { adminToPublishedEntity, RICH_TEXTS_CREATE, STRINGS_CREATE, SUBJECT_ONLY_CREATE, TITLE_ONLY_CREATE, TITLE_ONLY_PUBLISHED_ENTITY, VALUE_ITEMS_CREATE, } from '../shared-entity/Fixtures.js';
import { createInvalidEntity } from '../shared-entity/InvalidEntityUtils.js';
export const GetEntitySubSuite = [
getEntity_withSubjectAuthKey,
getEntity_archivedThenPublished,
getEntity_oldVersion,
getEntity_entityAdminOnlyFieldIsExcluded,
getEntity_componentAdminOnlyFieldIsExcluded,
getEntity_componentAdminOnlyFieldInRichTextIsExcluded,
getEntity_usingUniqueIndex,
getEntity_invalidEntity,
getEntity_invalidEntityAdminOnlyComponent,
getEntity_invalidEntityAdminOnlyComponentList,
getEntity_invalidEntityAdminOnlyComponentInRichText,
getEntity_errorInvalidId,
getEntity_errorInvalidUniqueIndexValue,
getEntity_errorUniqueIndexValueFromAdminOnlyField,
getEntity_errorWrongAuthKey,
getEntity_errorWrongAuthKeyFromReadonlyRandom,
getEntity_errorArchivedEntity,
];
async function getEntity_withSubjectAuthKey({ clientProvider }) {
const client = clientProvider.dossierClient();
const publishedClient = clientProvider.publishedClient();
const schema = new Schema((await client.getSchemaSpecification()).valueOrThrow());
const createResult = await client.createEntity(SUBJECT_ONLY_CREATE, { publish: true });
assertOkResult(createResult);
const { entity: { id }, } = createResult.value;
const getResult = await publishedClient.getEntity({ id });
assertResultValue(getResult, adminToPublishedEntity(schema, createResult.value.entity));
}
async function getEntity_archivedThenPublished({ clientProvider }) {
const client = clientProvider.dossierClient();
const createResult = await client.createEntity(TITLE_ONLY_CREATE);
assertOkResult(createResult);
const { entity: { id, info: { name, createdAt, version }, }, } = createResult.value;
const archiveResult = await client.archiveEntity({ id });
assertOkResult(archiveResult);
const publishResult = await client.publishEntities([{ id, version }]);
assertOkResult(publishResult);
const getResult = await clientProvider.publishedClient().getEntity({ id });
assertOkResult(getResult);
assertIsPublishedTitleOnly(getResult.value);
assertEquals(getResult.value, copyEntity(TITLE_ONLY_PUBLISHED_ENTITY, { id, info: { name, createdAt } }));
}
async function getEntity_oldVersion({ clientProvider }) {
const client = clientProvider.dossierClient();
const createResult = await client.createEntity(copyEntity(TITLE_ONLY_CREATE, { info: { name: 'Original name' } }));
const { entity: { id, info: { createdAt }, fields: { title }, }, } = createResult.valueOrThrow();
const updateResult = await client.updateEntity({
id,
info: { name: 'Updated name' },
fields: { title: 'Updated title' },
});
assertOkResult(updateResult);
const publishResult = await client.publishEntities([{ id, version: 1 }]);
assertOkResult(publishResult);
const [{ updatedAt }] = publishResult.value;
assertResultValue(publishResult, [
{
id,
effect: 'published',
status: EntityStatus.modified,
updatedAt,
},
]);
const publishedEntity = (await clientProvider.publishedClient().getEntity({ id })).valueOrThrow();
const publishedName = publishedEntity.info.name;
assertTruthy(isEntityNameAsRequested(publishedName, 'Original name'));
assertEquals(publishedEntity, copyEntity(TITLE_ONLY_PUBLISHED_ENTITY, {
id,
info: { name: publishedName, createdAt },
fields: { title: title ?? '--no title--' },
}));
}
async function getEntity_entityAdminOnlyFieldIsExcluded({ clientProvider, }) {
const client = clientProvider.dossierClient();
const publishedClient = clientProvider.publishedClient();
const createResult = await client.createEntity(copyEntity(STRINGS_CREATE, {
fields: {
multiline: 'multiline\nmultiline',
stringAdminOnly: 'stringAdminOnly',
},
}), { publish: true });
const { entity: { id }, } = createResult.valueOrThrow();
const getResult = await publishedClient.getEntity({ id });
const entity = getResult.valueOrThrow();
assertIsPublishedStrings(entity);
assertEquals(entity.fields, {
multiline: 'multiline\nmultiline',
pattern: null,
patternList: null,
values: null,
valuesList: null,
unique: null,
uniqueGenericIndex: null,
});
assertEquals(entity.fields.stringAdminOnly, undefined);
}
async function getEntity_componentAdminOnlyFieldIsExcluded({ clientProvider, }) {
const client = clientProvider.dossierClient();
const publishedClient = clientProvider.publishedClient();
const adminLocationsComponent = {
type: 'LocationsComponent',
location: { lat: 12, lng: 34 },
locationAdminOnly: { lat: 56, lng: 78 },
};
const createResult = await client.createEntity(copyEntity(VALUE_ITEMS_CREATE, {
fields: { any: adminLocationsComponent },
}), { publish: true });
const { entity: { id }, } = createResult.valueOrThrow();
const getResult = await publishedClient.getEntity({ id });
const entity = getResult.valueOrThrow();
assertIsPublishedComponents(entity);
const publishedLocationsComponent = entity.fields.any;
assertTruthy(publishedLocationsComponent);
assertIsPublishedLocationsComponent(publishedLocationsComponent);
assertEquals(publishedLocationsComponent, {
type: 'LocationsComponent',
location: { lat: 12, lng: 34 },
});
assertEquals('locationAdminOnly' in publishedLocationsComponent, false);
}
async function getEntity_componentAdminOnlyFieldInRichTextIsExcluded({ clientProvider, }) {
const client = clientProvider.dossierClient();
const publishedClient = clientProvider.publishedClient();
const adminLocationsComponent = {
type: 'LocationsComponent',
location: { lat: 12, lng: 34 },
locationAdminOnly: { lat: 56, lng: 78 },
};
const createResult = await client.createEntity(copyEntity(RICH_TEXTS_CREATE, {
fields: {
richText: createRichText([createRichTextComponentNode(adminLocationsComponent)]),
},
}), { publish: true });
const { entity: { id }, } = createResult.valueOrThrow();
const getResult = await publishedClient.getEntity({ id });
const entity = getResult.valueOrThrow();
assertIsPublishedRichTexts(entity);
const componentNode = entity.fields.richText?.root.children[0];
assertTruthy(componentNode);
const publishedLocationsComponent = componentNode.data;
assertIsPublishedLocationsComponent(publishedLocationsComponent);
assertEquals(publishedLocationsComponent, {
type: 'LocationsComponent',
location: { lat: 12, lng: 34 },
});
assertEquals('locationAdminOnly' in publishedLocationsComponent, false);
}
async function getEntity_usingUniqueIndex({ clientProvider }) {
const client = clientProvider.dossierClient();
const schema = new Schema((await client.getSchemaSpecification()).valueOrThrow());
const unique = Math.random().toString();
const createResult = await client.createEntity(copyEntity(STRINGS_CREATE, { fields: { unique } }), { publish: true });
assertOkResult(createResult);
const getResult = await clientProvider.publishedClient().getEntity({
index: 'stringsUnique',
value: unique,
});
assertOkResult(getResult);
assertIsPublishedStrings(getResult.value);
assertEquals(getResult.value, adminToPublishedEntity(schema, copyEntity(createResult.value.entity, { info: { status: 'published' } })));
}
async function getEntity_invalidEntity({ clientProvider }) {
const client = clientProvider.dossierClient();
const publishedClient = clientProvider.publishedClient();
const { entity } = (await createInvalidEntity(client, { matchPattern: 'no match' }, { publish: true })).valueOrThrow();
const result = await publishedClient.getEntity({ id: entity.id });
assertOkResult(result);
assertSame(result.value.info.valid, false);
}
async function getEntity_invalidEntityAdminOnlyComponent({ clientProvider, }) {
const client = clientProvider.dossierClient();
const publishedClient = clientProvider.publishedClient();
const { entity } = (await createInvalidEntity(client, { component: { type: 'AdminOnlyComponent' } }, { publish: true })).valueOrThrow();
const publishedEntity = (await publishedClient.getEntity({ id: entity.id })).valueOrThrow();
assertIsPublishedChangeValidations(publishedEntity);
assertSame(publishedEntity.info.valid, false);
assertSame(publishedEntity.fields.component, null);
}
async function getEntity_invalidEntityAdminOnlyComponentList({ clientProvider, }) {
const client = clientProvider.dossierClient();
const publishedClient = clientProvider.publishedClient();
const { entity } = (await createInvalidEntity(client, { componentList: [{ type: 'AdminOnlyComponent' }] }, { publish: true })).valueOrThrow();
const publishedEntity = (await publishedClient.getEntity({ id: entity.id })).valueOrThrow();
assertIsPublishedChangeValidations(publishedEntity);
assertSame(publishedEntity.info.valid, false);
assertSame(publishedEntity.fields.componentList, null);
}
async function getEntity_invalidEntityAdminOnlyComponentInRichText({ clientProvider, }) {
const client = clientProvider.dossierClient();
const publishedClient = clientProvider.publishedClient();
const { entity } = (await createInvalidEntity(client, {
richText: createRichText([
createRichTextComponentNode({ type: 'AdminOnlyComponent' }),
createRichTextHeadingNode('h1', [createRichTextTextNode('After component')]),
]),
}, { publish: true })).valueOrThrow();
const publishedEntity = (await publishedClient.getEntity({ id: entity.id })).valueOrThrow();
assertIsPublishedChangeValidations(publishedEntity);
assertSame(publishedEntity.info.valid, false);
assertEquals(publishedEntity.fields.richText, createRichText([createRichTextHeadingNode('h1', [createRichTextTextNode('After component')])]));
}
async function getEntity_errorInvalidId({ clientProvider }) {
const publishedClient = clientProvider.publishedClient();
const result = await publishedClient.getEntity({ id: '13e4c7da-616e-44a3-a039-24f96f9b17da' });
assertErrorResult(result, ErrorType.NotFound, 'No such entity');
}
async function getEntity_errorInvalidUniqueIndexValue({ clientProvider, }) {
const publishedClient = clientProvider.publishedClient();
const result = await publishedClient.getEntity({
index: 'unknown-index',
value: 'unknown-value',
});
assertErrorResult(result, ErrorType.NotFound, 'No such entity');
}
async function getEntity_errorUniqueIndexValueFromAdminOnlyField({ clientProvider, }) {
const client = clientProvider.dossierClient();
const publishedClient = clientProvider.publishedClient();
const unique = Math.random().toString();
const createResult = await client.createEntity(copyEntity(STRINGS_CREATE, {
fields: { uniqueAdminOnly: unique },
}), { publish: true });
assertOkResult(createResult);
const result = await publishedClient.getEntity({ index: 'stringsUnique', value: unique });
assertErrorResult(result, ErrorType.NotFound, 'No such entity');
}
async function getEntity_errorWrongAuthKey({ clientProvider }) {
const createResult = await clientProvider
.dossierClient()
.createEntity(SUBJECT_ONLY_CREATE, { publish: true });
assertOkResult(createResult);
const { entity: { id }, } = createResult.value;
const getResult = await clientProvider.publishedClient('secondary').getEntity({ id });
assertErrorResult(getResult, ErrorType.NotAuthorized, 'Wrong authKey provided');
}
async function getEntity_errorWrongAuthKeyFromReadonlyRandom({ clientProvider, }) {
const { entity } = (await clientProvider.dossierClient().createEntity(SUBJECT_ONLY_CREATE, { publish: true })).valueOrThrow();
const getResult = await clientProvider
.publishedClient('random', 'readonly')
.getEntity({ id: entity.id });
assertErrorResult(getResult, ErrorType.NotAuthorized, 'Wrong authKey provided');
}
async function getEntity_errorArchivedEntity({ clientProvider }) {
const client = clientProvider.dossierClient();
const publishedClient = clientProvider.publishedClient();
const createResult = await client.createEntity(TITLE_ONLY_CREATE);
assertOkResult(createResult);
const { entity: { id }, } = createResult.value;
const archiveResult = await client.archiveEntity({ id });
assertOkResult(archiveResult);
const result = await publishedClient.getEntity({ id });
assertErrorResult(result, ErrorType.NotFound, 'No such entity');
}
//# sourceMappingURL=PublishedEntityGetEntitySubSuite.js.map