Activate v2 default seed (#14660)
## Introduction After enabling flag by default got following errors: ```ts Test Suites: 48 failed, 1 skipped, 97 passed, 145 of 146 total Tests: 499 failed, 1 skipped, 644 passed, 1144 total Snapshots: 61 failed, 133 passed, 194 total Time: 363.226 s Ran all test suites. ``` ## From <img width="2952" height="1510" alt="image" src="https://github.com/user-attachments/assets/7e3b20c6-2552-40a7-90bb-2d7b3002c895" /> ## To <img width="3134" height="1510" alt="image" src="https://github.com/user-attachments/assets/4fc9ada4-3c14-4333-a1db-11daf87db8d6" /> There's a huge test bundle in the latest shard that we could split up ## Notes - Set as failing morph relation field rename as for the moment we do not handle relation field mutation - fixed the object update and creation validation adding label identifier field metadata id checks - and more Some integrations tests are still on the v1 ( they have before and after all disabling and re-enabling the flat ) but mainly we now have more coverage on the v2 than the v1. Mainly related records, uniqueness have to be migrated the v2 and so tests too
This commit is contained in:
Vendored
+7
-14
@@ -8,11 +8,7 @@
|
|||||||
"runtimeVersion": "24.5",
|
"runtimeVersion": "24.5",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"runtimeExecutable": "npx",
|
"runtimeExecutable": "npx",
|
||||||
"runtimeArgs": [
|
"runtimeArgs": ["nx", "run", "twenty-server:start"],
|
||||||
"nx",
|
|
||||||
"run",
|
|
||||||
"twenty-server:start"
|
|
||||||
],
|
|
||||||
"outputCapture": "std",
|
"outputCapture": "std",
|
||||||
"internalConsoleOptions": "openOnSessionStart",
|
"internalConsoleOptions": "openOnSessionStart",
|
||||||
"console": "internalConsole",
|
"console": "internalConsole",
|
||||||
@@ -23,11 +19,7 @@
|
|||||||
"type": "node",
|
"type": "node",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"runtimeExecutable": "npx",
|
"runtimeExecutable": "npx",
|
||||||
"runtimeArgs": [
|
"runtimeArgs": ["nx", "run", "twenty-server:worker"],
|
||||||
"nx",
|
|
||||||
"run",
|
|
||||||
"twenty-server:worker"
|
|
||||||
],
|
|
||||||
"outputCapture": "std",
|
"outputCapture": "std",
|
||||||
"internalConsoleOptions": "openOnSessionStart",
|
"internalConsoleOptions": "openOnSessionStart",
|
||||||
"console": "internalConsole",
|
"console": "internalConsole",
|
||||||
@@ -74,14 +66,15 @@
|
|||||||
"--",
|
"--",
|
||||||
"--config",
|
"--config",
|
||||||
"./jest-integration.config.ts",
|
"./jest-integration.config.ts",
|
||||||
"${relativeFile}"
|
"${relativeFile}",
|
||||||
|
"--testTimeout=0"
|
||||||
],
|
],
|
||||||
"cwd": "${workspaceFolder}/packages/twenty-server",
|
"cwd": "${workspaceFolder}/packages/twenty-server",
|
||||||
"console": "integratedTerminal",
|
"console": "integratedTerminal",
|
||||||
"internalConsoleOptions": "neverOpen",
|
"internalConsoleOptions": "neverOpen",
|
||||||
"env": {
|
"env": {
|
||||||
"NODE_ENV": "test"
|
"NODE_ENV": "test"
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "node",
|
"type": "node",
|
||||||
@@ -102,7 +95,7 @@
|
|||||||
"internalConsoleOptions": "neverOpen",
|
"internalConsoleOptions": "neverOpen",
|
||||||
"env": {
|
"env": {
|
||||||
"NODE_ENV": "test"
|
"NODE_ENV": "test"
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,9 +27,13 @@ rawDataSource
|
|||||||
);
|
);
|
||||||
|
|
||||||
await performQuery(
|
await performQuery(
|
||||||
`CREATE OR REPLACE FUNCTION unaccent_immutable(text) RETURNS text AS $$
|
`CREATE OR REPLACE FUNCTION public.unaccent_immutable(input text)
|
||||||
SELECT public.unaccent($1)
|
RETURNS text
|
||||||
$$ LANGUAGE sql IMMUTABLE;`,
|
LANGUAGE sql
|
||||||
|
IMMUTABLE
|
||||||
|
AS $$
|
||||||
|
SELECT public.unaccent('public.unaccent'::regdictionary, input)
|
||||||
|
$$;`,
|
||||||
'create immutable unaccent wrapper function',
|
'create immutable unaccent wrapper function',
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
+1
@@ -3,5 +3,6 @@ import { type FlatView } from 'src/engine/core-modules/view/flat-view/types/flat
|
|||||||
|
|
||||||
export const FLAT_VIEW_PROPERTIES_TO_COMPARE = [
|
export const FLAT_VIEW_PROPERTIES_TO_COMPARE = [
|
||||||
'key',
|
'key',
|
||||||
|
'deletedAt',
|
||||||
...FLAT_VIEW_EDITABLE_PROPERTIES,
|
...FLAT_VIEW_EDITABLE_PROPERTIES,
|
||||||
] as const satisfies (keyof FlatView)[];
|
] as const satisfies (keyof FlatView)[];
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import { isDefined } from 'twenty-shared/utils';
|
|||||||
|
|
||||||
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
||||||
import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service';
|
import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service';
|
||||||
|
import { I18nService } from 'src/engine/core-modules/i18n/i18n.service';
|
||||||
import { type I18nContext } from 'src/engine/core-modules/i18n/types/i18n-context.type';
|
import { type I18nContext } from 'src/engine/core-modules/i18n/types/i18n-context.type';
|
||||||
import { CreateViewInput } from 'src/engine/core-modules/view/dtos/inputs/create-view.input';
|
import { CreateViewInput } from 'src/engine/core-modules/view/dtos/inputs/create-view.input';
|
||||||
import { UpdateViewInput } from 'src/engine/core-modules/view/dtos/inputs/update-view.input';
|
import { UpdateViewInput } from 'src/engine/core-modules/view/dtos/inputs/update-view.input';
|
||||||
@@ -36,7 +37,6 @@ import { type IDataloaders } from 'src/engine/dataloaders/dataloader.interface';
|
|||||||
import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator';
|
import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator';
|
||||||
import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard';
|
import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard';
|
||||||
import { resolveObjectMetadataStandardOverride } from 'src/engine/metadata-modules/object-metadata/utils/resolve-object-metadata-standard-override.util';
|
import { resolveObjectMetadataStandardOverride } from 'src/engine/metadata-modules/object-metadata/utils/resolve-object-metadata-standard-override.util';
|
||||||
import { I18nService } from 'src/engine/core-modules/i18n/i18n.service';
|
|
||||||
|
|
||||||
@Resolver(() => ViewDTO)
|
@Resolver(() => ViewDTO)
|
||||||
@UseFilters(ViewGraphqlApiExceptionFilter)
|
@UseFilters(ViewGraphqlApiExceptionFilter)
|
||||||
@@ -161,7 +161,7 @@ export class ViewResolver {
|
|||||||
|
|
||||||
if (isWorkspaceMigrationV2Enabled) {
|
if (isWorkspaceMigrationV2Enabled) {
|
||||||
return await this.viewV2Service.updateOne({
|
return await this.viewV2Service.updateOne({
|
||||||
updateViewInput: input,
|
updateViewInput: { ...input, id },
|
||||||
workspaceId: workspace.id,
|
workspaceId: workspace.id,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -281,17 +281,6 @@ export class ViewV2Service {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const { flatViewMaps: recomputedExistingFlatViewMaps } =
|
return flatViewFromDestroyInput;
|
||||||
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
|
|
||||||
{
|
|
||||||
workspaceId,
|
|
||||||
flatEntities: ['flatViewMaps'],
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
return findFlatEntityByIdInFlatEntityMapsOrThrow({
|
|
||||||
flatEntityId: destroyViewInput.id,
|
|
||||||
flatEntityMaps: recomputedExistingFlatViewMaps,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -337,7 +337,6 @@ export class DataloaderService {
|
|||||||
>(async (dataLoaderParams: IndexFieldMetadataLoaderPayload[]) => {
|
>(async (dataLoaderParams: IndexFieldMetadataLoaderPayload[]) => {
|
||||||
const workspaceId = dataLoaderParams[0].workspaceId;
|
const workspaceId = dataLoaderParams[0].workspaceId;
|
||||||
|
|
||||||
// This computes the old cache :thinking:
|
|
||||||
const { objectMetadataMaps } =
|
const { objectMetadataMaps } =
|
||||||
await this.workspaceMetadataCacheService.getExistingOrRecomputeMetadataMaps(
|
await this.workspaceMetadataCacheService.getExistingOrRecomputeMetadataMaps(
|
||||||
{ workspaceId },
|
{ workspaceId },
|
||||||
|
|||||||
+2
-2
@@ -381,9 +381,9 @@ export class FieldMetadataServiceV2 {
|
|||||||
|
|
||||||
return this.fieldMetadataRepository.find({
|
return this.fieldMetadataRepository.find({
|
||||||
where: {
|
where: {
|
||||||
name: In(
|
id: In(
|
||||||
allTranspiledTranspilationInputs.map(
|
allTranspiledTranspilationInputs.map(
|
||||||
({ result: { flatFieldMetadatas } }) => flatFieldMetadatas[0].name,
|
({ result: { flatFieldMetadatas } }) => flatFieldMetadatas[0].id,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
workspaceId,
|
workspaceId,
|
||||||
|
|||||||
+1
-18
@@ -1,16 +1,13 @@
|
|||||||
import diff from 'microdiff';
|
import diff from 'microdiff';
|
||||||
import { type FromTo } from 'twenty-shared/types';
|
import { type FromTo } from 'twenty-shared/types';
|
||||||
import { isDefined, parseJson } from 'twenty-shared/utils';
|
import { parseJson } from 'twenty-shared/utils';
|
||||||
|
|
||||||
import { FLAT_FIELD_METADATA_JSONB_PROPERTIES } from 'src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-jsonb-properties.constant';
|
import { FLAT_FIELD_METADATA_JSONB_PROPERTIES } from 'src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-jsonb-properties.constant';
|
||||||
import { FLAT_FIELD_METADATA_PROPERTIES_TO_COMPARE } from 'src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-properties-to-compare.constant';
|
import { FLAT_FIELD_METADATA_PROPERTIES_TO_COMPARE } from 'src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-properties-to-compare.constant';
|
||||||
import { FLAT_FIELD_METADATA_RELATION_PROPERTIES_TO_COMPARE } from 'src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-relation-properties-to-compare.constant';
|
|
||||||
import { type FlatFieldMetadataPropertiesToCompare } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-properties-to-compare.type';
|
import { type FlatFieldMetadataPropertiesToCompare } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-properties-to-compare.type';
|
||||||
import { type FlatFieldMetadataRelationPropertiesToCompare } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-relation-properties-to-compare.type';
|
|
||||||
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
|
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
|
||||||
import { isFlatFieldMetadataJsonbProperty } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-jsonb-property.util';
|
import { isFlatFieldMetadataJsonbProperty } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-jsonb-property.util';
|
||||||
import { isStandardMetadata } from 'src/engine/metadata-modules/utils/is-standard-metadata.util';
|
import { isStandardMetadata } from 'src/engine/metadata-modules/utils/is-standard-metadata.util';
|
||||||
import { isMorphOrRelationFieldMetadataType } from 'src/engine/utils/is-morph-or-relation-field-metadata-type.util';
|
|
||||||
import { type UpdateFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2';
|
import { type UpdateFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2';
|
||||||
import { transformMetadataForComparison } from 'src/engine/workspace-manager/workspace-sync-metadata/comparators/utils/transform-metadata-for-comparison.util';
|
import { transformMetadataForComparison } from 'src/engine/workspace-manager/workspace-sync-metadata/comparators/utils/transform-metadata-for-comparison.util';
|
||||||
|
|
||||||
@@ -38,20 +35,6 @@ export const compareTwoFlatFieldMetadata = ({
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove below assertion when we authorize relation edition, see https://github.com/twentyhq/twenty/commit/39f6f3c4bb101272a9014e142a842d0801a3c33b
|
|
||||||
const isMorphOrRelationFieldType =
|
|
||||||
isDefined(fieldMetadata.type) &&
|
|
||||||
isMorphOrRelationFieldMetadataType(fieldMetadata.type);
|
|
||||||
|
|
||||||
if (
|
|
||||||
isMorphOrRelationFieldType &&
|
|
||||||
!FLAT_FIELD_METADATA_RELATION_PROPERTIES_TO_COMPARE.includes(
|
|
||||||
property as FlatFieldMetadataRelationPropertiesToCompare,
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
if (
|
||||||
isStandardMetadata(fieldMetadata) &&
|
isStandardMetadata(fieldMetadata) &&
|
||||||
property !== 'standardOverrides'
|
property !== 'standardOverrides'
|
||||||
|
|||||||
+1
-1
@@ -42,7 +42,7 @@ export const validateRelationCreationPayload = async ({
|
|||||||
status: 'fail',
|
status: 'fail',
|
||||||
error: {
|
error: {
|
||||||
code: FieldMetadataExceptionCode.FIELD_METADATA_RELATION_MALFORMED,
|
code: FieldMetadataExceptionCode.FIELD_METADATA_RELATION_MALFORMED,
|
||||||
message: `Relation creation payload is invalid ${JSON.stringify(relationCreationPayload)}`,
|
message: `Relation creation payload is invalid`,
|
||||||
userFriendlyMessage: t`Invalid relation creation payload`,
|
userFriendlyMessage: t`Invalid relation creation payload`,
|
||||||
value: relationCreationPayload,
|
value: relationCreationPayload,
|
||||||
},
|
},
|
||||||
|
|||||||
+61
-1
@@ -1,7 +1,10 @@
|
|||||||
import { Injectable } from '@nestjs/common';
|
import { Injectable } from '@nestjs/common';
|
||||||
|
|
||||||
import { t } from '@lingui/core/macro';
|
import { t } from '@lingui/core/macro';
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import {
|
||||||
|
isDefined,
|
||||||
|
isLabelIdentifierFieldMetadataTypes,
|
||||||
|
} from 'twenty-shared/utils';
|
||||||
|
|
||||||
import { FlatFieldMetadataValidatorService } from 'src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-validator.service';
|
import { FlatFieldMetadataValidatorService } from 'src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-validator.service';
|
||||||
import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
|
import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
|
||||||
@@ -73,6 +76,12 @@ export class FlatObjectMetadataValidatorService {
|
|||||||
...validateFlatObjectMetadataIdentifiers(existingFlatObjectMetadata),
|
...validateFlatObjectMetadataIdentifiers(existingFlatObjectMetadata),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
validationResult.errors.push(
|
||||||
|
...this.validateFlatObjectMetadataLabelIdentifierFieldMetadataId({
|
||||||
|
flatObjectMetadata: updatedFlatObjectMetadata,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
return validationResult;
|
return validationResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,6 +197,12 @@ export class FlatObjectMetadataValidatorService {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
objectValidationResult.errors.push(
|
||||||
|
...this.validateFlatObjectMetadataLabelIdentifierFieldMetadataId({
|
||||||
|
flatObjectMetadata: flatObjectMetadataToValidate,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
objectValidationResult.errors.push(
|
objectValidationResult.errors.push(
|
||||||
...this.validateFlatObjectMetadataNameAndLabels({
|
...this.validateFlatObjectMetadataNameAndLabels({
|
||||||
existingFlatObjectMetadataMaps,
|
existingFlatObjectMetadataMaps,
|
||||||
@@ -295,4 +310,49 @@ export class FlatObjectMetadataValidatorService {
|
|||||||
|
|
||||||
return errors;
|
return errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private validateFlatObjectMetadataLabelIdentifierFieldMetadataId({
|
||||||
|
flatObjectMetadata,
|
||||||
|
}: {
|
||||||
|
flatObjectMetadata: FlatObjectMetadata;
|
||||||
|
}) {
|
||||||
|
const errors: FlatObjectMetadataValidationError[] = [];
|
||||||
|
|
||||||
|
if (!isDefined(flatObjectMetadata.labelIdentifierFieldMetadataId)) {
|
||||||
|
errors.push({
|
||||||
|
code: ObjectMetadataExceptionCode.MISSING_CUSTOM_OBJECT_DEFAULT_LABEL_IDENTIFIER_FIELD,
|
||||||
|
message: t`Label identifier field metadata is required`,
|
||||||
|
userFriendlyMessage: t`Label identifier field metadata is required`,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const relatedFlatFieldMetadata =
|
||||||
|
flatObjectMetadata.flatFieldMetadatas.find(
|
||||||
|
(flatFieldMetadata) =>
|
||||||
|
flatFieldMetadata.id ===
|
||||||
|
flatObjectMetadata.labelIdentifierFieldMetadataId,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!relatedFlatFieldMetadata) {
|
||||||
|
errors.push({
|
||||||
|
code: ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT,
|
||||||
|
message: t`Label identifier field metadata not found in field metadata list`,
|
||||||
|
userFriendlyMessage: t`Label identifier field metadata not found in field metadata list`,
|
||||||
|
value: flatObjectMetadata.labelIdentifierFieldMetadataId,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
if (
|
||||||
|
!isLabelIdentifierFieldMetadataTypes(relatedFlatFieldMetadata.type)
|
||||||
|
) {
|
||||||
|
errors.push({
|
||||||
|
code: ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT,
|
||||||
|
message: t`Label identifier field metadata must be a TEXT or FULL_NAME field type`,
|
||||||
|
userFriendlyMessage: t`Label identifier field metadata must be a TEXT or FULL_NAME field type`,
|
||||||
|
value: relatedFlatFieldMetadata.type,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return errors;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -68,7 +68,7 @@ export const fromDeleteObjectInputToFlatFieldMetadatasToDelete = ({
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
// We should maintain a idsByObjectMetadataId maps in the index
|
// TODO We should maintain a idsByObjectMetadataId in the flatIndexMaps
|
||||||
const flatIndexMetadataToDelete = Object.values(
|
const flatIndexMetadataToDelete = Object.values(
|
||||||
existingFlatIndexMaps.byId,
|
existingFlatIndexMaps.byId,
|
||||||
).filter(
|
).filter(
|
||||||
|
|||||||
+1
-1
@@ -37,7 +37,7 @@ type RenameRelatedMorphFieldOnObjectNamesUpdateArgs = FromTo<
|
|||||||
> & {
|
> & {
|
||||||
existingFlatObjectMetadataMaps: FlatObjectMetadataMaps;
|
existingFlatObjectMetadataMaps: FlatObjectMetadataMaps;
|
||||||
};
|
};
|
||||||
// We should recompute each index here too ? YES TODO prastoin
|
// TODO We should recompute each index here too
|
||||||
export const renameRelatedMorphFieldOnObjectNamesUpdate = ({
|
export const renameRelatedMorphFieldOnObjectNamesUpdate = ({
|
||||||
fromFlatObjectMetadata,
|
fromFlatObjectMetadata,
|
||||||
existingFlatObjectMetadataMaps,
|
existingFlatObjectMetadataMaps,
|
||||||
|
|||||||
+2
-14
@@ -76,18 +76,6 @@ export class ObjectMetadataServiceV2 {
|
|||||||
flatIndexMaps: existingFlatIndexMaps,
|
flatIndexMaps: existingFlatIndexMaps,
|
||||||
});
|
});
|
||||||
|
|
||||||
const impactedObjectMetadataIds = [
|
|
||||||
...new Set([
|
|
||||||
optimisticallyUpdatedFlatObjectMetadata.id,
|
|
||||||
...otherObjectFlatFieldMetadatas.map(
|
|
||||||
(flatFieldMetadata) => flatFieldMetadata.objectMetadataId,
|
|
||||||
),
|
|
||||||
]),
|
|
||||||
];
|
|
||||||
const fromFlatObjectMetadataMaps = getSubFlatObjectMetadataMapsOrThrow({
|
|
||||||
flatObjectMetadataMaps: existingFlatObjectMetadataMaps,
|
|
||||||
objectMetadataIds: impactedObjectMetadataIds,
|
|
||||||
});
|
|
||||||
const toFlatObjectMetadataMaps = otherObjectFlatFieldMetadatas.reduce(
|
const toFlatObjectMetadataMaps = otherObjectFlatFieldMetadatas.reduce(
|
||||||
(flatObjectMetadataMaps, flatFieldMetadata) =>
|
(flatObjectMetadataMaps, flatFieldMetadata) =>
|
||||||
replaceFlatFieldMetadataInFlatObjectMetadataMapsOrThrow({
|
replaceFlatFieldMetadataInFlatObjectMetadataMapsOrThrow({
|
||||||
@@ -96,7 +84,7 @@ export class ObjectMetadataServiceV2 {
|
|||||||
}),
|
}),
|
||||||
replaceFlatObjectMetadataInFlatObjectMetadataMapsOrThrow({
|
replaceFlatObjectMetadataInFlatObjectMetadataMapsOrThrow({
|
||||||
flatObjectMetadata: optimisticallyUpdatedFlatObjectMetadata,
|
flatObjectMetadata: optimisticallyUpdatedFlatObjectMetadata,
|
||||||
flatObjectMetadataMaps: fromFlatObjectMetadataMaps,
|
flatObjectMetadataMaps: existingFlatObjectMetadataMaps,
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -114,7 +102,7 @@ export class ObjectMetadataServiceV2 {
|
|||||||
{
|
{
|
||||||
fromToAllFlatEntityMaps: {
|
fromToAllFlatEntityMaps: {
|
||||||
flatObjectMetadataMaps: {
|
flatObjectMetadataMaps: {
|
||||||
from: fromFlatObjectMetadataMaps,
|
from: existingFlatObjectMetadataMaps,
|
||||||
to: toFlatObjectMetadataMaps,
|
to: toFlatObjectMetadataMaps,
|
||||||
},
|
},
|
||||||
flatIndexMaps: {
|
flatIndexMaps: {
|
||||||
|
|||||||
+1
-1
@@ -53,7 +53,7 @@ export const seedFeatureFlags = async (
|
|||||||
{
|
{
|
||||||
key: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
key: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
workspaceId: workspaceId,
|
workspaceId: workspaceId,
|
||||||
value: false,
|
value: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: FeatureFlagKey.IS_PAGE_LAYOUT_ENABLED,
|
key: FeatureFlagKey.IS_PAGE_LAYOUT_ENABLED,
|
||||||
|
|||||||
+2
-1
@@ -83,7 +83,8 @@ export const serializeDefaultValueV2 = ({
|
|||||||
return `ARRAY[${arrayValues}]${castSuffix}[]`;
|
return `ARRAY[${arrayValues}]${castSuffix}[]`;
|
||||||
}
|
}
|
||||||
|
|
||||||
return sanitizeAndAddCastPrefix(`'${JSON.stringify(defaultValue)}'`); // Won't work :thinking: at all will remove every brackets and so on
|
// Default value for objects won't work with sanitization here
|
||||||
|
return sanitizeAndAddCastPrefix(`'${JSON.stringify(defaultValue)}'`);
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
throw new FieldMetadataException(
|
throw new FieldMetadataException(
|
||||||
|
|||||||
+14
@@ -5,11 +5,21 @@ import { createManyOperationFactory } from 'test/integration/graphql/utils/creat
|
|||||||
import { makeGraphqlAPIRequestWithApiKey } from 'test/integration/graphql/utils/make-graphql-api-request-with-api-key.util';
|
import { makeGraphqlAPIRequestWithApiKey } from 'test/integration/graphql/utils/make-graphql-api-request-with-api-key.util';
|
||||||
import { makeGraphqlAPIRequestWithGuestRole } from 'test/integration/graphql/utils/make-graphql-api-request-with-guest-role.util';
|
import { makeGraphqlAPIRequestWithGuestRole } from 'test/integration/graphql/utils/make-graphql-api-request-with-guest-role.util';
|
||||||
import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util';
|
import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util';
|
||||||
|
import { deleteRecordsByIds } from 'test/integration/utils/delete-records-by-ids';
|
||||||
|
|
||||||
import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
|
import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
|
||||||
import { PermissionsExceptionMessage } from 'src/engine/metadata-modules/permissions/permissions.exception';
|
import { PermissionsExceptionMessage } from 'src/engine/metadata-modules/permissions/permissions.exception';
|
||||||
|
|
||||||
describe('createManyObjectRecordsPermissions', () => {
|
describe('createManyObjectRecordsPermissions', () => {
|
||||||
|
let createdPersonIds: string[] = [];
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
if (createdPersonIds.length > 0) {
|
||||||
|
await deleteRecordsByIds('person', createdPersonIds);
|
||||||
|
createdPersonIds = [];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
it('should throw a permission error when user does not have permission (guest role)', async () => {
|
it('should throw a permission error when user does not have permission (guest role)', async () => {
|
||||||
const graphqlOperation = createManyOperationFactory({
|
const graphqlOperation = createManyOperationFactory({
|
||||||
objectMetadataSingularName: 'person',
|
objectMetadataSingularName: 'person',
|
||||||
@@ -55,6 +65,8 @@ describe('createManyObjectRecordsPermissions', () => {
|
|||||||
|
|
||||||
const response = await makeGraphqlAPIRequest(graphqlOperation);
|
const response = await makeGraphqlAPIRequest(graphqlOperation);
|
||||||
|
|
||||||
|
createdPersonIds.push(personId1, personId2);
|
||||||
|
|
||||||
expect(response.body.data).toBeDefined();
|
expect(response.body.data).toBeDefined();
|
||||||
expect(response.body.data.createPeople).toBeDefined();
|
expect(response.body.data.createPeople).toBeDefined();
|
||||||
expect(response.body.data.createPeople).toHaveLength(2);
|
expect(response.body.data.createPeople).toHaveLength(2);
|
||||||
@@ -88,6 +100,8 @@ describe('createManyObjectRecordsPermissions', () => {
|
|||||||
|
|
||||||
const response = await makeGraphqlAPIRequestWithApiKey(graphqlOperation);
|
const response = await makeGraphqlAPIRequestWithApiKey(graphqlOperation);
|
||||||
|
|
||||||
|
createdPersonIds.push(personId1, personId2);
|
||||||
|
|
||||||
expect(response.body.data).toBeDefined();
|
expect(response.body.data).toBeDefined();
|
||||||
expect(response.body.data.createPeople).toBeDefined();
|
expect(response.body.data.createPeople).toBeDefined();
|
||||||
expect(response.body.data.createPeople).toHaveLength(2);
|
expect(response.body.data.createPeople).toHaveLength(2);
|
||||||
|
|||||||
+14
@@ -5,11 +5,21 @@ import { createOneOperationFactory } from 'test/integration/graphql/utils/create
|
|||||||
import { makeGraphqlAPIRequestWithApiKey } from 'test/integration/graphql/utils/make-graphql-api-request-with-api-key.util';
|
import { makeGraphqlAPIRequestWithApiKey } from 'test/integration/graphql/utils/make-graphql-api-request-with-api-key.util';
|
||||||
import { makeGraphqlAPIRequestWithGuestRole } from 'test/integration/graphql/utils/make-graphql-api-request-with-guest-role.util';
|
import { makeGraphqlAPIRequestWithGuestRole } from 'test/integration/graphql/utils/make-graphql-api-request-with-guest-role.util';
|
||||||
import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util';
|
import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util';
|
||||||
|
import { deleteRecordsByIds } from 'test/integration/utils/delete-records-by-ids';
|
||||||
|
|
||||||
import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
|
import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
|
||||||
import { PermissionsExceptionMessage } from 'src/engine/metadata-modules/permissions/permissions.exception';
|
import { PermissionsExceptionMessage } from 'src/engine/metadata-modules/permissions/permissions.exception';
|
||||||
|
|
||||||
describe('createOneObjectRecordsPermissions', () => {
|
describe('createOneObjectRecordsPermissions', () => {
|
||||||
|
let createdPersonIds: string[] = [];
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
if (createdPersonIds.length > 0) {
|
||||||
|
await deleteRecordsByIds('person', createdPersonIds);
|
||||||
|
createdPersonIds = [];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
it('should throw a permission error when user does not have permission (guest role)', async () => {
|
it('should throw a permission error when user does not have permission (guest role)', async () => {
|
||||||
const graphqlOperation = createOneOperationFactory({
|
const graphqlOperation = createOneOperationFactory({
|
||||||
objectMetadataSingularName: 'person',
|
objectMetadataSingularName: 'person',
|
||||||
@@ -41,6 +51,8 @@ describe('createOneObjectRecordsPermissions', () => {
|
|||||||
|
|
||||||
const response = await makeGraphqlAPIRequest(graphqlOperation);
|
const response = await makeGraphqlAPIRequest(graphqlOperation);
|
||||||
|
|
||||||
|
createdPersonIds.push(personId);
|
||||||
|
|
||||||
expect(response.body.data).toBeDefined();
|
expect(response.body.data).toBeDefined();
|
||||||
expect(response.body.data.createPerson).toBeDefined();
|
expect(response.body.data.createPerson).toBeDefined();
|
||||||
expect(response.body.data.createPerson.id).toBe(personId);
|
expect(response.body.data.createPerson.id).toBe(personId);
|
||||||
@@ -58,6 +70,8 @@ describe('createOneObjectRecordsPermissions', () => {
|
|||||||
|
|
||||||
const response = await makeGraphqlAPIRequestWithApiKey(graphqlOperation);
|
const response = await makeGraphqlAPIRequestWithApiKey(graphqlOperation);
|
||||||
|
|
||||||
|
createdPersonIds.push(personId);
|
||||||
|
|
||||||
expect(response.body.data).toBeDefined();
|
expect(response.body.data).toBeDefined();
|
||||||
expect(response.body.data.createPerson).toBeDefined();
|
expect(response.body.data.createPerson).toBeDefined();
|
||||||
expect(response.body.data.createPerson.id).toBe(personId);
|
expect(response.body.data.createPerson.id).toBe(personId);
|
||||||
|
|||||||
+12
@@ -6,11 +6,21 @@ import { deleteManyOperationFactory } from 'test/integration/graphql/utils/delet
|
|||||||
import { makeGraphqlAPIRequestWithApiKey } from 'test/integration/graphql/utils/make-graphql-api-request-with-api-key.util';
|
import { makeGraphqlAPIRequestWithApiKey } from 'test/integration/graphql/utils/make-graphql-api-request-with-api-key.util';
|
||||||
import { makeGraphqlAPIRequestWithGuestRole } from 'test/integration/graphql/utils/make-graphql-api-request-with-guest-role.util';
|
import { makeGraphqlAPIRequestWithGuestRole } from 'test/integration/graphql/utils/make-graphql-api-request-with-guest-role.util';
|
||||||
import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util';
|
import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util';
|
||||||
|
import { deleteRecordsByIds } from 'test/integration/utils/delete-records-by-ids';
|
||||||
|
|
||||||
import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
|
import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
|
||||||
import { PermissionsExceptionMessage } from 'src/engine/metadata-modules/permissions/permissions.exception';
|
import { PermissionsExceptionMessage } from 'src/engine/metadata-modules/permissions/permissions.exception';
|
||||||
|
|
||||||
describe('deleteManyObjectRecordsPermissions', () => {
|
describe('deleteManyObjectRecordsPermissions', () => {
|
||||||
|
let createdPersonIds: string[] = [];
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
if (createdPersonIds.length > 0) {
|
||||||
|
await deleteRecordsByIds('person', createdPersonIds);
|
||||||
|
createdPersonIds = [];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
it('should throw a permission error when user does not have permission (guest role)', async () => {
|
it('should throw a permission error when user does not have permission (guest role)', async () => {
|
||||||
const graphqlOperation = deleteManyOperationFactory({
|
const graphqlOperation = deleteManyOperationFactory({
|
||||||
objectMetadataSingularName: 'person',
|
objectMetadataSingularName: 'person',
|
||||||
@@ -52,6 +62,7 @@ describe('deleteManyObjectRecordsPermissions', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
await makeGraphqlAPIRequest(createGraphqlOperation);
|
await makeGraphqlAPIRequest(createGraphqlOperation);
|
||||||
|
createdPersonIds.push(personId1, personId2);
|
||||||
|
|
||||||
const deleteGraphqlOperation = deleteManyOperationFactory({
|
const deleteGraphqlOperation = deleteManyOperationFactory({
|
||||||
objectMetadataSingularName: 'person',
|
objectMetadataSingularName: 'person',
|
||||||
@@ -96,6 +107,7 @@ describe('deleteManyObjectRecordsPermissions', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
await makeGraphqlAPIRequest(createGraphqlOperation);
|
await makeGraphqlAPIRequest(createGraphqlOperation);
|
||||||
|
createdPersonIds.push(personId1, personId2);
|
||||||
|
|
||||||
const deleteGraphqlOperation = deleteManyOperationFactory({
|
const deleteGraphqlOperation = deleteManyOperationFactory({
|
||||||
objectMetadataSingularName: 'person',
|
objectMetadataSingularName: 'person',
|
||||||
|
|||||||
+13
@@ -6,11 +6,21 @@ import { makeGraphqlAPIRequestWithApiKey } from 'test/integration/graphql/utils/
|
|||||||
import { makeGraphqlAPIRequestWithGuestRole } from 'test/integration/graphql/utils/make-graphql-api-request-with-guest-role.util';
|
import { makeGraphqlAPIRequestWithGuestRole } from 'test/integration/graphql/utils/make-graphql-api-request-with-guest-role.util';
|
||||||
import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util';
|
import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util';
|
||||||
import { updateManyOperationFactory } from 'test/integration/graphql/utils/update-many-operation-factory.util';
|
import { updateManyOperationFactory } from 'test/integration/graphql/utils/update-many-operation-factory.util';
|
||||||
|
import { deleteRecordsByIds } from 'test/integration/utils/delete-records-by-ids';
|
||||||
|
|
||||||
import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
|
import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
|
||||||
import { PermissionsExceptionMessage } from 'src/engine/metadata-modules/permissions/permissions.exception';
|
import { PermissionsExceptionMessage } from 'src/engine/metadata-modules/permissions/permissions.exception';
|
||||||
|
|
||||||
describe('updateManyObjectRecordsPermissions', () => {
|
describe('updateManyObjectRecordsPermissions', () => {
|
||||||
|
let createdPersonIds: string[] = [];
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
if (createdPersonIds.length > 0) {
|
||||||
|
await deleteRecordsByIds('person', createdPersonIds);
|
||||||
|
createdPersonIds = [];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
it('should throw a permission error when user does not have permission (guest role)', async () => {
|
it('should throw a permission error when user does not have permission (guest role)', async () => {
|
||||||
const personId1 = randomUUID();
|
const personId1 = randomUUID();
|
||||||
const personId2 = randomUUID();
|
const personId2 = randomUUID();
|
||||||
@@ -29,6 +39,7 @@ describe('updateManyObjectRecordsPermissions', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
await makeGraphqlAPIRequest(createGraphqlOperation);
|
await makeGraphqlAPIRequest(createGraphqlOperation);
|
||||||
|
createdPersonIds.push(personId1, personId2);
|
||||||
|
|
||||||
const updateGraphqlOperation = updateManyOperationFactory({
|
const updateGraphqlOperation = updateManyOperationFactory({
|
||||||
objectMetadataSingularName: 'person',
|
objectMetadataSingularName: 'person',
|
||||||
@@ -74,6 +85,7 @@ describe('updateManyObjectRecordsPermissions', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
await makeGraphqlAPIRequest(createGraphqlOperation);
|
await makeGraphqlAPIRequest(createGraphqlOperation);
|
||||||
|
createdPersonIds.push(personId1, personId2);
|
||||||
|
|
||||||
const updateGraphqlOperation = updateManyOperationFactory({
|
const updateGraphqlOperation = updateManyOperationFactory({
|
||||||
objectMetadataSingularName: 'person',
|
objectMetadataSingularName: 'person',
|
||||||
@@ -118,6 +130,7 @@ describe('updateManyObjectRecordsPermissions', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
await makeGraphqlAPIRequest(createGraphqlOperation);
|
await makeGraphqlAPIRequest(createGraphqlOperation);
|
||||||
|
createdPersonIds.push(personId1, personId2);
|
||||||
|
|
||||||
const updateGraphqlOperation = updateManyOperationFactory({
|
const updateGraphqlOperation = updateManyOperationFactory({
|
||||||
objectMetadataSingularName: 'person',
|
objectMetadataSingularName: 'person',
|
||||||
|
|||||||
+19
@@ -15,6 +15,7 @@ import { restorePageLayoutOperationFactory } from 'test/integration/graphql/util
|
|||||||
import { updatePageLayoutOperationFactory } from 'test/integration/graphql/utils/update-page-layout-operation-factory.util';
|
import { updatePageLayoutOperationFactory } from 'test/integration/graphql/utils/update-page-layout-operation-factory.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import {
|
import {
|
||||||
assertPageLayoutStructure,
|
assertPageLayoutStructure,
|
||||||
cleanupPageLayoutRecords,
|
cleanupPageLayoutRecords,
|
||||||
@@ -49,6 +50,15 @@ describe('Page Layout Resolver', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: testObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: testObjectMetadataId },
|
input: { idToDelete: testObjectMetadataId },
|
||||||
});
|
});
|
||||||
@@ -122,6 +132,15 @@ describe('Page Layout Resolver', () => {
|
|||||||
objectMetadataId: testObjectMetadataId,
|
objectMetadataId: testObjectMetadataId,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: objectMetadata2Id,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: objectMetadata2Id },
|
input: { idToDelete: objectMetadata2Id },
|
||||||
});
|
});
|
||||||
|
|||||||
+10
@@ -22,6 +22,7 @@ import { restorePageLayoutTabOperationFactory } from 'test/integration/graphql/u
|
|||||||
import { updatePageLayoutTabOperationFactory } from 'test/integration/graphql/utils/update-page-layout-tab-operation-factory.util';
|
import { updatePageLayoutTabOperationFactory } from 'test/integration/graphql/utils/update-page-layout-tab-operation-factory.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { assertPageLayoutTabStructure } from 'test/integration/utils/page-layout-tab-test.util';
|
import { assertPageLayoutTabStructure } from 'test/integration/utils/page-layout-tab-test.util';
|
||||||
|
|
||||||
import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
|
import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
|
||||||
@@ -63,6 +64,15 @@ describe('Page Layout Tab Resolver', () => {
|
|||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
await cleanupPageLayoutRecordsWithGraphQL();
|
await cleanupPageLayoutRecordsWithGraphQL();
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: testObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: testObjectMetadataId },
|
input: { idToDelete: testObjectMetadataId },
|
||||||
});
|
});
|
||||||
|
|||||||
+10
@@ -14,6 +14,7 @@ import {
|
|||||||
cleanupPageLayoutRecords,
|
cleanupPageLayoutRecords,
|
||||||
} from 'test/integration/utils/page-layout-test.util';
|
} from 'test/integration/utils/page-layout-test.util';
|
||||||
import { cleanupPageLayoutWidgetRecords } from 'test/integration/utils/page-layout-widget-test.util';
|
import { cleanupPageLayoutWidgetRecords } from 'test/integration/utils/page-layout-widget-test.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
|
|
||||||
import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
|
import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
|
||||||
import { type PageLayoutEntity } from 'src/engine/core-modules/page-layout/entities/page-layout.entity';
|
import { type PageLayoutEntity } from 'src/engine/core-modules/page-layout/entities/page-layout.entity';
|
||||||
@@ -53,6 +54,15 @@ describe('Page Layout Update With Tabs And Widgets Integration', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
input: {
|
||||||
|
idToUpdate: testObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: testObjectMetadataId },
|
input: { idToDelete: testObjectMetadataId },
|
||||||
});
|
});
|
||||||
|
|||||||
+10
@@ -23,6 +23,7 @@ import { restorePageLayoutWidgetOperationFactory } from 'test/integration/graphq
|
|||||||
import { updatePageLayoutWidgetOperationFactory } from 'test/integration/graphql/utils/update-page-layout-widget-operation-factory.util';
|
import { updatePageLayoutWidgetOperationFactory } from 'test/integration/graphql/utils/update-page-layout-widget-operation-factory.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { assertPageLayoutWidgetStructure } from 'test/integration/utils/page-layout-widget-test.util';
|
import { assertPageLayoutWidgetStructure } from 'test/integration/utils/page-layout-widget-test.util';
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
|
|
||||||
@@ -76,6 +77,15 @@ describe('Page Layout Widget Resolver', () => {
|
|||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
await cleanupPageLayoutRecordsWithGraphQL();
|
await cleanupPageLayoutRecordsWithGraphQL();
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: testObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: testObjectMetadataId },
|
input: { idToDelete: testObjectMetadataId },
|
||||||
});
|
});
|
||||||
|
|||||||
+19
@@ -7,6 +7,7 @@ import { createOneObjectMetadata } from 'test/integration/metadata/suites/object
|
|||||||
import { deleteOneObjectMetadataQueryFactory } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata-query-factory.util';
|
import { deleteOneObjectMetadataQueryFactory } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata-query-factory.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { updateOneObjectMetadataQueryFactory } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata-query-factory.util';
|
import { updateOneObjectMetadataQueryFactory } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata-query-factory.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { makeMetadataAPIRequestWithMemberRole } from 'test/integration/metadata/suites/utils/make-metadata-api-request-with-member-role.util';
|
import { makeMetadataAPIRequestWithMemberRole } from 'test/integration/metadata/suites/utils/make-metadata-api-request-with-member-role.util';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
|
|
||||||
@@ -43,6 +44,15 @@ describe('datamodel permissions', () => {
|
|||||||
testFieldId = createdFieldData.createOneField.id;
|
testFieldId = createdFieldData.createOneField.id;
|
||||||
});
|
});
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: listingObjectId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: listingObjectId },
|
input: { idToDelete: listingObjectId },
|
||||||
});
|
});
|
||||||
@@ -184,6 +194,15 @@ describe('datamodel permissions', () => {
|
|||||||
listingObjectId = data.createOneObject.id;
|
listingObjectId = data.createOneObject.id;
|
||||||
});
|
});
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: listingObjectId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: listingObjectId },
|
input: { idToDelete: listingObjectId },
|
||||||
});
|
});
|
||||||
|
|||||||
+10
@@ -2,6 +2,7 @@ import request from 'supertest';
|
|||||||
import { deleteOneRoleOperationFactory } from 'test/integration/graphql/utils/delete-one-role-operation-factory.util';
|
import { deleteOneRoleOperationFactory } from 'test/integration/graphql/utils/delete-one-role-operation-factory.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
|
|
||||||
import { fieldTextMock } from 'src/engine/api/__mocks__/object-metadata-item.mock';
|
import { fieldTextMock } from 'src/engine/api/__mocks__/object-metadata-item.mock';
|
||||||
import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
|
import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
|
||||||
@@ -466,6 +467,15 @@ describe('roles permissions', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: listingObjectId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
expectToFail: false,
|
expectToFail: false,
|
||||||
input: { idToDelete: listingObjectId },
|
input: { idToDelete: listingObjectId },
|
||||||
|
|||||||
+10
@@ -3,6 +3,7 @@ import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graph
|
|||||||
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
|
|
||||||
const createRecordsQuery = gql`
|
const createRecordsQuery = gql`
|
||||||
@@ -88,6 +89,15 @@ describe('upsert (createMany with upsert:true)', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: createdObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: createdObjectMetadataId },
|
input: { idToDelete: createdObjectMetadataId },
|
||||||
});
|
});
|
||||||
|
|||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
|
exports[`Delete core view should throw an error when deleting non-existent view 1`] = `
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "NOT_FOUND",
|
||||||
|
"userFriendlyMessage": "An error occurred.",
|
||||||
|
},
|
||||||
|
"message": "View to delete not found",
|
||||||
|
"name": "NotFoundError",
|
||||||
|
}
|
||||||
|
`;
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
|
exports[`Destroy core view should throw an error when destroying non-existent view 1`] = `
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "NOT_FOUND",
|
||||||
|
"userFriendlyMessage": "An error occurred.",
|
||||||
|
},
|
||||||
|
"message": "View to destroy not found",
|
||||||
|
"name": "NotFoundError",
|
||||||
|
}
|
||||||
|
`;
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
|
exports[`Update core view should throw error when updating non-existent view 1`] = `
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "NOT_FOUND",
|
||||||
|
"userFriendlyMessage": "An error occurred.",
|
||||||
|
},
|
||||||
|
"message": "View to update not found",
|
||||||
|
"name": "NotFoundError",
|
||||||
|
}
|
||||||
|
`;
|
||||||
+108
@@ -0,0 +1,108 @@
|
|||||||
|
import { assertGraphQLSuccessfulResponse } from 'test/integration/graphql/utils/graphql-test-assertions.util';
|
||||||
|
import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util';
|
||||||
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
|
import {
|
||||||
|
assertViewStructure,
|
||||||
|
cleanupViewRecords,
|
||||||
|
} from 'test/integration/utils/view-test.util';
|
||||||
|
import { createViewOperationFactory } from 'test/integration/graphql/utils/create-view-operation-factory.util';
|
||||||
|
|
||||||
|
import { ViewOpenRecordIn } from 'src/engine/core-modules/view/enums/view-open-record-in';
|
||||||
|
import { ViewType } from 'src/engine/core-modules/view/enums/view-type.enum';
|
||||||
|
|
||||||
|
describe('Create core view', () => {
|
||||||
|
let testObjectMetadataId: string;
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
const {
|
||||||
|
data: {
|
||||||
|
createOneObject: { id: objectMetadataId },
|
||||||
|
},
|
||||||
|
} = await createOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
nameSingular: 'myViewTestObject',
|
||||||
|
namePlural: 'myViewTestObjects',
|
||||||
|
labelSingular: 'My View Test Object',
|
||||||
|
labelPlural: 'My View Test Objects',
|
||||||
|
icon: 'Icon123',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
testObjectMetadataId = objectMetadataId;
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: testObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
await deleteOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: { idToDelete: testObjectMetadataId },
|
||||||
|
});
|
||||||
|
await cleanupViewRecords();
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await cleanupViewRecords();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create a new view with all properties', async () => {
|
||||||
|
const input = {
|
||||||
|
name: 'Kanban View',
|
||||||
|
objectMetadataId: testObjectMetadataId,
|
||||||
|
icon: 'IconDeal',
|
||||||
|
type: ViewType.KANBAN,
|
||||||
|
key: null,
|
||||||
|
position: 1,
|
||||||
|
isCompact: true,
|
||||||
|
openRecordIn: ViewOpenRecordIn.SIDE_PANEL,
|
||||||
|
};
|
||||||
|
|
||||||
|
const operation = createViewOperationFactory({ data: input });
|
||||||
|
const response = await makeGraphqlAPIRequest(operation);
|
||||||
|
|
||||||
|
assertGraphQLSuccessfulResponse(response);
|
||||||
|
assertViewStructure(response.body.data.createCoreView, {
|
||||||
|
name: input.name,
|
||||||
|
objectMetadataId: input.objectMetadataId,
|
||||||
|
type: input.type,
|
||||||
|
key: null,
|
||||||
|
icon: input.icon,
|
||||||
|
position: input.position,
|
||||||
|
isCompact: input.isCompact,
|
||||||
|
openRecordIn: input.openRecordIn,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create a view with minimum required fields', async () => {
|
||||||
|
const input = {
|
||||||
|
name: 'Minimal View',
|
||||||
|
objectMetadataId: testObjectMetadataId,
|
||||||
|
icon: 'IconList',
|
||||||
|
};
|
||||||
|
|
||||||
|
const operation = createViewOperationFactory({ data: input });
|
||||||
|
const response = await makeGraphqlAPIRequest(operation);
|
||||||
|
|
||||||
|
assertGraphQLSuccessfulResponse(response);
|
||||||
|
assertViewStructure(response.body.data.createCoreView, {
|
||||||
|
name: input.name,
|
||||||
|
objectMetadataId: input.objectMetadataId,
|
||||||
|
icon: input.icon,
|
||||||
|
type: ViewType.TABLE,
|
||||||
|
key: null,
|
||||||
|
position: 0,
|
||||||
|
isCompact: false,
|
||||||
|
openRecordIn: ViewOpenRecordIn.SIDE_PANEL,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
+90
@@ -0,0 +1,90 @@
|
|||||||
|
import { TEST_NOT_EXISTING_VIEW_ID } from 'test/integration/constants/test-view-ids.constants';
|
||||||
|
import { deleteViewOperationFactory } from 'test/integration/graphql/utils/delete-view-operation-factory.util';
|
||||||
|
import { findViewOperationFactory } from 'test/integration/graphql/utils/find-view-operation-factory.util';
|
||||||
|
import {
|
||||||
|
assertGraphQLErrorResponseWithSnapshot,
|
||||||
|
assertGraphQLSuccessfulResponse,
|
||||||
|
} from 'test/integration/graphql/utils/graphql-test-assertions.util';
|
||||||
|
import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util';
|
||||||
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
|
import { cleanupViewRecords } from 'test/integration/utils/view-test.util';
|
||||||
|
import { createOneCoreView } from 'test/integration/metadata/suites/view/utils/create-one-core-view.util';
|
||||||
|
|
||||||
|
describe('Delete core view', () => {
|
||||||
|
let testObjectMetadataId: string;
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
const {
|
||||||
|
data: {
|
||||||
|
createOneObject: { id: objectMetadataId },
|
||||||
|
},
|
||||||
|
} = await createOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
nameSingular: 'myViewTestObject',
|
||||||
|
namePlural: 'myViewTestObjects',
|
||||||
|
labelSingular: 'My View Test Object',
|
||||||
|
labelPlural: 'My View Test Objects',
|
||||||
|
icon: 'Icon123',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
testObjectMetadataId = objectMetadataId;
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: testObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
await deleteOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: { idToDelete: testObjectMetadataId },
|
||||||
|
});
|
||||||
|
await cleanupViewRecords();
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await cleanupViewRecords();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should delete an existing view', async () => {
|
||||||
|
const {
|
||||||
|
data: { createCoreView: view },
|
||||||
|
} = await createOneCoreView({
|
||||||
|
input: {
|
||||||
|
name: 'View to Delete',
|
||||||
|
objectMetadataId: testObjectMetadataId,
|
||||||
|
icon: '123Icon',
|
||||||
|
},
|
||||||
|
expectToFail: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
const deleteOperation = deleteViewOperationFactory({ viewId: view.id });
|
||||||
|
const deleteResponse = await makeGraphqlAPIRequest(deleteOperation);
|
||||||
|
|
||||||
|
assertGraphQLSuccessfulResponse(deleteResponse);
|
||||||
|
expect(deleteResponse.body.data.deleteCoreView).toBe(true);
|
||||||
|
|
||||||
|
const getOperation = findViewOperationFactory({ viewId: view.id });
|
||||||
|
const getResponse = await makeGraphqlAPIRequest(getOperation);
|
||||||
|
|
||||||
|
expect(getResponse.body.data.getCoreView).toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should throw an error when deleting non-existent view', async () => {
|
||||||
|
const operation = deleteViewOperationFactory({
|
||||||
|
viewId: TEST_NOT_EXISTING_VIEW_ID,
|
||||||
|
});
|
||||||
|
const response = await makeGraphqlAPIRequest(operation);
|
||||||
|
|
||||||
|
assertGraphQLErrorResponseWithSnapshot(response);
|
||||||
|
});
|
||||||
|
});
|
||||||
+95
@@ -0,0 +1,95 @@
|
|||||||
|
import { TEST_NOT_EXISTING_VIEW_ID } from 'test/integration/constants/test-view-ids.constants';
|
||||||
|
import { deleteViewOperationFactory } from 'test/integration/graphql/utils/delete-view-operation-factory.util';
|
||||||
|
import { destroyViewOperationFactory } from 'test/integration/graphql/utils/destroy-view-operation-factory.util';
|
||||||
|
import { findViewOperationFactory } from 'test/integration/graphql/utils/find-view-operation-factory.util';
|
||||||
|
import {
|
||||||
|
assertGraphQLErrorResponseWithSnapshot,
|
||||||
|
assertGraphQLSuccessfulResponse,
|
||||||
|
} from 'test/integration/graphql/utils/graphql-test-assertions.util';
|
||||||
|
import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util';
|
||||||
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
|
import { cleanupViewRecords } from 'test/integration/utils/view-test.util';
|
||||||
|
import { createOneCoreView } from 'test/integration/metadata/suites/view/utils/create-one-core-view.util';
|
||||||
|
|
||||||
|
describe('Destroy core view', () => {
|
||||||
|
let testObjectMetadataId: string;
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
const {
|
||||||
|
data: {
|
||||||
|
createOneObject: { id: objectMetadataId },
|
||||||
|
},
|
||||||
|
} = await createOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
nameSingular: 'myViewTestObject',
|
||||||
|
namePlural: 'myViewTestObjects',
|
||||||
|
labelSingular: 'My View Test Object',
|
||||||
|
labelPlural: 'My View Test Objects',
|
||||||
|
icon: 'Icon123',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
testObjectMetadataId = objectMetadataId;
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: testObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
await deleteOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: { idToDelete: testObjectMetadataId },
|
||||||
|
});
|
||||||
|
await cleanupViewRecords();
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await cleanupViewRecords();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should destroy an existing view', async () => {
|
||||||
|
const {
|
||||||
|
data: { createCoreView: view },
|
||||||
|
} = await createOneCoreView({
|
||||||
|
input: {
|
||||||
|
icon: '123Icon',
|
||||||
|
name: 'View to Destroy',
|
||||||
|
objectMetadataId: testObjectMetadataId,
|
||||||
|
},
|
||||||
|
expectToFail: false,
|
||||||
|
});
|
||||||
|
const deleteOperation = deleteViewOperationFactory({ viewId: view.id });
|
||||||
|
const deleteResponse = await makeGraphqlAPIRequest(deleteOperation);
|
||||||
|
|
||||||
|
assertGraphQLSuccessfulResponse(deleteResponse);
|
||||||
|
|
||||||
|
const destroyOperation = destroyViewOperationFactory({ viewId: view.id });
|
||||||
|
const destroyResponse = await makeGraphqlAPIRequest(destroyOperation);
|
||||||
|
|
||||||
|
assertGraphQLSuccessfulResponse(destroyResponse);
|
||||||
|
expect(destroyResponse.body.data.destroyCoreView).toBe(true);
|
||||||
|
|
||||||
|
const getOperation = findViewOperationFactory({ viewId: view.id });
|
||||||
|
const getResponse = await makeGraphqlAPIRequest(getOperation);
|
||||||
|
|
||||||
|
expect(getResponse.body.data.getCoreView).toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should throw an error when destroying non-existent view', async () => {
|
||||||
|
const operation = destroyViewOperationFactory({
|
||||||
|
viewId: TEST_NOT_EXISTING_VIEW_ID,
|
||||||
|
});
|
||||||
|
const response = await makeGraphqlAPIRequest(operation);
|
||||||
|
|
||||||
|
assertGraphQLErrorResponseWithSnapshot(response);
|
||||||
|
});
|
||||||
|
});
|
||||||
+102
@@ -0,0 +1,102 @@
|
|||||||
|
import { TEST_NOT_EXISTING_VIEW_ID } from 'test/integration/constants/test-view-ids.constants';
|
||||||
|
import {
|
||||||
|
assertGraphQLErrorResponseWithSnapshot,
|
||||||
|
assertGraphQLSuccessfulResponse,
|
||||||
|
} from 'test/integration/graphql/utils/graphql-test-assertions.util';
|
||||||
|
import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util';
|
||||||
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
|
import { cleanupViewRecords } from 'test/integration/utils/view-test.util';
|
||||||
|
import { updateViewOperationFactory } from 'test/integration/graphql/utils/update-view-operation-factory.util';
|
||||||
|
import { updateViewData } from 'test/integration/graphql/utils/view-data-factory.util';
|
||||||
|
import { createOneCoreView } from 'test/integration/metadata/suites/view/utils/create-one-core-view.util';
|
||||||
|
|
||||||
|
import { ViewType } from 'src/engine/core-modules/view/enums/view-type.enum';
|
||||||
|
|
||||||
|
describe('Update core view', () => {
|
||||||
|
let testObjectMetadataId: string;
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
const {
|
||||||
|
data: {
|
||||||
|
createOneObject: { id: objectMetadataId },
|
||||||
|
},
|
||||||
|
} = await createOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
nameSingular: 'myViewTestObject',
|
||||||
|
namePlural: 'myViewTestObjects',
|
||||||
|
labelSingular: 'My View Test Object',
|
||||||
|
labelPlural: 'My View Test Objects',
|
||||||
|
icon: 'Icon123',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
testObjectMetadataId = objectMetadataId;
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: testObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
await deleteOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: { idToDelete: testObjectMetadataId },
|
||||||
|
});
|
||||||
|
await cleanupViewRecords();
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await cleanupViewRecords();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should update an existing view', async () => {
|
||||||
|
const {
|
||||||
|
data: { createCoreView: view },
|
||||||
|
} = await createOneCoreView({
|
||||||
|
input: {
|
||||||
|
icon: '123Icon',
|
||||||
|
name: 'Original View',
|
||||||
|
type: ViewType.TABLE,
|
||||||
|
isCompact: false,
|
||||||
|
objectMetadataId: testObjectMetadataId,
|
||||||
|
},
|
||||||
|
expectToFail: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
const updateInput = updateViewData({
|
||||||
|
name: 'Updated View',
|
||||||
|
type: ViewType.KANBAN,
|
||||||
|
isCompact: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
const operation = updateViewOperationFactory({
|
||||||
|
viewId: view.id,
|
||||||
|
data: updateInput,
|
||||||
|
});
|
||||||
|
const response = await makeGraphqlAPIRequest(operation);
|
||||||
|
|
||||||
|
assertGraphQLSuccessfulResponse(response);
|
||||||
|
expect(response.body.data.updateCoreView).toMatchObject({
|
||||||
|
id: view.id,
|
||||||
|
...updateInput,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should throw error when updating non-existent view', async () => {
|
||||||
|
const operation = updateViewOperationFactory({
|
||||||
|
viewId: TEST_NOT_EXISTING_VIEW_ID,
|
||||||
|
data: { name: 'Non-existent View' },
|
||||||
|
});
|
||||||
|
const response = await makeGraphqlAPIRequest(operation);
|
||||||
|
|
||||||
|
assertGraphQLErrorResponseWithSnapshot(response);
|
||||||
|
});
|
||||||
|
});
|
||||||
+12
-29
@@ -2,11 +2,8 @@ import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-m
|
|||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
|
||||||
import { createOneCoreView } from 'test/integration/metadata/suites/view/utils/create-one-core-view.util';
|
import { createOneCoreView } from 'test/integration/metadata/suites/view/utils/create-one-core-view.util';
|
||||||
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
|
||||||
|
|
||||||
export type ViewFieldTestSetup = {
|
export type ViewFieldTestSetup = {
|
||||||
testViewId: string;
|
testViewId: string;
|
||||||
@@ -15,12 +12,6 @@ export type ViewFieldTestSetup = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const setupViewFieldTestV2 = async (): Promise<ViewFieldTestSetup> => {
|
export const setupViewFieldTestV2 = async (): Promise<ViewFieldTestSetup> => {
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
data: {
|
data: {
|
||||||
createOneObject: { id: objectMetadataId },
|
createOneObject: { id: objectMetadataId },
|
||||||
@@ -80,24 +71,16 @@ export const setupViewFieldTestV2 = async (): Promise<ViewFieldTestSetup> => {
|
|||||||
export const cleanupViewFieldTestV2 = async (
|
export const cleanupViewFieldTestV2 = async (
|
||||||
objectMetadataId: string,
|
objectMetadataId: string,
|
||||||
): Promise<void> => {
|
): Promise<void> => {
|
||||||
try {
|
await updateOneObjectMetadata({
|
||||||
await updateOneObjectMetadata({
|
input: {
|
||||||
input: {
|
idToUpdate: objectMetadataId,
|
||||||
idToUpdate: objectMetadataId,
|
updatePayload: {
|
||||||
updatePayload: {
|
isActive: false,
|
||||||
isActive: false,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
});
|
},
|
||||||
await deleteOneObjectMetadata({
|
});
|
||||||
expectToFail: false,
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: objectMetadataId },
|
expectToFail: false,
|
||||||
});
|
input: { idToDelete: objectMetadataId },
|
||||||
} finally {
|
});
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: false,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|||||||
+34
-6
@@ -13,28 +13,39 @@ import { createTestViewWithGraphQL } from 'test/integration/graphql/utils/view-g
|
|||||||
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
|
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
||||||
|
import { createOneCoreViewField } from 'test/integration/metadata/suites/view-field/utils/create-one-core-view-field.util';
|
||||||
|
import { deleteOneCoreViewField } from 'test/integration/metadata/suites/view-field/utils/delete-one-core-view-field.util';
|
||||||
|
import { destroyOneCoreViewField } from 'test/integration/metadata/suites/view-field/utils/destroy-one-core-view-field.util';
|
||||||
|
import { updateOneCoreViewField } from 'test/integration/metadata/suites/view-field/utils/update-one-core-view-field.util';
|
||||||
import {
|
import {
|
||||||
assertViewFieldStructure,
|
assertViewFieldStructure,
|
||||||
cleanupViewRecords,
|
cleanupViewRecords,
|
||||||
} from 'test/integration/utils/view-test.util';
|
} from 'test/integration/utils/view-test.util';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
import { createOneCoreViewField } from 'test/integration/metadata/suites/view-field/utils/create-one-core-view-field.util';
|
|
||||||
import { deleteOneCoreViewField } from 'test/integration/metadata/suites/view-field/utils/delete-one-core-view-field.util';
|
|
||||||
import { destroyOneCoreViewField } from 'test/integration/metadata/suites/view-field/utils/destroy-one-core-view-field.util';
|
|
||||||
import { updateOneCoreViewField } from 'test/integration/metadata/suites/view-field/utils/update-one-core-view-field.util';
|
|
||||||
|
|
||||||
|
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
||||||
|
import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
|
||||||
|
import { type CreateViewFieldInput } from 'src/engine/core-modules/view/dtos/inputs/create-view-field.input';
|
||||||
import {
|
import {
|
||||||
generateViewFieldExceptionMessage,
|
generateViewFieldExceptionMessage,
|
||||||
ViewFieldExceptionMessageKey,
|
ViewFieldExceptionMessageKey,
|
||||||
} from 'src/engine/core-modules/view/exceptions/view-field.exception';
|
} from 'src/engine/core-modules/view/exceptions/view-field.exception';
|
||||||
import { type CreateViewFieldInput } from 'src/engine/core-modules/view/dtos/inputs/create-view-field.input';
|
|
||||||
import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
|
|
||||||
|
|
||||||
describe('View Field Resolver', () => {
|
describe('View Field Resolver', () => {
|
||||||
let testViewId: string;
|
let testViewId: string;
|
||||||
let testObjectMetadataId: string;
|
let testObjectMetadataId: string;
|
||||||
let testFieldMetadataId: string;
|
let testFieldMetadataId: string;
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: false,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
const {
|
const {
|
||||||
data: {
|
data: {
|
||||||
@@ -80,6 +91,15 @@ describe('View Field Resolver', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: testObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
expectToFail: false,
|
expectToFail: false,
|
||||||
input: { idToDelete: testObjectMetadataId },
|
input: { idToDelete: testObjectMetadataId },
|
||||||
@@ -87,6 +107,14 @@ describe('View Field Resolver', () => {
|
|||||||
await cleanupViewRecords();
|
await cleanupViewRecords();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
await cleanupViewRecords();
|
await cleanupViewRecords();
|
||||||
|
|
||||||
|
|||||||
+10
@@ -17,6 +17,7 @@ import {
|
|||||||
import { createTestViewWithGraphQL } from 'test/integration/graphql/utils/view-graphql.util';
|
import { createTestViewWithGraphQL } from 'test/integration/graphql/utils/view-graphql.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import {
|
import {
|
||||||
assertViewFilterGroupStructure,
|
assertViewFilterGroupStructure,
|
||||||
cleanupViewRecords,
|
cleanupViewRecords,
|
||||||
@@ -54,6 +55,15 @@ describe('View Filter Group Resolver', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: testObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
expectToFail: false,
|
expectToFail: false,
|
||||||
input: { idToDelete: testObjectMetadataId },
|
input: { idToDelete: testObjectMetadataId },
|
||||||
|
|||||||
+10
@@ -14,6 +14,7 @@ import { createTestViewWithGraphQL } from 'test/integration/graphql/utils/view-g
|
|||||||
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import {
|
import {
|
||||||
assertViewFilterStructure,
|
assertViewFilterStructure,
|
||||||
cleanupViewRecords,
|
cleanupViewRecords,
|
||||||
@@ -69,6 +70,15 @@ describe('View Filter Resolver', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: testObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
expectToFail: false,
|
expectToFail: false,
|
||||||
input: { idToDelete: testObjectMetadataId },
|
input: { idToDelete: testObjectMetadataId },
|
||||||
|
|||||||
+10
@@ -17,6 +17,7 @@ import { createTestViewWithGraphQL } from 'test/integration/graphql/utils/view-g
|
|||||||
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import {
|
import {
|
||||||
assertViewGroupStructure,
|
assertViewGroupStructure,
|
||||||
cleanupViewRecords,
|
cleanupViewRecords,
|
||||||
@@ -71,6 +72,15 @@ describe('View Group Resolver', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: testObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
expectToFail: false,
|
expectToFail: false,
|
||||||
input: { idToDelete: testObjectMetadataId },
|
input: { idToDelete: testObjectMetadataId },
|
||||||
|
|||||||
-339
@@ -1,339 +0,0 @@
|
|||||||
import { TEST_NOT_EXISTING_VIEW_ID } from 'test/integration/constants/test-view-ids.constants';
|
|
||||||
import { createViewOperationFactory } from 'test/integration/graphql/utils/create-view-operation-factory.util';
|
|
||||||
import { deleteViewOperationFactory } from 'test/integration/graphql/utils/delete-view-operation-factory.util';
|
|
||||||
import { destroyViewOperationFactory } from 'test/integration/graphql/utils/destroy-view-operation-factory.util';
|
|
||||||
import { findViewOperationFactory } from 'test/integration/graphql/utils/find-view-operation-factory.util';
|
|
||||||
import { findViewsOperationFactory } from 'test/integration/graphql/utils/find-views-operation-factory.util';
|
|
||||||
import {
|
|
||||||
assertGraphQLErrorResponse,
|
|
||||||
assertGraphQLSuccessfulResponse,
|
|
||||||
} from 'test/integration/graphql/utils/graphql-test-assertions.util';
|
|
||||||
import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util';
|
|
||||||
import { updateViewOperationFactory } from 'test/integration/graphql/utils/update-view-operation-factory.util';
|
|
||||||
import {
|
|
||||||
createViewData,
|
|
||||||
updateViewData,
|
|
||||||
} from 'test/integration/graphql/utils/view-data-factory.util';
|
|
||||||
import { createTestViewWithGraphQL } from 'test/integration/graphql/utils/view-graphql.util';
|
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
|
||||||
import {
|
|
||||||
assertViewStructure,
|
|
||||||
cleanupViewRecords,
|
|
||||||
} from 'test/integration/utils/view-test.util';
|
|
||||||
|
|
||||||
import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
|
|
||||||
import { ViewOpenRecordIn } from 'src/engine/core-modules/view/enums/view-open-record-in';
|
|
||||||
import { ViewType } from 'src/engine/core-modules/view/enums/view-type.enum';
|
|
||||||
import {
|
|
||||||
ViewExceptionMessageKey,
|
|
||||||
generateViewExceptionMessage,
|
|
||||||
} from 'src/engine/core-modules/view/exceptions/view.exception';
|
|
||||||
|
|
||||||
describe('View Resolver', () => {
|
|
||||||
let testObjectMetadataId: string;
|
|
||||||
|
|
||||||
beforeAll(async () => {
|
|
||||||
const {
|
|
||||||
data: {
|
|
||||||
createOneObject: { id: objectMetadataId },
|
|
||||||
},
|
|
||||||
} = await createOneObjectMetadata({
|
|
||||||
expectToFail: false,
|
|
||||||
input: {
|
|
||||||
nameSingular: 'myViewTestObject',
|
|
||||||
namePlural: 'myViewTestObjects',
|
|
||||||
labelSingular: 'My View Test Object',
|
|
||||||
labelPlural: 'My View Test Objects',
|
|
||||||
icon: 'Icon123',
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
testObjectMetadataId = objectMetadataId;
|
|
||||||
});
|
|
||||||
|
|
||||||
afterAll(async () => {
|
|
||||||
await deleteOneObjectMetadata({
|
|
||||||
expectToFail: false,
|
|
||||||
input: { idToDelete: testObjectMetadataId },
|
|
||||||
});
|
|
||||||
await cleanupViewRecords();
|
|
||||||
});
|
|
||||||
|
|
||||||
beforeEach(async () => {
|
|
||||||
await cleanupViewRecords();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('getCoreViews', () => {
|
|
||||||
it('should return empty array when no views exist', async () => {
|
|
||||||
const operation = findViewsOperationFactory();
|
|
||||||
const response = await makeGraphqlAPIRequest(operation);
|
|
||||||
|
|
||||||
assertGraphQLSuccessfulResponse(response);
|
|
||||||
expect(response.body.data.getCoreViews).toEqual([]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return all views for workspace when no objectMetadataId provided', async () => {
|
|
||||||
const viewName = 'Test View';
|
|
||||||
|
|
||||||
await createTestViewWithGraphQL({
|
|
||||||
name: viewName,
|
|
||||||
objectMetadataId: testObjectMetadataId,
|
|
||||||
});
|
|
||||||
|
|
||||||
const viewData = createViewData({
|
|
||||||
name: viewName,
|
|
||||||
objectMetadataId: testObjectMetadataId,
|
|
||||||
});
|
|
||||||
|
|
||||||
const operation = findViewsOperationFactory();
|
|
||||||
const response = await makeGraphqlAPIRequest(operation);
|
|
||||||
|
|
||||||
assertGraphQLSuccessfulResponse(response);
|
|
||||||
expect(response.body.data.getCoreViews).toHaveLength(1);
|
|
||||||
expect(response.body.data.getCoreViews[0]).toMatchObject(viewData);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should filter views by objectMetadataId when provided', async () => {
|
|
||||||
const object1ViewName = 'View for Object 1';
|
|
||||||
const object2ViewName = 'View for Object 2';
|
|
||||||
|
|
||||||
const {
|
|
||||||
data: {
|
|
||||||
createOneObject: { id: objectMetadata2Id },
|
|
||||||
},
|
|
||||||
} = await createOneObjectMetadata({
|
|
||||||
input: {
|
|
||||||
nameSingular: 'myTestObject2',
|
|
||||||
namePlural: 'myTestObjects2',
|
|
||||||
labelSingular: 'My Test Object 2',
|
|
||||||
labelPlural: 'My Test Objects 2',
|
|
||||||
icon: 'Icon123',
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
await Promise.all([
|
|
||||||
createTestViewWithGraphQL({
|
|
||||||
name: object1ViewName,
|
|
||||||
objectMetadataId: testObjectMetadataId,
|
|
||||||
}),
|
|
||||||
createTestViewWithGraphQL({
|
|
||||||
name: object2ViewName,
|
|
||||||
objectMetadataId: objectMetadata2Id,
|
|
||||||
}),
|
|
||||||
]);
|
|
||||||
|
|
||||||
const operation = findViewsOperationFactory({
|
|
||||||
objectMetadataId: testObjectMetadataId,
|
|
||||||
});
|
|
||||||
const response = await makeGraphqlAPIRequest(operation);
|
|
||||||
|
|
||||||
assertGraphQLSuccessfulResponse(response);
|
|
||||||
expect(response.body.data.getCoreViews).toHaveLength(1);
|
|
||||||
expect(response.body.data.getCoreViews[0]).toMatchObject({
|
|
||||||
name: object1ViewName,
|
|
||||||
});
|
|
||||||
|
|
||||||
await deleteOneObjectMetadata({
|
|
||||||
input: { idToDelete: objectMetadata2Id },
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('getCoreView', () => {
|
|
||||||
it('should return null when view does not exist', async () => {
|
|
||||||
const operation = findViewOperationFactory({
|
|
||||||
viewId: TEST_NOT_EXISTING_VIEW_ID,
|
|
||||||
});
|
|
||||||
const response = await makeGraphqlAPIRequest(operation);
|
|
||||||
|
|
||||||
assertGraphQLSuccessfulResponse(response);
|
|
||||||
expect(response.body.data.getCoreView).toBeNull();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return view when it exists', async () => {
|
|
||||||
const viewName = 'Test View for Get';
|
|
||||||
|
|
||||||
const view = await createTestViewWithGraphQL({
|
|
||||||
name: viewName,
|
|
||||||
objectMetadataId: testObjectMetadataId,
|
|
||||||
});
|
|
||||||
|
|
||||||
const operation = findViewOperationFactory({ viewId: view.id });
|
|
||||||
const response = await makeGraphqlAPIRequest(operation);
|
|
||||||
|
|
||||||
assertGraphQLSuccessfulResponse(response);
|
|
||||||
assertViewStructure(response.body.data.getCoreView, {
|
|
||||||
id: view.id,
|
|
||||||
name: viewName,
|
|
||||||
objectMetadataId: testObjectMetadataId,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('createCoreView', () => {
|
|
||||||
it('should create a new view with all properties', async () => {
|
|
||||||
const input = {
|
|
||||||
name: 'Kanban View',
|
|
||||||
objectMetadataId: testObjectMetadataId,
|
|
||||||
icon: 'IconDeal',
|
|
||||||
type: ViewType.KANBAN,
|
|
||||||
key: null,
|
|
||||||
position: 1,
|
|
||||||
isCompact: true,
|
|
||||||
openRecordIn: ViewOpenRecordIn.SIDE_PANEL,
|
|
||||||
};
|
|
||||||
|
|
||||||
const operation = createViewOperationFactory({ data: input });
|
|
||||||
const response = await makeGraphqlAPIRequest(operation);
|
|
||||||
|
|
||||||
assertGraphQLSuccessfulResponse(response);
|
|
||||||
assertViewStructure(response.body.data.createCoreView, {
|
|
||||||
name: input.name,
|
|
||||||
objectMetadataId: input.objectMetadataId,
|
|
||||||
type: input.type,
|
|
||||||
key: null,
|
|
||||||
icon: input.icon,
|
|
||||||
position: input.position,
|
|
||||||
isCompact: input.isCompact,
|
|
||||||
openRecordIn: input.openRecordIn,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should create a view with minimum required fields', async () => {
|
|
||||||
const input = {
|
|
||||||
name: 'Minimal View',
|
|
||||||
objectMetadataId: testObjectMetadataId,
|
|
||||||
icon: 'IconList',
|
|
||||||
};
|
|
||||||
|
|
||||||
const operation = createViewOperationFactory({ data: input });
|
|
||||||
const response = await makeGraphqlAPIRequest(operation);
|
|
||||||
|
|
||||||
assertGraphQLSuccessfulResponse(response);
|
|
||||||
assertViewStructure(response.body.data.createCoreView, {
|
|
||||||
name: input.name,
|
|
||||||
objectMetadataId: input.objectMetadataId,
|
|
||||||
icon: input.icon,
|
|
||||||
type: ViewType.TABLE,
|
|
||||||
key: null,
|
|
||||||
position: 0,
|
|
||||||
isCompact: false,
|
|
||||||
openRecordIn: ViewOpenRecordIn.SIDE_PANEL,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('updateCoreView', () => {
|
|
||||||
it('should update an existing view', async () => {
|
|
||||||
const view = await createTestViewWithGraphQL({
|
|
||||||
name: 'Original View',
|
|
||||||
type: ViewType.TABLE,
|
|
||||||
isCompact: false,
|
|
||||||
objectMetadataId: testObjectMetadataId,
|
|
||||||
});
|
|
||||||
|
|
||||||
const updateInput = updateViewData({
|
|
||||||
name: 'Updated View',
|
|
||||||
type: ViewType.KANBAN,
|
|
||||||
isCompact: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
const operation = updateViewOperationFactory({
|
|
||||||
viewId: view.id,
|
|
||||||
data: updateInput,
|
|
||||||
});
|
|
||||||
const response = await makeGraphqlAPIRequest(operation);
|
|
||||||
|
|
||||||
assertGraphQLSuccessfulResponse(response);
|
|
||||||
expect(response.body.data.updateCoreView).toMatchObject({
|
|
||||||
id: view.id,
|
|
||||||
...updateInput,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should throw error when updating non-existent view', async () => {
|
|
||||||
const operation = updateViewOperationFactory({
|
|
||||||
viewId: TEST_NOT_EXISTING_VIEW_ID,
|
|
||||||
data: { name: 'Non-existent View' },
|
|
||||||
});
|
|
||||||
const response = await makeGraphqlAPIRequest(operation);
|
|
||||||
|
|
||||||
assertGraphQLErrorResponse(
|
|
||||||
response,
|
|
||||||
ErrorCode.NOT_FOUND,
|
|
||||||
generateViewExceptionMessage(
|
|
||||||
ViewExceptionMessageKey.VIEW_NOT_FOUND,
|
|
||||||
TEST_NOT_EXISTING_VIEW_ID,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('deleteCoreView', () => {
|
|
||||||
it('should delete an existing view', async () => {
|
|
||||||
const view = await createTestViewWithGraphQL({
|
|
||||||
name: 'View to Delete',
|
|
||||||
objectMetadataId: testObjectMetadataId,
|
|
||||||
});
|
|
||||||
|
|
||||||
const deleteOperation = deleteViewOperationFactory({ viewId: view.id });
|
|
||||||
const deleteResponse = await makeGraphqlAPIRequest(deleteOperation);
|
|
||||||
|
|
||||||
assertGraphQLSuccessfulResponse(deleteResponse);
|
|
||||||
expect(deleteResponse.body.data.deleteCoreView).toBe(true);
|
|
||||||
|
|
||||||
const getOperation = findViewOperationFactory({ viewId: view.id });
|
|
||||||
const getResponse = await makeGraphqlAPIRequest(getOperation);
|
|
||||||
|
|
||||||
expect(getResponse.body.data.getCoreView).toBeNull();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should throw an error when deleting non-existent view', async () => {
|
|
||||||
const operation = deleteViewOperationFactory({
|
|
||||||
viewId: TEST_NOT_EXISTING_VIEW_ID,
|
|
||||||
});
|
|
||||||
const response = await makeGraphqlAPIRequest(operation);
|
|
||||||
|
|
||||||
assertGraphQLErrorResponse(
|
|
||||||
response,
|
|
||||||
ErrorCode.NOT_FOUND,
|
|
||||||
generateViewExceptionMessage(
|
|
||||||
ViewExceptionMessageKey.VIEW_NOT_FOUND,
|
|
||||||
TEST_NOT_EXISTING_VIEW_ID,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('destroyCoreView', () => {
|
|
||||||
it('should destroy an existing view', async () => {
|
|
||||||
const view = await createTestViewWithGraphQL({
|
|
||||||
name: 'View to Destroy',
|
|
||||||
objectMetadataId: testObjectMetadataId,
|
|
||||||
});
|
|
||||||
|
|
||||||
const destroyOperation = destroyViewOperationFactory({ viewId: view.id });
|
|
||||||
const destroyResponse = await makeGraphqlAPIRequest(destroyOperation);
|
|
||||||
|
|
||||||
assertGraphQLSuccessfulResponse(destroyResponse);
|
|
||||||
expect(destroyResponse.body.data.destroyCoreView).toBe(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should throw an error when destroying non-existent view', async () => {
|
|
||||||
const operation = destroyViewOperationFactory({
|
|
||||||
viewId: TEST_NOT_EXISTING_VIEW_ID,
|
|
||||||
});
|
|
||||||
const response = await makeGraphqlAPIRequest(operation);
|
|
||||||
|
|
||||||
assertGraphQLErrorResponse(
|
|
||||||
response,
|
|
||||||
ErrorCode.NOT_FOUND,
|
|
||||||
generateViewExceptionMessage(
|
|
||||||
ViewExceptionMessageKey.VIEW_NOT_FOUND,
|
|
||||||
TEST_NOT_EXISTING_VIEW_ID,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
+10
@@ -17,6 +17,7 @@ import { createTestViewWithGraphQL } from 'test/integration/graphql/utils/view-g
|
|||||||
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import {
|
import {
|
||||||
assertViewSortStructure,
|
assertViewSortStructure,
|
||||||
cleanupViewRecords,
|
cleanupViewRecords,
|
||||||
@@ -72,6 +73,15 @@ describe('View Sort Resolver', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: testObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
expectToFail: false,
|
expectToFail: false,
|
||||||
input: { idToDelete: testObjectMetadataId },
|
input: { idToDelete: testObjectMetadataId },
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
import { jestExpectToBeDefined } from 'test/utils/expect-to-be-defined.util.test';
|
||||||
|
import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
type BaseGraphQLError,
|
type BaseGraphQLError,
|
||||||
type ErrorCode,
|
type ErrorCode,
|
||||||
@@ -43,3 +46,20 @@ export const assertGraphQLErrorResponse = <T extends Record<string, unknown>>(
|
|||||||
expect(response.body.errors[0].message).toBe(expectedErrorMessage);
|
expect(response.body.errors[0].message).toBe(expectedErrorMessage);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const assertGraphQLErrorResponseWithSnapshot = <
|
||||||
|
T extends Record<string, unknown>,
|
||||||
|
>(
|
||||||
|
response: GraphQLResponse<T>,
|
||||||
|
) => {
|
||||||
|
expect(response.status).toBe(200);
|
||||||
|
jestExpectToBeDefined(response.body.errors);
|
||||||
|
expect(response.body.errors).toHaveLength(1);
|
||||||
|
|
||||||
|
const firstError = response.body.errors[0];
|
||||||
|
|
||||||
|
jestExpectToBeDefined(firstError);
|
||||||
|
expect(firstError).toMatchSnapshot(
|
||||||
|
extractRecordIdsAndDatesAsExpectAny(firstError),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|||||||
+45
@@ -0,0 +1,45 @@
|
|||||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
|
exports[`createOne FieldMetadataService name/label sync should return an error when name and label are not synced but isLabelSyncedWithName is true 1`] = `
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"errors": {
|
||||||
|
"index": [],
|
||||||
|
"objectMetadata": [
|
||||||
|
{
|
||||||
|
"errors": [
|
||||||
|
{
|
||||||
|
"code": "NAME_NOT_SYNCED_WITH_LABEL",
|
||||||
|
"message": "Name is not synced with label",
|
||||||
|
"userFriendlyMessage": "Field name is not synced with field label",
|
||||||
|
"value": "Different Label",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"flatEntityMinimalInformation": {
|
||||||
|
"id": Any<String>,
|
||||||
|
"name": "testField",
|
||||||
|
"objectMetadataId": Any<String>,
|
||||||
|
},
|
||||||
|
"type": "create_field",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"serverlessFunction": [],
|
||||||
|
"view": [],
|
||||||
|
"viewField": [],
|
||||||
|
},
|
||||||
|
"message": "Validation failed for 0 object(s) and 0 field(s)",
|
||||||
|
"summary": {
|
||||||
|
"invalidIndex": 0,
|
||||||
|
"invalidObjectMetadata": 0,
|
||||||
|
"invalidServerlessFunction": 0,
|
||||||
|
"invalidView": 0,
|
||||||
|
"invalidViewField": 0,
|
||||||
|
"totalErrors": 0,
|
||||||
|
},
|
||||||
|
"userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)",
|
||||||
|
},
|
||||||
|
"message": "Multiple validation errors occurred while creating fields",
|
||||||
|
"name": "GraphQLError",
|
||||||
|
}
|
||||||
|
`;
|
||||||
+97
@@ -0,0 +1,97 @@
|
|||||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
|
exports[`updateOne failing update should not update a field name if it is not synced correctly with label and labelSync is true 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"errors": {
|
||||||
|
"index": [],
|
||||||
|
"objectMetadata": [
|
||||||
|
{
|
||||||
|
"errors": [
|
||||||
|
{
|
||||||
|
"code": "FIELD_MUTATION_NOT_ALLOWED",
|
||||||
|
"message": "Name is not synced with label.",
|
||||||
|
"userFriendlyMessage": "Updated field name is not synced with label",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"flatEntityMinimalInformation": {
|
||||||
|
"id": Any<String>,
|
||||||
|
"name": "newName",
|
||||||
|
"objectMetadataId": Any<String>,
|
||||||
|
},
|
||||||
|
"type": "update_field",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"serverlessFunction": [],
|
||||||
|
"view": [],
|
||||||
|
"viewField": [],
|
||||||
|
},
|
||||||
|
"message": "Validation failed for 0 object(s) and 0 field(s)",
|
||||||
|
"summary": {
|
||||||
|
"invalidIndex": 0,
|
||||||
|
"invalidObjectMetadata": 0,
|
||||||
|
"invalidServerlessFunction": 0,
|
||||||
|
"invalidView": 0,
|
||||||
|
"invalidViewField": 0,
|
||||||
|
"totalErrors": 0,
|
||||||
|
},
|
||||||
|
"userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)",
|
||||||
|
},
|
||||||
|
"message": "Multiple validation errors occurred while updating field",
|
||||||
|
"name": "GraphQLError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`updateOne failing update should throw if the field name is not available because of other field with the same name 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"errors": {
|
||||||
|
"index": [],
|
||||||
|
"objectMetadata": [
|
||||||
|
{
|
||||||
|
"errors": [
|
||||||
|
{
|
||||||
|
"code": "NOT_AVAILABLE",
|
||||||
|
"message": "Name "otherTestName" is not available as it is already used by another field",
|
||||||
|
"userFriendlyMessage": "Name "otherTestName" is not available as it is already used by another field",
|
||||||
|
"value": "otherTestName",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"code": "FIELD_MUTATION_NOT_ALLOWED",
|
||||||
|
"message": "Name is not synced with label.",
|
||||||
|
"userFriendlyMessage": "Updated field name is not synced with label",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"flatEntityMinimalInformation": {
|
||||||
|
"id": Any<String>,
|
||||||
|
"name": "otherTestName",
|
||||||
|
"objectMetadataId": Any<String>,
|
||||||
|
},
|
||||||
|
"type": "update_field",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"serverlessFunction": [],
|
||||||
|
"view": [],
|
||||||
|
"viewField": [],
|
||||||
|
},
|
||||||
|
"message": "Validation failed for 0 object(s) and 0 field(s)",
|
||||||
|
"summary": {
|
||||||
|
"invalidIndex": 0,
|
||||||
|
"invalidObjectMetadata": 0,
|
||||||
|
"invalidServerlessFunction": 0,
|
||||||
|
"invalidView": 0,
|
||||||
|
"invalidViewField": 0,
|
||||||
|
"totalErrors": 0,
|
||||||
|
},
|
||||||
|
"userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)",
|
||||||
|
},
|
||||||
|
"message": "Multiple validation errors occurred while updating field",
|
||||||
|
"name": "GraphQLError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
+17
-3
@@ -1,6 +1,8 @@
|
|||||||
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
|
import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
|
|
||||||
describe('createOne FieldMetadataService name/label sync', () => {
|
describe('createOne FieldMetadataService name/label sync', () => {
|
||||||
@@ -24,6 +26,15 @@ describe('createOne FieldMetadataService name/label sync', () => {
|
|||||||
createdObjectMetadataId = objectMetadataId;
|
createdObjectMetadataId = objectMetadataId;
|
||||||
});
|
});
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: createdObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: createdObjectMetadataId },
|
input: { idToDelete: createdObjectMetadataId },
|
||||||
});
|
});
|
||||||
@@ -89,7 +100,7 @@ describe('createOne FieldMetadataService name/label sync', () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
const { errors } = await createOneFieldMetadata({
|
const response = await createOneFieldMetadata({
|
||||||
input: createFieldInput,
|
input: createFieldInput,
|
||||||
gqlFields: `
|
gqlFields: `
|
||||||
id
|
id
|
||||||
@@ -101,8 +112,11 @@ describe('createOne FieldMetadataService name/label sync', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
expect(errors[0].message).toBe(
|
expect(response.errors.length).toBe(1);
|
||||||
'Name is not synced with label. Expected name: "differentLabel", got testField',
|
const [firstError] = response.errors;
|
||||||
|
|
||||||
|
expect(firstError).toMatchSnapshot(
|
||||||
|
extractRecordIdsAndDatesAsExpectAny(firstError),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
+32
-6
@@ -1,12 +1,9 @@
|
|||||||
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
||||||
import { deleteOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/delete-one-field-metadata.util';
|
import { deleteOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/delete-one-field-metadata.util';
|
||||||
import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/update-one-field-metadata.util';
|
import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/update-one-field-metadata.util';
|
||||||
import {
|
|
||||||
LISTING_NAME_PLURAL,
|
|
||||||
LISTING_NAME_SINGULAR,
|
|
||||||
} from 'test/integration/metadata/suites/object-metadata/constants/test-object-names.constant';
|
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import {
|
import {
|
||||||
createTestViewWithRestApi,
|
createTestViewWithRestApi,
|
||||||
findViewByIdWithRestApi,
|
findViewByIdWithRestApi,
|
||||||
@@ -14,11 +11,28 @@ import {
|
|||||||
import { generateRecordName } from 'test/integration/utils/generate-record-name';
|
import { generateRecordName } from 'test/integration/utils/generate-record-name';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
|
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
||||||
|
|
||||||
import { AggregateOperations } from 'src/engine/api/graphql/graphql-query-runner/constants/aggregate-operations.constant';
|
import { AggregateOperations } from 'src/engine/api/graphql/graphql-query-runner/constants/aggregate-operations.constant';
|
||||||
|
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
||||||
import { ViewType } from 'src/engine/core-modules/view/enums/view-type.enum';
|
import { ViewType } from 'src/engine/core-modules/view/enums/view-type.enum';
|
||||||
|
|
||||||
describe('deleteOne', () => {
|
describe('deleteOne', () => {
|
||||||
|
beforeAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: false,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
describe('Kanban aggregate operation', () => {
|
describe('Kanban aggregate operation', () => {
|
||||||
let listingObjectId = '';
|
let listingObjectId = '';
|
||||||
let testFieldId = '';
|
let testFieldId = '';
|
||||||
@@ -28,8 +42,8 @@ describe('deleteOne', () => {
|
|||||||
const { data } = await createOneObjectMetadata({
|
const { data } = await createOneObjectMetadata({
|
||||||
expectToFail: false,
|
expectToFail: false,
|
||||||
input: {
|
input: {
|
||||||
nameSingular: LISTING_NAME_SINGULAR,
|
nameSingular: 'listingv2',
|
||||||
namePlural: LISTING_NAME_PLURAL,
|
namePlural: 'listingsv2',
|
||||||
labelSingular: 'Listing',
|
labelSingular: 'Listing',
|
||||||
labelPlural: 'Listings',
|
labelPlural: 'Listings',
|
||||||
icon: 'IconBuildingSkyscraper',
|
icon: 'IconBuildingSkyscraper',
|
||||||
@@ -61,11 +75,21 @@ describe('deleteOne', () => {
|
|||||||
viewId = createdView.id;
|
viewId = createdView.id;
|
||||||
});
|
});
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: listingObjectId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
expectToFail: false,
|
expectToFail: false,
|
||||||
input: { idToDelete: listingObjectId },
|
input: { idToDelete: listingObjectId },
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should reset kanban aggregate operation when deleting a field used as kanbanAggregateOperationFieldMetadataId', async () => {
|
it('should reset kanban aggregate operation when deleting a field used as kanbanAggregateOperationFieldMetadataId', async () => {
|
||||||
const viewThatShouldBeUpdated = await findViewByIdWithRestApi(viewId);
|
const viewThatShouldBeUpdated = await findViewByIdWithRestApi(viewId);
|
||||||
|
|
||||||
@@ -79,6 +103,7 @@ describe('deleteOne', () => {
|
|||||||
expect(viewThatShouldBeUpdated.kanbanAggregateOperation).toBe('MAX');
|
expect(viewThatShouldBeUpdated.kanbanAggregateOperation).toBe('MAX');
|
||||||
|
|
||||||
await updateOneFieldMetadata({
|
await updateOneFieldMetadata({
|
||||||
|
expectToFail: false,
|
||||||
input: {
|
input: {
|
||||||
idToUpdate: testFieldId,
|
idToUpdate: testFieldId,
|
||||||
updatePayload: { isActive: false },
|
updatePayload: { isActive: false },
|
||||||
@@ -90,6 +115,7 @@ describe('deleteOne', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const { data } = await deleteOneFieldMetadata({
|
const { data } = await deleteOneFieldMetadata({
|
||||||
|
expectToFail: false,
|
||||||
input: { idToDelete: testFieldId },
|
input: { idToDelete: testFieldId },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
-461
@@ -516,464 +516,3 @@ exports[`Failing create field metadata MULTI_SELECT tests suite Create should fa
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with an invalid default value 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Default value should be as quoted string",
|
|
||||||
},
|
|
||||||
"message": "Default value should be as quoted string",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with an unknown default value 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Default value "'OPTION_424242'" must be one of the option values",
|
|
||||||
},
|
|
||||||
"message": "Default value "'OPTION_424242'" must be one of the option values",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with comma in option label 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Label must not contain a comma",
|
|
||||||
},
|
|
||||||
"message": "Label must not contain a comma",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with duplicated option ids 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Duplicated option id",
|
|
||||||
},
|
|
||||||
"message": "Duplicated option id",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with duplicated option positions 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Duplicated option position",
|
|
||||||
},
|
|
||||||
"message": "Duplicated option position",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with duplicated option values 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Duplicated option value",
|
|
||||||
},
|
|
||||||
"message": "Duplicated option value",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with duplicated trimmed option values 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Duplicated option value",
|
|
||||||
},
|
|
||||||
"message": "Duplicated option value",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with empty options 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "An error occurred.",
|
|
||||||
},
|
|
||||||
"message": "Options are required for enum fields",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with empty string defaultValue 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Default value should be as quoted string",
|
|
||||||
},
|
|
||||||
"message": "Default value should be as quoted string",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with empty string id 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Option id is invalid",
|
|
||||||
},
|
|
||||||
"message": "Option id is invalid",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with empty string label 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Option label "" is beneath 1 character",
|
|
||||||
},
|
|
||||||
"message": "Option label "" is beneath 1 character",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with empty string value 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Option value "" is beneath 1 character",
|
|
||||||
},
|
|
||||||
"message": "Option value "" is beneath 1 character",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with invalid option id 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Option id is invalid",
|
|
||||||
},
|
|
||||||
"message": "Option id is invalid",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with invalid option value format 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case "Option 1 and some other things, /"",
|
|
||||||
},
|
|
||||||
"message": "Value must be in UPPER_CASE and follow snake_case "Option 1 and some other things, /"",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with not a string defaultValue 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "An error occurred.",
|
|
||||||
},
|
|
||||||
"message": "Default value for multi-select must be a stringified array",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with not a string id 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Option id is invalid",
|
|
||||||
},
|
|
||||||
"message": "Option id is invalid",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with not a string label 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "INTERNAL_SERVER_ERROR",
|
|
||||||
"exceptionEventId": "mocked-exception-id",
|
|
||||||
"userFriendlyMessage": "An error occurred.",
|
|
||||||
},
|
|
||||||
"message": "label.includes is not a function",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with not a string value 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case "22222"",
|
|
||||||
},
|
|
||||||
"message": "Value must be in UPPER_CASE and follow snake_case "22222"",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with null id 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Option id is required",
|
|
||||||
},
|
|
||||||
"message": "Option id is required",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with null label 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Option label is required",
|
|
||||||
},
|
|
||||||
"message": "Option label is required",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with null options 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "An error occurred.",
|
|
||||||
},
|
|
||||||
"message": "Options are required for enum fields",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with null value 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Option value is required",
|
|
||||||
},
|
|
||||||
"message": "Option value is required",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with only white spaces defaultValue 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Default value should be as quoted string",
|
|
||||||
},
|
|
||||||
"message": "Default value should be as quoted string",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with only white spaces id 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Option id is invalid",
|
|
||||||
},
|
|
||||||
"message": "Option id is invalid",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with only white spaces label 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Option label "" is beneath 1 character",
|
|
||||||
},
|
|
||||||
"message": "Option label "" is beneath 1 character",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with only white spaces value 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Option value "" is beneath 1 character",
|
|
||||||
},
|
|
||||||
"message": "Option value "" is beneath 1 character",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with too long defaultValue 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Default value should be as quoted string",
|
|
||||||
},
|
|
||||||
"message": "Default value should be as quoted string",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with too long id 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Option id is invalid",
|
|
||||||
},
|
|
||||||
"message": "Option id is invalid",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with too long label 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Option label exceeds 63 characters",
|
|
||||||
},
|
|
||||||
"message": "Option label exceeds 63 characters",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with too long value 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Option value exceeds 63 characters",
|
|
||||||
},
|
|
||||||
"message": "Option value exceeds 63 characters",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with undefined option label 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Option label is required",
|
|
||||||
},
|
|
||||||
"message": "Option label is required",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with undefined option value 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "Option value is required",
|
|
||||||
},
|
|
||||||
"message": "Option value is required",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`Failing create field metadata SELECT tests suite Create should fail with undefined options 1`] = `
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"extensions": {
|
|
||||||
"code": "BAD_USER_INPUT",
|
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
|
||||||
"userFriendlyMessage": "An error occurred.",
|
|
||||||
},
|
|
||||||
"message": "Options are required for enum fields",
|
|
||||||
"name": "UserInputError",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
`;
|
|
||||||
+462
@@ -0,0 +1,462 @@
|
|||||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with an invalid default value 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Default value should be as quoted string",
|
||||||
|
},
|
||||||
|
"message": "Default value should be as quoted string",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with an unknown default value 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Default value "'OPTION_424242'" must be one of the option values",
|
||||||
|
},
|
||||||
|
"message": "Default value "'OPTION_424242'" must be one of the option values",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with comma in option label 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Label must not contain a comma",
|
||||||
|
},
|
||||||
|
"message": "Label must not contain a comma",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with duplicated option ids 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Duplicated option id",
|
||||||
|
},
|
||||||
|
"message": "Duplicated option id",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with duplicated option positions 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Duplicated option position",
|
||||||
|
},
|
||||||
|
"message": "Duplicated option position",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with duplicated option values 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Duplicated option value",
|
||||||
|
},
|
||||||
|
"message": "Duplicated option value",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with duplicated trimmed option values 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Duplicated option value",
|
||||||
|
},
|
||||||
|
"message": "Duplicated option value",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with empty options 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "An error occurred.",
|
||||||
|
},
|
||||||
|
"message": "Options are required for enum fields",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with empty string defaultValue 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Default value should be as quoted string",
|
||||||
|
},
|
||||||
|
"message": "Default value should be as quoted string",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with empty string id 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Option id is invalid",
|
||||||
|
},
|
||||||
|
"message": "Option id is invalid",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with empty string label 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Option label "" is beneath 1 character",
|
||||||
|
},
|
||||||
|
"message": "Option label "" is beneath 1 character",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with empty string value 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Option value "" is beneath 1 character",
|
||||||
|
},
|
||||||
|
"message": "Option value "" is beneath 1 character",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with invalid option id 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Option id is invalid",
|
||||||
|
},
|
||||||
|
"message": "Option id is invalid",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with invalid option value format 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case "Option 1 and some other things, /"",
|
||||||
|
},
|
||||||
|
"message": "Value must be in UPPER_CASE and follow snake_case "Option 1 and some other things, /"",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with not a string defaultValue 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "An error occurred.",
|
||||||
|
},
|
||||||
|
"message": "Default value for multi-select must be a stringified array",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with not a string id 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Option id is invalid",
|
||||||
|
},
|
||||||
|
"message": "Option id is invalid",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with not a string label 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "INTERNAL_SERVER_ERROR",
|
||||||
|
"exceptionEventId": "mocked-exception-id",
|
||||||
|
"userFriendlyMessage": "An error occurred.",
|
||||||
|
},
|
||||||
|
"message": "label.includes is not a function",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with not a string value 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case "22222"",
|
||||||
|
},
|
||||||
|
"message": "Value must be in UPPER_CASE and follow snake_case "22222"",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with null id 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Option id is required",
|
||||||
|
},
|
||||||
|
"message": "Option id is required",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with null label 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Option label is required",
|
||||||
|
},
|
||||||
|
"message": "Option label is required",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with null options 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "An error occurred.",
|
||||||
|
},
|
||||||
|
"message": "Options are required for enum fields",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with null value 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Option value is required",
|
||||||
|
},
|
||||||
|
"message": "Option value is required",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with only white spaces defaultValue 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Default value should be as quoted string",
|
||||||
|
},
|
||||||
|
"message": "Default value should be as quoted string",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with only white spaces id 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Option id is invalid",
|
||||||
|
},
|
||||||
|
"message": "Option id is invalid",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with only white spaces label 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Option label "" is beneath 1 character",
|
||||||
|
},
|
||||||
|
"message": "Option label "" is beneath 1 character",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with only white spaces value 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Option value "" is beneath 1 character",
|
||||||
|
},
|
||||||
|
"message": "Option value "" is beneath 1 character",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with too long defaultValue 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Default value should be as quoted string",
|
||||||
|
},
|
||||||
|
"message": "Default value should be as quoted string",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with too long id 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Option id is invalid",
|
||||||
|
},
|
||||||
|
"message": "Option id is invalid",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with too long label 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Option label exceeds 63 characters",
|
||||||
|
},
|
||||||
|
"message": "Option label exceeds 63 characters",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with too long value 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Option value exceeds 63 characters",
|
||||||
|
},
|
||||||
|
"message": "Option value exceeds 63 characters",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with undefined option label 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Option label is required",
|
||||||
|
},
|
||||||
|
"message": "Option label is required",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with undefined option value 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "Option value is required",
|
||||||
|
},
|
||||||
|
"message": "Option value is required",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`Failing create field metadata RATING tests suite Create should fail with undefined options 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"subCode": "INVALID_FIELD_INPUT",
|
||||||
|
"userFriendlyMessage": "An error occurred.",
|
||||||
|
},
|
||||||
|
"message": "Options are required for enum fields",
|
||||||
|
"name": "UserInputError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
+11
-27
@@ -4,12 +4,10 @@ import { CUSTOM_OBJECT_DISHES } from 'test/integration/metadata/suites/object-me
|
|||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
|
||||||
import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any';
|
import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any';
|
||||||
import { eachTestingContextFilter } from 'twenty-shared/testing';
|
import { eachTestingContextFilter } from 'twenty-shared/testing';
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
|
|
||||||
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
|
||||||
import { fieldMetadataEnumTypes } from 'src/engine/metadata-modules/field-metadata/utils/is-enum-field-metadata-type.util';
|
import { fieldMetadataEnumTypes } from 'src/engine/metadata-modules/field-metadata/utils/is-enum-field-metadata-type.util';
|
||||||
|
|
||||||
describe.each(fieldMetadataEnumTypes)(
|
describe.each(fieldMetadataEnumTypes)(
|
||||||
@@ -25,12 +23,6 @@ describe.each(fieldMetadataEnumTypes)(
|
|||||||
const { failing: failingTestCases } = testCases;
|
const { failing: failingTestCases } = testCases;
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
labelPlural,
|
labelPlural,
|
||||||
description,
|
description,
|
||||||
@@ -55,25 +47,17 @@ describe.each(fieldMetadataEnumTypes)(
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
try {
|
await updateOneObjectMetadata({
|
||||||
await updateOneObjectMetadata({
|
expectToFail: false,
|
||||||
expectToFail: false,
|
input: {
|
||||||
input: {
|
idToUpdate: createdObjectMetadataId,
|
||||||
idToUpdate: createdObjectMetadataId,
|
updatePayload: { isActive: false },
|
||||||
updatePayload: { isActive: false },
|
},
|
||||||
},
|
});
|
||||||
});
|
await deleteOneObjectMetadata({
|
||||||
await deleteOneObjectMetadata({
|
expectToFail: false,
|
||||||
expectToFail: false,
|
input: { idToDelete: createdObjectMetadataId },
|
||||||
input: { idToDelete: createdObjectMetadataId },
|
});
|
||||||
});
|
|
||||||
} finally {
|
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: false,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test.each(eachTestingContextFilter(failingTestCases))(
|
test.each(eachTestingContextFilter(failingTestCases))(
|
||||||
|
|||||||
-74
@@ -1,74 +0,0 @@
|
|||||||
import { CREATE_ENUM_FIELD_METADATA_TEST_CASES } from 'test/integration/metadata/suites/field-metadata/enum/common/create-enum-field-metadata-test-cases';
|
|
||||||
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
|
||||||
import {
|
|
||||||
LISTING_NAME_PLURAL,
|
|
||||||
LISTING_NAME_SINGULAR,
|
|
||||||
} from 'test/integration/metadata/suites/object-metadata/constants/test-object-names.constant';
|
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
|
||||||
|
|
||||||
import { fieldMetadataEnumTypes } from 'src/engine/metadata-modules/field-metadata/utils/is-enum-field-metadata-type.util';
|
|
||||||
|
|
||||||
describe.each(fieldMetadataEnumTypes)(
|
|
||||||
'Failing create field metadata %s tests suite',
|
|
||||||
(testedFieldMetadataType) => {
|
|
||||||
let createdObjectMetadataId: string;
|
|
||||||
const testCases =
|
|
||||||
CREATE_ENUM_FIELD_METADATA_TEST_CASES[testedFieldMetadataType];
|
|
||||||
|
|
||||||
if (!isDefined(testCases)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const { failing: failingTestCases } = testCases;
|
|
||||||
|
|
||||||
beforeAll(async () => {
|
|
||||||
const { data } = await createOneObjectMetadata({
|
|
||||||
expectToFail: false,
|
|
||||||
input: {
|
|
||||||
labelSingular: LISTING_NAME_SINGULAR,
|
|
||||||
labelPlural: LISTING_NAME_PLURAL,
|
|
||||||
nameSingular: LISTING_NAME_SINGULAR,
|
|
||||||
namePlural: LISTING_NAME_PLURAL,
|
|
||||||
icon: 'IconBuildingSkyscraper',
|
|
||||||
isLabelSyncedWithName: false,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
createdObjectMetadataId = data.createOneObject.id;
|
|
||||||
});
|
|
||||||
|
|
||||||
afterAll(async () => {
|
|
||||||
await deleteOneObjectMetadata({
|
|
||||||
expectToFail: false,
|
|
||||||
input: { idToDelete: createdObjectMetadataId },
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.each(failingTestCases)(
|
|
||||||
'Create $title',
|
|
||||||
async ({ context: { input } }) => {
|
|
||||||
const { data, errors } = await createOneFieldMetadata({
|
|
||||||
expectToFail: true,
|
|
||||||
input: {
|
|
||||||
objectMetadataId: createdObjectMetadataId,
|
|
||||||
type: testedFieldMetadataType,
|
|
||||||
name: 'testField',
|
|
||||||
label: 'Test Field',
|
|
||||||
isLabelSyncedWithName: false,
|
|
||||||
...input,
|
|
||||||
},
|
|
||||||
gqlFields: `
|
|
||||||
id
|
|
||||||
options
|
|
||||||
defaultValue
|
|
||||||
`,
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(data).toBeNull();
|
|
||||||
expect(errors).toBeDefined();
|
|
||||||
expect(errors).toMatchSnapshot();
|
|
||||||
},
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
+85
@@ -0,0 +1,85 @@
|
|||||||
|
import { CREATE_ENUM_FIELD_METADATA_TEST_CASES } from 'test/integration/metadata/suites/field-metadata/enum/common/create-enum-field-metadata-test-cases';
|
||||||
|
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
||||||
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
||||||
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
|
|
||||||
|
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
||||||
|
|
||||||
|
describe('Failing create field metadata MULTI_SELECT tests suite', () => {
|
||||||
|
let createdObjectMetadataId: string;
|
||||||
|
const testCases =
|
||||||
|
CREATE_ENUM_FIELD_METADATA_TEST_CASES[FieldMetadataType.MULTI_SELECT];
|
||||||
|
|
||||||
|
if (!isDefined(testCases)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const { failing: failingTestCases } = testCases;
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: false,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
const { data } = await createOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
labelSingular: 'Enum testing v1',
|
||||||
|
labelPlural: 'Enums testings v1',
|
||||||
|
nameSingular: 'enumTestingV1',
|
||||||
|
namePlural: 'enumsTestingsV1',
|
||||||
|
icon: 'IconBuildingSkyscraper',
|
||||||
|
isLabelSyncedWithName: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
createdObjectMetadataId = data.createOneObject.id;
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await deleteOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: { idToDelete: createdObjectMetadataId },
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.each(failingTestCases)(
|
||||||
|
'Create $title',
|
||||||
|
async ({ context: { input } }) => {
|
||||||
|
const { data, errors } = await createOneFieldMetadata({
|
||||||
|
expectToFail: true,
|
||||||
|
input: {
|
||||||
|
objectMetadataId: createdObjectMetadataId,
|
||||||
|
type: FieldMetadataType.MULTI_SELECT,
|
||||||
|
name: 'testField',
|
||||||
|
label: 'Test Field',
|
||||||
|
isLabelSyncedWithName: false,
|
||||||
|
...input,
|
||||||
|
},
|
||||||
|
gqlFields: `
|
||||||
|
id
|
||||||
|
options
|
||||||
|
defaultValue
|
||||||
|
`,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(data).toBeNull();
|
||||||
|
expect(errors).toBeDefined();
|
||||||
|
expect(errors).toMatchSnapshot();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
+85
@@ -0,0 +1,85 @@
|
|||||||
|
import { CREATE_ENUM_FIELD_METADATA_TEST_CASES } from 'test/integration/metadata/suites/field-metadata/enum/common/create-enum-field-metadata-test-cases';
|
||||||
|
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
||||||
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
||||||
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
|
|
||||||
|
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
||||||
|
|
||||||
|
describe('Failing create field metadata RATING tests suite', () => {
|
||||||
|
let createdObjectMetadataId: string;
|
||||||
|
const testCases =
|
||||||
|
CREATE_ENUM_FIELD_METADATA_TEST_CASES[FieldMetadataType.SELECT];
|
||||||
|
|
||||||
|
if (!isDefined(testCases)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const { failing: failingTestCases } = testCases;
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: false,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
const { data } = await createOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
labelSingular: 'Enum testing v1',
|
||||||
|
labelPlural: 'Enums testings v1',
|
||||||
|
nameSingular: 'enumTestingV1',
|
||||||
|
namePlural: 'enumsTestingsV1',
|
||||||
|
icon: 'IconBuildingSkyscraper',
|
||||||
|
isLabelSyncedWithName: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
createdObjectMetadataId = data.createOneObject.id;
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await deleteOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: { idToDelete: createdObjectMetadataId },
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.each(failingTestCases)(
|
||||||
|
'Create $title',
|
||||||
|
async ({ context: { input } }) => {
|
||||||
|
const { data, errors } = await createOneFieldMetadata({
|
||||||
|
expectToFail: true,
|
||||||
|
input: {
|
||||||
|
objectMetadataId: createdObjectMetadataId,
|
||||||
|
type: FieldMetadataType.SELECT,
|
||||||
|
name: 'testField',
|
||||||
|
label: 'Test Field',
|
||||||
|
isLabelSyncedWithName: false,
|
||||||
|
...input,
|
||||||
|
},
|
||||||
|
gqlFields: `
|
||||||
|
id
|
||||||
|
options
|
||||||
|
defaultValue
|
||||||
|
`,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(data).toBeNull();
|
||||||
|
expect(errors).toBeDefined();
|
||||||
|
expect(errors).toMatchSnapshot();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
+14
-30
@@ -6,12 +6,10 @@ import { CUSTOM_OBJECT_DISHES } from 'test/integration/metadata/suites/object-me
|
|||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
|
||||||
import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any';
|
import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any';
|
||||||
import { eachTestingContextFilter } from 'twenty-shared/testing';
|
import { eachTestingContextFilter } from 'twenty-shared/testing';
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
|
|
||||||
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
|
||||||
import { fieldMetadataEnumTypes } from 'src/engine/metadata-modules/field-metadata/utils/is-enum-field-metadata-type.util';
|
import { fieldMetadataEnumTypes } from 'src/engine/metadata-modules/field-metadata/utils/is-enum-field-metadata-type.util';
|
||||||
|
|
||||||
describe.each(fieldMetadataEnumTypes)(
|
describe.each(fieldMetadataEnumTypes)(
|
||||||
@@ -42,12 +40,6 @@ describe.each(fieldMetadataEnumTypes)(
|
|||||||
];
|
];
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
labelPlural,
|
labelPlural,
|
||||||
description,
|
description,
|
||||||
@@ -90,30 +82,22 @@ describe.each(fieldMetadataEnumTypes)(
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
try {
|
await updateOneObjectMetadata({
|
||||||
await updateOneObjectMetadata({
|
expectToFail: false,
|
||||||
expectToFail: false,
|
input: {
|
||||||
input: {
|
idToUpdate: createdObjectMetadataId,
|
||||||
idToUpdate: createdObjectMetadataId,
|
updatePayload: {
|
||||||
updatePayload: {
|
isActive: false,
|
||||||
isActive: false,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
});
|
},
|
||||||
|
});
|
||||||
|
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: {
|
input: {
|
||||||
idToDelete: createdObjectMetadataId,
|
idToDelete: createdObjectMetadataId,
|
||||||
},
|
},
|
||||||
expectToFail: false,
|
expectToFail: false,
|
||||||
});
|
});
|
||||||
} finally {
|
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: false,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test.each(eachTestingContextFilter(failingTestCases))(
|
test.each(eachTestingContextFilter(failingTestCases))(
|
||||||
|
|||||||
+23
-19
@@ -2,15 +2,12 @@ import { UPDATE_ENUM_FIELD_METADATA_TEST_CASES } from 'test/integration/metadata
|
|||||||
import { type CreateOneFieldFactoryInput } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata-query-factory.util';
|
import { type CreateOneFieldFactoryInput } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata-query-factory.util';
|
||||||
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
||||||
import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/update-one-field-metadata.util';
|
import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/update-one-field-metadata.util';
|
||||||
import {
|
|
||||||
LISTING_NAME_PLURAL,
|
|
||||||
LISTING_NAME_SINGULAR,
|
|
||||||
} from 'test/integration/metadata/suites/object-metadata/constants/test-object-names.constant';
|
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
|
|
||||||
|
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
||||||
import { fieldMetadataEnumTypes } from 'src/engine/metadata-modules/field-metadata/utils/is-enum-field-metadata-type.util';
|
import { fieldMetadataEnumTypes } from 'src/engine/metadata-modules/field-metadata/utils/is-enum-field-metadata-type.util';
|
||||||
|
|
||||||
describe.each(fieldMetadataEnumTypes)(
|
describe.each(fieldMetadataEnumTypes)(
|
||||||
@@ -25,6 +22,15 @@ describe.each(fieldMetadataEnumTypes)(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const { failing: failingTestCases } = testCases;
|
const { failing: failingTestCases } = testCases;
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: false,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
const initialOptions: CreateOneFieldFactoryInput['options'] = [
|
const initialOptions: CreateOneFieldFactoryInput['options'] = [
|
||||||
{
|
{
|
||||||
label: 'Option 1',
|
label: 'Option 1',
|
||||||
@@ -44,10 +50,10 @@ describe.each(fieldMetadataEnumTypes)(
|
|||||||
const { data } = await createOneObjectMetadata({
|
const { data } = await createOneObjectMetadata({
|
||||||
expectToFail: false,
|
expectToFail: false,
|
||||||
input: {
|
input: {
|
||||||
labelSingular: LISTING_NAME_SINGULAR,
|
labelSingular: 'failingUpdateEnumField',
|
||||||
labelPlural: LISTING_NAME_PLURAL,
|
labelPlural: 'failingUpdateEnumFields',
|
||||||
nameSingular: LISTING_NAME_SINGULAR,
|
nameSingular: 'failingUpdateEnumField',
|
||||||
namePlural: LISTING_NAME_PLURAL,
|
namePlural: 'failingUpdateEnumFields',
|
||||||
icon: 'IconBuildingSkyscraper',
|
icon: 'IconBuildingSkyscraper',
|
||||||
isLabelSyncedWithName: false,
|
isLabelSyncedWithName: false,
|
||||||
},
|
},
|
||||||
@@ -76,16 +82,6 @@ describe.each(fieldMetadataEnumTypes)(
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
await updateOneObjectMetadata({
|
|
||||||
expectToFail: false,
|
|
||||||
input: {
|
|
||||||
idToUpdate: createdObjectMetadataId,
|
|
||||||
updatePayload: {
|
|
||||||
isActive: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: {
|
input: {
|
||||||
idToDelete: createdObjectMetadataId,
|
idToDelete: createdObjectMetadataId,
|
||||||
@@ -94,6 +90,14 @@ describe.each(fieldMetadataEnumTypes)(
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
test.each(failingTestCases)(
|
test.each(failingTestCases)(
|
||||||
'Update $title',
|
'Update $title',
|
||||||
async ({ context: { input } }) => {
|
async ({ context: { input } }) => {
|
||||||
|
|||||||
+11
-27
@@ -6,11 +6,9 @@ import { CUSTOM_OBJECT_DISHES } from 'test/integration/metadata/suites/object-me
|
|||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
|
||||||
import { eachTestingContextFilter } from 'twenty-shared/testing';
|
import { eachTestingContextFilter } from 'twenty-shared/testing';
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
|
|
||||||
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
|
||||||
import { fieldMetadataEnumTypes } from 'src/engine/metadata-modules/field-metadata/utils/is-enum-field-metadata-type.util';
|
import { fieldMetadataEnumTypes } from 'src/engine/metadata-modules/field-metadata/utils/is-enum-field-metadata-type.util';
|
||||||
|
|
||||||
describe.each(fieldMetadataEnumTypes)(
|
describe.each(fieldMetadataEnumTypes)(
|
||||||
@@ -27,12 +25,6 @@ describe.each(fieldMetadataEnumTypes)(
|
|||||||
const { successful: successfulTestCases } = testCases;
|
const { successful: successfulTestCases } = testCases;
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
labelPlural,
|
labelPlural,
|
||||||
description,
|
description,
|
||||||
@@ -57,25 +49,17 @@ describe.each(fieldMetadataEnumTypes)(
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
try {
|
await updateOneObjectMetadata({
|
||||||
await updateOneObjectMetadata({
|
expectToFail: false,
|
||||||
expectToFail: false,
|
input: {
|
||||||
input: {
|
idToUpdate: createdObjectMetadataId,
|
||||||
idToUpdate: createdObjectMetadataId,
|
updatePayload: { isActive: false },
|
||||||
updatePayload: { isActive: false },
|
},
|
||||||
},
|
});
|
||||||
});
|
await deleteOneObjectMetadata({
|
||||||
await deleteOneObjectMetadata({
|
expectToFail: false,
|
||||||
expectToFail: false,
|
input: { idToDelete: createdObjectMetadataId },
|
||||||
input: { idToDelete: createdObjectMetadataId },
|
});
|
||||||
});
|
|
||||||
} finally {
|
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: false,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
|||||||
+22
-8
@@ -1,14 +1,12 @@
|
|||||||
import { CREATE_ENUM_FIELD_METADATA_TEST_CASES } from 'test/integration/metadata/suites/field-metadata/enum/common/create-enum-field-metadata-test-cases';
|
import { CREATE_ENUM_FIELD_METADATA_TEST_CASES } from 'test/integration/metadata/suites/field-metadata/enum/common/create-enum-field-metadata-test-cases';
|
||||||
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
||||||
import {
|
|
||||||
LISTING_NAME_PLURAL,
|
|
||||||
LISTING_NAME_SINGULAR,
|
|
||||||
} from 'test/integration/metadata/suites/object-metadata/constants/test-object-names.constant';
|
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
|
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
|
|
||||||
|
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
||||||
import { fieldMetadataEnumTypes } from 'src/engine/metadata-modules/field-metadata/utils/is-enum-field-metadata-type.util';
|
import { fieldMetadataEnumTypes } from 'src/engine/metadata-modules/field-metadata/utils/is-enum-field-metadata-type.util';
|
||||||
|
|
||||||
describe.each(fieldMetadataEnumTypes)(
|
describe.each(fieldMetadataEnumTypes)(
|
||||||
@@ -23,14 +21,30 @@ describe.each(fieldMetadataEnumTypes)(
|
|||||||
}
|
}
|
||||||
const { successful: successfulTestCases } = testCases;
|
const { successful: successfulTestCases } = testCases;
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: false,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
const { data } = await createOneObjectMetadata({
|
const { data } = await createOneObjectMetadata({
|
||||||
expectToFail: false,
|
expectToFail: false,
|
||||||
input: {
|
input: {
|
||||||
labelSingular: LISTING_NAME_SINGULAR,
|
labelSingular: 'successCreateEnumField',
|
||||||
labelPlural: LISTING_NAME_PLURAL,
|
labelPlural: 'successCreateEnumFields',
|
||||||
nameSingular: LISTING_NAME_SINGULAR,
|
nameSingular: 'successCreateEnumField',
|
||||||
namePlural: LISTING_NAME_PLURAL,
|
namePlural: 'successCreateEnumFields',
|
||||||
icon: 'IconBuildingSkyscraper',
|
icon: 'IconBuildingSkyscraper',
|
||||||
isLabelSyncedWithName: false,
|
isLabelSyncedWithName: false,
|
||||||
},
|
},
|
||||||
|
|||||||
+12
-28
@@ -7,17 +7,15 @@ import { CUSTOM_OBJECT_DISHES } from 'test/integration/metadata/suites/object-me
|
|||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
|
||||||
import { eachTestingContextFilter } from 'twenty-shared/testing';
|
import { eachTestingContextFilter } from 'twenty-shared/testing';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
|
|
||||||
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
import { fieldMetadataEnumTypes } from 'src/engine/metadata-modules/field-metadata/utils/is-enum-field-metadata-type.util';
|
||||||
import {
|
import {
|
||||||
type FieldMetadataComplexOption,
|
type FieldMetadataComplexOption,
|
||||||
type FieldMetadataDefaultOption,
|
type FieldMetadataDefaultOption,
|
||||||
} from 'src/engine/metadata-modules/field-metadata/dtos/options.input';
|
} from 'src/engine/metadata-modules/field-metadata/dtos/options.input';
|
||||||
import { fieldMetadataEnumTypes } from 'src/engine/metadata-modules/field-metadata/utils/is-enum-field-metadata-type.util';
|
|
||||||
|
|
||||||
describe.each(fieldMetadataEnumTypes)(
|
describe.each(fieldMetadataEnumTypes)(
|
||||||
'Successful update field metadata %s tests suite v2',
|
'Successful update field metadata %s tests suite v2',
|
||||||
@@ -47,12 +45,6 @@ describe.each(fieldMetadataEnumTypes)(
|
|||||||
];
|
];
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
labelPlural,
|
labelPlural,
|
||||||
description,
|
description,
|
||||||
@@ -76,25 +68,17 @@ describe.each(fieldMetadataEnumTypes)(
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
try {
|
await updateOneObjectMetadata({
|
||||||
await updateOneObjectMetadata({
|
expectToFail: false,
|
||||||
expectToFail: false,
|
input: {
|
||||||
input: {
|
idToUpdate: createdObjectMetadataId,
|
||||||
idToUpdate: createdObjectMetadataId,
|
updatePayload: { isActive: false },
|
||||||
updatePayload: { isActive: false },
|
},
|
||||||
},
|
});
|
||||||
});
|
await deleteOneObjectMetadata({
|
||||||
await deleteOneObjectMetadata({
|
expectToFail: false,
|
||||||
expectToFail: false,
|
input: { idToDelete: createdObjectMetadataId },
|
||||||
input: { idToDelete: createdObjectMetadataId },
|
});
|
||||||
});
|
|
||||||
} finally {
|
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: false,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
|
|||||||
+23
-8
@@ -2,16 +2,14 @@ import { UPDATE_ENUM_FIELD_METADATA_TEST_CASES } from 'test/integration/metadata
|
|||||||
import { type CreateOneFieldFactoryInput } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata-query-factory.util';
|
import { type CreateOneFieldFactoryInput } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata-query-factory.util';
|
||||||
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
||||||
import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/update-one-field-metadata.util';
|
import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/update-one-field-metadata.util';
|
||||||
import {
|
|
||||||
LISTING_NAME_PLURAL,
|
|
||||||
LISTING_NAME_SINGULAR,
|
|
||||||
} from 'test/integration/metadata/suites/object-metadata/constants/test-object-names.constant';
|
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
|
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
|
|
||||||
|
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
||||||
import {
|
import {
|
||||||
type FieldMetadataComplexOption,
|
type FieldMetadataComplexOption,
|
||||||
type FieldMetadataDefaultOption,
|
type FieldMetadataDefaultOption,
|
||||||
@@ -30,6 +28,23 @@ describe.each(fieldMetadataEnumTypes)(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const { successful: successfulTestCases } = testCases;
|
const { successful: successfulTestCases } = testCases;
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: false,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
const initialOptions: CreateOneFieldFactoryInput['options'] = [
|
const initialOptions: CreateOneFieldFactoryInput['options'] = [
|
||||||
{
|
{
|
||||||
label: 'Option 1',
|
label: 'Option 1',
|
||||||
@@ -49,10 +64,10 @@ describe.each(fieldMetadataEnumTypes)(
|
|||||||
const { data } = await createOneObjectMetadata({
|
const { data } = await createOneObjectMetadata({
|
||||||
expectToFail: false,
|
expectToFail: false,
|
||||||
input: {
|
input: {
|
||||||
labelSingular: LISTING_NAME_SINGULAR,
|
labelSingular: 'successUpdateEnumField',
|
||||||
labelPlural: LISTING_NAME_PLURAL,
|
labelPlural: 'successUpdateEnumFields',
|
||||||
nameSingular: LISTING_NAME_SINGULAR,
|
nameSingular: 'successUpdateEnumField',
|
||||||
namePlural: LISTING_NAME_PLURAL,
|
namePlural: 'successUpdateEnumFields',
|
||||||
icon: 'IconBuildingSkyscraper',
|
icon: 'IconBuildingSkyscraper',
|
||||||
isLabelSyncedWithName: false,
|
isLabelSyncedWithName: false,
|
||||||
},
|
},
|
||||||
|
|||||||
+49
@@ -1,6 +1,8 @@
|
|||||||
import { createMorphRelationBetweenObjects } from 'test/integration/metadata/suites/object-metadata/utils/create-morph-relation-between-objects.util';
|
import { createMorphRelationBetweenObjects } from 'test/integration/metadata/suites/object-metadata/utils/create-morph-relation-between-objects.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
|
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
||||||
import {
|
import {
|
||||||
eachTestingContextFilter,
|
eachTestingContextFilter,
|
||||||
type EachTestingContext,
|
type EachTestingContext,
|
||||||
@@ -9,11 +11,29 @@ import { FieldMetadataType } from 'twenty-shared/types';
|
|||||||
|
|
||||||
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
||||||
|
|
||||||
|
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
||||||
|
|
||||||
describe('createOne FieldMetadataService morph relation fields', () => {
|
describe('createOne FieldMetadataService morph relation fields', () => {
|
||||||
let createdObjectMetadataPersonId = '';
|
let createdObjectMetadataPersonId = '';
|
||||||
let createdObjectMetadataOpportunityId = '';
|
let createdObjectMetadataOpportunityId = '';
|
||||||
let createdObjectMetadataCompanyId = '';
|
let createdObjectMetadataCompanyId = '';
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: false,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
const {
|
const {
|
||||||
data: {
|
data: {
|
||||||
@@ -67,14 +87,43 @@ describe('createOne FieldMetadataService morph relation fields', () => {
|
|||||||
createdObjectMetadataOpportunityId = objectMetadataOpportunityId;
|
createdObjectMetadataOpportunityId = objectMetadataOpportunityId;
|
||||||
});
|
});
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: createdObjectMetadataPersonId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
expectToFail: false,
|
expectToFail: false,
|
||||||
input: { idToDelete: createdObjectMetadataPersonId },
|
input: { idToDelete: createdObjectMetadataPersonId },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: createdObjectMetadataOpportunityId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
expectToFail: false,
|
expectToFail: false,
|
||||||
input: { idToDelete: createdObjectMetadataOpportunityId },
|
input: { idToDelete: createdObjectMetadataOpportunityId },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: createdObjectMetadataCompanyId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
expectToFail: false,
|
expectToFail: false,
|
||||||
input: { idToDelete: createdObjectMetadataCompanyId },
|
input: { idToDelete: createdObjectMetadataCompanyId },
|
||||||
|
|||||||
+30
@@ -3,6 +3,7 @@ import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-m
|
|||||||
import { createMorphRelationBetweenObjects } from 'test/integration/metadata/suites/object-metadata/utils/create-morph-relation-between-objects.util';
|
import { createMorphRelationBetweenObjects } from 'test/integration/metadata/suites/object-metadata/utils/create-morph-relation-between-objects.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { type EachTestingContext } from 'twenty-shared/testing';
|
import { type EachTestingContext } from 'twenty-shared/testing';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
|
|
||||||
@@ -63,12 +64,41 @@ describe('deleteOne FieldMetadataService morph relation fields', () => {
|
|||||||
createdObjectMetadataOpportunityId = objectMetadataOpportunityId;
|
createdObjectMetadataOpportunityId = objectMetadataOpportunityId;
|
||||||
});
|
});
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: createdObjectMetadataPersonId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: createdObjectMetadataPersonId },
|
input: { idToDelete: createdObjectMetadataPersonId },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: createdObjectMetadataOpportunityId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: createdObjectMetadataOpportunityId },
|
input: { idToDelete: createdObjectMetadataOpportunityId },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: createdObjectMetadataCompanyId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: createdObjectMetadataCompanyId },
|
input: { idToDelete: createdObjectMetadataCompanyId },
|
||||||
});
|
});
|
||||||
|
|||||||
+10
-28
@@ -3,7 +3,6 @@ import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-m
|
|||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
|
||||||
import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any';
|
import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any';
|
||||||
import {
|
import {
|
||||||
eachTestingContextFilter,
|
eachTestingContextFilter,
|
||||||
@@ -13,9 +12,7 @@ import { FieldMetadataType } from 'twenty-shared/types';
|
|||||||
|
|
||||||
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
||||||
|
|
||||||
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
|
||||||
import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input';
|
import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input';
|
||||||
import { SEED_APPLE_WORKSPACE_ID } from 'src/engine/workspace-manager/dev-seeder/core/utils/seed-workspaces.util';
|
|
||||||
|
|
||||||
type FailingTestCases = EachTestingContext<
|
type FailingTestCases = EachTestingContext<
|
||||||
(args: {
|
(args: {
|
||||||
@@ -351,13 +348,6 @@ describe('failing createOne FieldMetadataService morph relation fields v2', () =
|
|||||||
let createdObjectMetadataCompanyId: string;
|
let createdObjectMetadataCompanyId: string;
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: true,
|
|
||||||
workspaceId: SEED_APPLE_WORKSPACE_ID,
|
|
||||||
});
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
data: {
|
data: {
|
||||||
createOneObject: { id: objectMetadataPersonId },
|
createOneObject: { id: objectMetadataPersonId },
|
||||||
@@ -417,25 +407,17 @@ describe('failing createOne FieldMetadataService morph relation fields v2', () =
|
|||||||
createdObjectMetadataCompanyId,
|
createdObjectMetadataCompanyId,
|
||||||
];
|
];
|
||||||
|
|
||||||
try {
|
for (const objectMetadataId of createdObjectMetadataIds) {
|
||||||
for (const objectMetadataId of createdObjectMetadataIds) {
|
await updateOneObjectMetadata({
|
||||||
await updateOneObjectMetadata({
|
|
||||||
expectToFail: false,
|
|
||||||
input: {
|
|
||||||
idToUpdate: objectMetadataId,
|
|
||||||
updatePayload: { isActive: false },
|
|
||||||
},
|
|
||||||
});
|
|
||||||
await deleteOneObjectMetadata({
|
|
||||||
expectToFail: false,
|
|
||||||
input: { idToDelete: objectMetadataId },
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
expectToFail: false,
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
input: {
|
||||||
value: false,
|
idToUpdate: objectMetadataId,
|
||||||
|
updatePayload: { isActive: false },
|
||||||
|
},
|
||||||
|
});
|
||||||
|
await deleteOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: { idToDelete: objectMetadataId },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
+18
@@ -5,9 +5,11 @@ import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object
|
|||||||
import { getMockCreateObjectInput } from 'test/integration/metadata/suites/object-metadata/utils/generate-mock-create-object-metadata-input';
|
import { getMockCreateObjectInput } from 'test/integration/metadata/suites/object-metadata/utils/generate-mock-create-object-metadata-input';
|
||||||
import { type EachTestingContext } from 'twenty-shared/testing';
|
import { type EachTestingContext } from 'twenty-shared/testing';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
|
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
||||||
|
|
||||||
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
||||||
|
|
||||||
|
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
||||||
import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input';
|
import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input';
|
||||||
|
|
||||||
type GlobalTestContext = {
|
type GlobalTestContext = {
|
||||||
@@ -42,6 +44,14 @@ type CreateOneObjectMetadataItemTestingContext = EachTestingContext<
|
|||||||
| ((context: GlobalTestContext) => TestedRelationCreationPayload)
|
| ((context: GlobalTestContext) => TestedRelationCreationPayload)
|
||||||
>[];
|
>[];
|
||||||
describe('Field metadata morph relation creation should fail', () => {
|
describe('Field metadata morph relation creation should fail', () => {
|
||||||
|
beforeAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: false,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
const failingLabelsCreationTestsUseCase: CreateOneObjectMetadataItemTestingContext =
|
const failingLabelsCreationTestsUseCase: CreateOneObjectMetadataItemTestingContext =
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
@@ -147,6 +157,14 @@ describe('Field metadata morph relation creation should fail', () => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it.each(failingLabelsCreationTestsUseCase)(
|
it.each(failingLabelsCreationTestsUseCase)(
|
||||||
'relation ONE_TO_MANY $title',
|
'relation ONE_TO_MANY $title',
|
||||||
async ({ context }) => {
|
async ({ context }) => {
|
||||||
|
|||||||
+30
@@ -4,6 +4,7 @@ import { deleteOneFieldMetadata } from 'test/integration/metadata/suites/field-m
|
|||||||
import { createMorphRelationBetweenObjects } from 'test/integration/metadata/suites/object-metadata/utils/create-morph-relation-between-objects.util';
|
import { createMorphRelationBetweenObjects } from 'test/integration/metadata/suites/object-metadata/utils/create-morph-relation-between-objects.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { type EachTestingContext } from 'twenty-shared/testing';
|
import { type EachTestingContext } from 'twenty-shared/testing';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
|
|
||||||
@@ -65,12 +66,41 @@ xdescribe('findMany morph relation records', () => {
|
|||||||
createdObjectMetadataOpportunityId = objectMetadataOpportunityId;
|
createdObjectMetadataOpportunityId = objectMetadataOpportunityId;
|
||||||
});
|
});
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: createdObjectMetadataPersonId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: createdObjectMetadataPersonId },
|
input: { idToDelete: createdObjectMetadataPersonId },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: createdObjectMetadataOpportunityId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: createdObjectMetadataOpportunityId },
|
input: { idToDelete: createdObjectMetadataOpportunityId },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: createdObjectMetadataCompanyId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: createdObjectMetadataCompanyId },
|
input: { idToDelete: createdObjectMetadataCompanyId },
|
||||||
});
|
});
|
||||||
|
|||||||
+10
-28
@@ -4,7 +4,6 @@ import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-m
|
|||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
|
||||||
import {
|
import {
|
||||||
eachTestingContextFilter,
|
eachTestingContextFilter,
|
||||||
type EachTestingContext,
|
type EachTestingContext,
|
||||||
@@ -14,11 +13,9 @@ import { isDefined } from 'twenty-shared/utils';
|
|||||||
|
|
||||||
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
||||||
|
|
||||||
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
|
||||||
import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input';
|
import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input';
|
||||||
import { type FieldMetadataDTO } from 'src/engine/metadata-modules/field-metadata/dtos/field-metadata.dto';
|
import { type FieldMetadataDTO } from 'src/engine/metadata-modules/field-metadata/dtos/field-metadata.dto';
|
||||||
import { type RelationDTO } from 'src/engine/metadata-modules/field-metadata/dtos/relation.dto';
|
import { type RelationDTO } from 'src/engine/metadata-modules/field-metadata/dtos/relation.dto';
|
||||||
import { SEED_APPLE_WORKSPACE_ID } from 'src/engine/workspace-manager/dev-seeder/core/utils/seed-workspaces.util';
|
|
||||||
|
|
||||||
type EachTestingContextArray = EachTestingContext<
|
type EachTestingContextArray = EachTestingContext<
|
||||||
(args: {
|
(args: {
|
||||||
@@ -96,13 +93,6 @@ describe('successful createOne FieldMetadataService morph relation fields v2', (
|
|||||||
let createdFieldMetadataId: string | undefined = undefined;
|
let createdFieldMetadataId: string | undefined = undefined;
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: true,
|
|
||||||
workspaceId: SEED_APPLE_WORKSPACE_ID,
|
|
||||||
});
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
data: {
|
data: {
|
||||||
createOneObject: { id: objectMetadataPersonId },
|
createOneObject: { id: objectMetadataPersonId },
|
||||||
@@ -162,25 +152,17 @@ describe('successful createOne FieldMetadataService morph relation fields v2', (
|
|||||||
createdObjectMetadataCompanyId,
|
createdObjectMetadataCompanyId,
|
||||||
];
|
];
|
||||||
|
|
||||||
try {
|
for (const objectMetadataId of createdObjectMetadataIds) {
|
||||||
for (const objectMetadataId of createdObjectMetadataIds) {
|
await updateOneObjectMetadata({
|
||||||
await updateOneObjectMetadata({
|
|
||||||
expectToFail: false,
|
|
||||||
input: {
|
|
||||||
idToUpdate: objectMetadataId,
|
|
||||||
updatePayload: { isActive: false },
|
|
||||||
},
|
|
||||||
});
|
|
||||||
await deleteOneObjectMetadata({
|
|
||||||
expectToFail: false,
|
|
||||||
input: { idToDelete: objectMetadataId },
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
expectToFail: false,
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
input: {
|
||||||
value: false,
|
idToUpdate: objectMetadataId,
|
||||||
|
updatePayload: { isActive: false },
|
||||||
|
},
|
||||||
|
});
|
||||||
|
await deleteOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: { idToDelete: objectMetadataId },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
+10
-29
@@ -4,14 +4,10 @@ import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-m
|
|||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
|
|
||||||
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
||||||
|
|
||||||
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
|
||||||
import { SEED_APPLE_WORKSPACE_ID } from 'src/engine/workspace-manager/dev-seeder/core/utils/seed-workspaces.util';
|
|
||||||
|
|
||||||
describe('updateOne FieldMetadataService morph relation fields v2', () => {
|
describe('updateOne FieldMetadataService morph relation fields v2', () => {
|
||||||
let createdObjectMetadataPersonId: string;
|
let createdObjectMetadataPersonId: string;
|
||||||
let createdObjectMetadataOpportunityId: string;
|
let createdObjectMetadataOpportunityId: string;
|
||||||
@@ -19,13 +15,6 @@ describe('updateOne FieldMetadataService morph relation fields v2', () => {
|
|||||||
let createdFieldMetadataId: string;
|
let createdFieldMetadataId: string;
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: true,
|
|
||||||
workspaceId: SEED_APPLE_WORKSPACE_ID,
|
|
||||||
});
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
data: {
|
data: {
|
||||||
createOneObject: { id: objectMetadataPersonId },
|
createOneObject: { id: objectMetadataPersonId },
|
||||||
@@ -85,25 +74,17 @@ describe('updateOne FieldMetadataService morph relation fields v2', () => {
|
|||||||
createdObjectMetadataCompanyId,
|
createdObjectMetadataCompanyId,
|
||||||
];
|
];
|
||||||
|
|
||||||
try {
|
for (const objectMetadataId of createdObjectMetadataIds) {
|
||||||
for (const objectMetadataId of createdObjectMetadataIds) {
|
await updateOneObjectMetadata({
|
||||||
await updateOneObjectMetadata({
|
|
||||||
expectToFail: false,
|
|
||||||
input: {
|
|
||||||
idToUpdate: objectMetadataId,
|
|
||||||
updatePayload: { isActive: false },
|
|
||||||
},
|
|
||||||
});
|
|
||||||
await deleteOneObjectMetadata({
|
|
||||||
expectToFail: false,
|
|
||||||
input: { idToDelete: objectMetadataId },
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
expectToFail: false,
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
input: {
|
||||||
value: false,
|
idToUpdate: objectMetadataId,
|
||||||
|
updatePayload: { isActive: false },
|
||||||
|
},
|
||||||
|
});
|
||||||
|
await deleteOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: { idToDelete: objectMetadataId },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
+11
-1
@@ -2,10 +2,11 @@ import { faker } from '@faker-js/faker';
|
|||||||
import { type CountryCode } from 'libphonenumber-js';
|
import { type CountryCode } from 'libphonenumber-js';
|
||||||
import { createOneOperation } from 'test/integration/graphql/utils/create-one-operation.util';
|
import { createOneOperation } from 'test/integration/graphql/utils/create-one-operation.util';
|
||||||
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
||||||
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { type EachTestingContext } from 'twenty-shared/testing';
|
import { type EachTestingContext } from 'twenty-shared/testing';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
type AdditionalPhoneMetadata,
|
type AdditionalPhoneMetadata,
|
||||||
@@ -355,6 +356,15 @@ describe('Phone field metadata tests suite', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: createdObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: createdObjectMetadataId },
|
input: { idToDelete: createdObjectMetadataId },
|
||||||
});
|
});
|
||||||
|
|||||||
+848
-80
File diff suppressed because it is too large
Load Diff
+124
-8
@@ -5,11 +5,57 @@ exports[`Field metadata relation update should fail relation when name is change
|
|||||||
{
|
{
|
||||||
"extensions": {
|
"extensions": {
|
||||||
"code": "BAD_USER_INPUT",
|
"code": "BAD_USER_INPUT",
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
"errors": {
|
||||||
"userFriendlyMessage": "An error occurred.",
|
"index": [],
|
||||||
|
"objectMetadata": [
|
||||||
|
{
|
||||||
|
"errors": [
|
||||||
|
{
|
||||||
|
"code": "FIELD_MUTATION_NOT_ALLOWED",
|
||||||
|
"message": "Forbidden updated properties for relation field metadata: name",
|
||||||
|
"userFriendlyMessage": "Forbidden updated properties for relation field metadata",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"flatEntityMinimalInformation": {
|
||||||
|
"id": Any<String>,
|
||||||
|
"name": "newName",
|
||||||
|
"objectMetadataId": Any<String>,
|
||||||
|
},
|
||||||
|
"type": "update_field",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"errors": [
|
||||||
|
{
|
||||||
|
"code": "FIELD_MUTATION_NOT_ALLOWED",
|
||||||
|
"message": "Forbidden updated properties for relation field metadata: name",
|
||||||
|
"userFriendlyMessage": "Forbidden updated properties for relation field metadata",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"flatEntityMinimalInformation": {
|
||||||
|
"id": Any<String>,
|
||||||
|
"name": "newName",
|
||||||
|
"objectMetadataId": Any<String>,
|
||||||
|
},
|
||||||
|
"type": "update_field",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"serverlessFunction": [],
|
||||||
|
"view": [],
|
||||||
|
"viewField": [],
|
||||||
|
},
|
||||||
|
"message": "Validation failed for 0 object(s) and 0 field(s)",
|
||||||
|
"summary": {
|
||||||
|
"invalidIndex": 0,
|
||||||
|
"invalidObjectMetadata": 0,
|
||||||
|
"invalidServerlessFunction": 0,
|
||||||
|
"invalidView": 0,
|
||||||
|
"invalidViewField": 0,
|
||||||
|
"totalErrors": 0,
|
||||||
|
},
|
||||||
|
"userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)",
|
||||||
},
|
},
|
||||||
"message": "Name cannot be changed for relation fields",
|
"message": "Multiple validation errors occurred while updating field",
|
||||||
"name": "UserInputError",
|
"name": "GraphQLError",
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
`;
|
`;
|
||||||
@@ -19,11 +65,81 @@ exports[`Field metadata relation update should fail relation when name is not in
|
|||||||
{
|
{
|
||||||
"extensions": {
|
"extensions": {
|
||||||
"code": "BAD_USER_INPUT",
|
"code": "BAD_USER_INPUT",
|
||||||
"subCode": "INVALID_FIELD_INPUT",
|
"errors": {
|
||||||
"userFriendlyMessage": "An error occurred.",
|
"index": [],
|
||||||
|
"objectMetadata": [
|
||||||
|
{
|
||||||
|
"errors": [
|
||||||
|
{
|
||||||
|
"code": "FIELD_MUTATION_NOT_ALLOWED",
|
||||||
|
"message": "Forbidden updated properties for relation field metadata: name",
|
||||||
|
"userFriendlyMessage": "Forbidden updated properties for relation field metadata",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"code": "INVALID_FIELD_INPUT",
|
||||||
|
"message": "Name should be in camelCase",
|
||||||
|
"userFriendlyMessage": "Name should be in camelCase",
|
||||||
|
"value": "New Name",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"code": "INVALID_FIELD_INPUT",
|
||||||
|
"message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters",
|
||||||
|
"userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters",
|
||||||
|
"value": "New Name",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"flatEntityMinimalInformation": {
|
||||||
|
"id": Any<String>,
|
||||||
|
"name": "New Name",
|
||||||
|
"objectMetadataId": Any<String>,
|
||||||
|
},
|
||||||
|
"type": "update_field",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"errors": [
|
||||||
|
{
|
||||||
|
"code": "FIELD_MUTATION_NOT_ALLOWED",
|
||||||
|
"message": "Forbidden updated properties for relation field metadata: name",
|
||||||
|
"userFriendlyMessage": "Forbidden updated properties for relation field metadata",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"code": "INVALID_FIELD_INPUT",
|
||||||
|
"message": "Name should be in camelCase",
|
||||||
|
"userFriendlyMessage": "Name should be in camelCase",
|
||||||
|
"value": "New Name",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"code": "INVALID_FIELD_INPUT",
|
||||||
|
"message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters",
|
||||||
|
"userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters",
|
||||||
|
"value": "New Name",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"flatEntityMinimalInformation": {
|
||||||
|
"id": Any<String>,
|
||||||
|
"name": "New Name",
|
||||||
|
"objectMetadataId": Any<String>,
|
||||||
|
},
|
||||||
|
"type": "update_field",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"serverlessFunction": [],
|
||||||
|
"view": [],
|
||||||
|
"viewField": [],
|
||||||
|
},
|
||||||
|
"message": "Validation failed for 0 object(s) and 0 field(s)",
|
||||||
|
"summary": {
|
||||||
|
"invalidIndex": 0,
|
||||||
|
"invalidObjectMetadata": 0,
|
||||||
|
"invalidServerlessFunction": 0,
|
||||||
|
"invalidView": 0,
|
||||||
|
"invalidViewField": 0,
|
||||||
|
"totalErrors": 0,
|
||||||
|
},
|
||||||
|
"userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)",
|
||||||
},
|
},
|
||||||
"message": "New Name should be in camelCase",
|
"message": "Multiple validation errors occurred while updating field",
|
||||||
"name": "UserInputError",
|
"name": "GraphQLError",
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
`;
|
`;
|
||||||
|
|||||||
+81
-69
@@ -1,17 +1,16 @@
|
|||||||
import { deleteOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/delete-one-field-metadata.util';
|
import { findManyFieldsMetadata } from 'test/integration/metadata/suites/field-metadata/utils/find-many-fields-metadata.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { createRelationBetweenObjects } from 'test/integration/metadata/suites/object-metadata/utils/create-relation-between-objects.util';
|
import { createRelationBetweenObjects } from 'test/integration/metadata/suites/object-metadata/utils/create-relation-between-objects.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { type EachTestingContext } from 'twenty-shared/testing';
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
import { findManyFieldsMetadata } from 'test/integration/metadata/suites/field-metadata/utils/find-many-fields-metadata.util';
|
|
||||||
|
|
||||||
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
||||||
|
|
||||||
describe('createOne FieldMetadataService relation fields', () => {
|
describe('createOne FieldMetadataService relation fields', () => {
|
||||||
let createdObjectMetadataPersonId = '';
|
let createdObjectMetadataPersonId: string;
|
||||||
let createdObjectMetadataOpportunityId = '';
|
let createdObjectMetadataOpportunityId: string;
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
const {
|
const {
|
||||||
@@ -19,6 +18,7 @@ describe('createOne FieldMetadataService relation fields', () => {
|
|||||||
createOneObject: { id: objectMetadataPersonId },
|
createOneObject: { id: objectMetadataPersonId },
|
||||||
},
|
},
|
||||||
} = await createOneObjectMetadata({
|
} = await createOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
input: {
|
input: {
|
||||||
nameSingular: 'personForRelation',
|
nameSingular: 'personForRelation',
|
||||||
namePlural: 'peopleForRelation',
|
namePlural: 'peopleForRelation',
|
||||||
@@ -35,6 +35,7 @@ describe('createOne FieldMetadataService relation fields', () => {
|
|||||||
createOneObject: { id: objectMetadataOpportunityId },
|
createOneObject: { id: objectMetadataOpportunityId },
|
||||||
},
|
},
|
||||||
} = await createOneObjectMetadata({
|
} = await createOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
input: {
|
input: {
|
||||||
nameSingular: 'opportunityForRelation',
|
nameSingular: 'opportunityForRelation',
|
||||||
namePlural: 'opportunitiesForRelation',
|
namePlural: 'opportunitiesForRelation',
|
||||||
@@ -47,72 +48,50 @@ describe('createOne FieldMetadataService relation fields', () => {
|
|||||||
createdObjectMetadataOpportunityId = objectMetadataOpportunityId;
|
createdObjectMetadataOpportunityId = objectMetadataOpportunityId;
|
||||||
});
|
});
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
await deleteOneObjectMetadata({
|
await updateOneObjectMetadata({
|
||||||
input: { idToDelete: createdObjectMetadataPersonId },
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: createdObjectMetadataPersonId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: { idToDelete: createdObjectMetadataPersonId },
|
||||||
|
});
|
||||||
|
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: createdObjectMetadataOpportunityId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
await deleteOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
input: { idToDelete: createdObjectMetadataOpportunityId },
|
input: { idToDelete: createdObjectMetadataOpportunityId },
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
type EachTestingContextArray = EachTestingContext<
|
it('MANY TO ONE field relation creation', async () => {
|
||||||
(args: { objectMetadataId: string; targetObjectMetadataId: string }) => {
|
const createdField = await createRelationBetweenObjects({
|
||||||
relationType: RelationType;
|
|
||||||
objectMetadataId: string;
|
|
||||||
targetObjectMetadataId: string;
|
|
||||||
type: FieldMetadataType.RELATION | FieldMetadataType.MORPH_RELATION;
|
|
||||||
}
|
|
||||||
>[];
|
|
||||||
|
|
||||||
const eachTestingContextArray: EachTestingContextArray = [
|
|
||||||
{
|
|
||||||
title: 'should create a RELATION field type MANY_TO_ONE',
|
|
||||||
context: ({ objectMetadataId, targetObjectMetadataId }) => ({
|
|
||||||
relationType: RelationType.MANY_TO_ONE,
|
|
||||||
objectMetadataId,
|
|
||||||
targetObjectMetadataId,
|
|
||||||
type: FieldMetadataType.RELATION,
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'should create a RELATION field type ONE_TO_MANY',
|
|
||||||
context: ({ objectMetadataId, targetObjectMetadataId }) => ({
|
|
||||||
relationType: RelationType.ONE_TO_MANY,
|
|
||||||
objectMetadataId,
|
|
||||||
targetObjectMetadataId,
|
|
||||||
type: FieldMetadataType.RELATION,
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
it.each(eachTestingContextArray)('$title', async ({ context }) => {
|
|
||||||
const contextPayload = context({
|
|
||||||
objectMetadataId: createdObjectMetadataOpportunityId,
|
objectMetadataId: createdObjectMetadataOpportunityId,
|
||||||
targetObjectMetadataId: createdObjectMetadataPersonId,
|
targetObjectMetadataId: createdObjectMetadataPersonId,
|
||||||
});
|
relationType: RelationType.MANY_TO_ONE,
|
||||||
|
type: FieldMetadataType.RELATION,
|
||||||
const createdField = await createRelationBetweenObjects<
|
name: 'person',
|
||||||
typeof contextPayload.type
|
|
||||||
>({
|
|
||||||
objectMetadataId: contextPayload.objectMetadataId,
|
|
||||||
targetObjectMetadataId: contextPayload.targetObjectMetadataId,
|
|
||||||
type: contextPayload.type,
|
|
||||||
relationType: contextPayload.relationType,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(createdField.id).toBeDefined();
|
expect(createdField.id).toBeDefined();
|
||||||
expect(createdField.name).toBe('person');
|
expect(createdField.name).toBe('person');
|
||||||
expect(createdField.relation?.type).toBe(contextPayload.relationType);
|
expect(createdField.relation?.type).toBe(RelationType.MANY_TO_ONE);
|
||||||
expect(createdField.relation?.targetFieldMetadata.id).toBeDefined();
|
expect(createdField.relation?.targetFieldMetadata.id).toBeDefined();
|
||||||
// TODO: expect(createdField.morphRelations).toBeUndefined();
|
|
||||||
const isManyToOne =
|
|
||||||
contextPayload.relationType === RelationType.MANY_TO_ONE;
|
|
||||||
|
|
||||||
if (isManyToOne) {
|
expect(createdField.settings?.joinColumnName).toBe('personId');
|
||||||
expect(createdField.settings?.joinColumnName).toBe('personId');
|
|
||||||
} else {
|
|
||||||
expect(createdField.settings?.joinColumnName).toBeUndefined();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isDefined(createdField.relation?.targetFieldMetadata?.id)) {
|
if (!isDefined(createdField.relation?.targetFieldMetadata?.id)) {
|
||||||
throw new Error('targetFieldMetadata.id is not defined');
|
throw new Error('targetFieldMetadata.id is not defined');
|
||||||
@@ -126,7 +105,46 @@ describe('createOne FieldMetadataService relation fields', () => {
|
|||||||
'personForRelation',
|
'personForRelation',
|
||||||
);
|
);
|
||||||
expect(opportunityFieldOnPerson.relation.type).toBe(
|
expect(opportunityFieldOnPerson.relation.type).toBe(
|
||||||
isManyToOne ? RelationType.ONE_TO_MANY : RelationType.MANY_TO_ONE,
|
RelationType.ONE_TO_MANY,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
opportunityFieldOnPerson.relation.targetFieldMetadata.id,
|
||||||
|
).toBeDefined();
|
||||||
|
expect(
|
||||||
|
opportunityFieldOnPerson.relation.targetObjectMetadata.id,
|
||||||
|
).toBeDefined();
|
||||||
|
expect(opportunityFieldOnPerson.settings?.joinColumnName).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('ONE TO MANY field relation creation', async () => {
|
||||||
|
const createdField = await createRelationBetweenObjects({
|
||||||
|
objectMetadataId: createdObjectMetadataOpportunityId,
|
||||||
|
targetObjectMetadataId: createdObjectMetadataPersonId,
|
||||||
|
relationType: RelationType.ONE_TO_MANY,
|
||||||
|
type: FieldMetadataType.RELATION,
|
||||||
|
name: 'person',
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(createdField.id).toBeDefined();
|
||||||
|
expect(createdField.name).toBe('person');
|
||||||
|
expect(createdField.relation?.type).toBe(RelationType.ONE_TO_MANY);
|
||||||
|
expect(createdField.relation?.targetFieldMetadata.id).toBeDefined();
|
||||||
|
|
||||||
|
expect(createdField.settings?.joinColumnName).toBeUndefined();
|
||||||
|
|
||||||
|
if (!isDefined(createdField.relation?.targetFieldMetadata?.id)) {
|
||||||
|
throw new Error('targetFieldMetadata.id is not defined');
|
||||||
|
}
|
||||||
|
|
||||||
|
const opportunityFieldOnPerson = await findFieldMetadata({
|
||||||
|
fieldMetadataId: createdField.relation.targetFieldMetadata.id,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(opportunityFieldOnPerson.object.nameSingular).toBe(
|
||||||
|
'personForRelation',
|
||||||
|
);
|
||||||
|
expect(opportunityFieldOnPerson.relation.type).toBe(
|
||||||
|
RelationType.MANY_TO_ONE,
|
||||||
);
|
);
|
||||||
expect(
|
expect(
|
||||||
opportunityFieldOnPerson.relation.targetFieldMetadata.id,
|
opportunityFieldOnPerson.relation.targetFieldMetadata.id,
|
||||||
@@ -135,17 +153,9 @@ describe('createOne FieldMetadataService relation fields', () => {
|
|||||||
opportunityFieldOnPerson.relation.targetObjectMetadata.id,
|
opportunityFieldOnPerson.relation.targetObjectMetadata.id,
|
||||||
).toBeDefined();
|
).toBeDefined();
|
||||||
|
|
||||||
if (!isManyToOne) {
|
expect(opportunityFieldOnPerson.settings?.joinColumnName).toBe(
|
||||||
expect(opportunityFieldOnPerson.settings?.joinColumnName).toBe(
|
'opportunityId',
|
||||||
'opportunityId',
|
);
|
||||||
);
|
|
||||||
} else {
|
|
||||||
expect(opportunityFieldOnPerson.settings?.joinColumnName).toBeUndefined();
|
|
||||||
}
|
|
||||||
|
|
||||||
await deleteOneFieldMetadata({
|
|
||||||
input: { idToDelete: createdField.id },
|
|
||||||
}).catch();
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -181,6 +191,8 @@ const findFieldMetadata = async ({
|
|||||||
settings
|
settings
|
||||||
`,
|
`,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
expect(fields.length).toBe(1);
|
||||||
const field = fields[0]?.node;
|
const field = fields[0]?.node;
|
||||||
|
|
||||||
return field;
|
return field;
|
||||||
|
|||||||
+17
-2
@@ -3,8 +3,10 @@ import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-m
|
|||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { getMockCreateObjectInput } from 'test/integration/metadata/suites/object-metadata/utils/generate-mock-create-object-metadata-input';
|
import { getMockCreateObjectInput } from 'test/integration/metadata/suites/object-metadata/utils/generate-mock-create-object-metadata-input';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { type EachTestingContext } from 'twenty-shared/testing';
|
import { type EachTestingContext } from 'twenty-shared/testing';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
|
import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any';
|
||||||
|
|
||||||
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
||||||
|
|
||||||
@@ -232,6 +234,15 @@ describe('Field metadata relation creation should fail', () => {
|
|||||||
for (const objectMetadataId of Object.values(
|
for (const objectMetadataId of Object.values(
|
||||||
globalTestContext.objectMetadataIds,
|
globalTestContext.objectMetadataIds,
|
||||||
)) {
|
)) {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: objectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: {
|
input: {
|
||||||
idToDelete: objectMetadataId,
|
idToDelete: objectMetadataId,
|
||||||
@@ -273,7 +284,9 @@ describe('Field metadata relation creation should fail', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
expect(errors).toBeDefined();
|
expect(errors).toBeDefined();
|
||||||
expect(errors).toMatchSnapshot();
|
expect(errors).toMatchSnapshot(
|
||||||
|
extractRecordIdsAndDatesAsExpectAny(errors),
|
||||||
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -310,7 +323,9 @@ describe('Field metadata relation creation should fail', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
expect(errors).toBeDefined();
|
expect(errors).toBeDefined();
|
||||||
expect(errors).toMatchSnapshot();
|
expect(errors).toMatchSnapshot(
|
||||||
|
extractRecordIdsAndDatesAsExpectAny(errors),
|
||||||
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
+14
-1
@@ -3,8 +3,10 @@ import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-m
|
|||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { getMockCreateObjectInput } from 'test/integration/metadata/suites/object-metadata/utils/generate-mock-create-object-metadata-input';
|
import { getMockCreateObjectInput } from 'test/integration/metadata/suites/object-metadata/utils/generate-mock-create-object-metadata-input';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { type EachTestingContext } from 'twenty-shared/testing';
|
import { type EachTestingContext } from 'twenty-shared/testing';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
|
import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any';
|
||||||
|
|
||||||
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
||||||
|
|
||||||
@@ -82,6 +84,15 @@ describe('Field metadata relation update should fail', () => {
|
|||||||
globalTestContext.employeeObjectId,
|
globalTestContext.employeeObjectId,
|
||||||
globalTestContext.enterpriseObjectId,
|
globalTestContext.enterpriseObjectId,
|
||||||
]) {
|
]) {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: objectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: {
|
input: {
|
||||||
idToDelete: objectMetadataId,
|
idToDelete: objectMetadataId,
|
||||||
@@ -104,7 +115,9 @@ describe('Field metadata relation update should fail', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
expect(errors).toBeDefined();
|
expect(errors).toBeDefined();
|
||||||
expect(errors).toMatchSnapshot();
|
expect(errors).toMatchSnapshot(
|
||||||
|
extractRecordIdsAndDatesAsExpectAny(errors),
|
||||||
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
+10
@@ -3,6 +3,7 @@ import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-m
|
|||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { getMockCreateObjectInput } from 'test/integration/metadata/suites/object-metadata/utils/generate-mock-create-object-metadata-input';
|
import { getMockCreateObjectInput } from 'test/integration/metadata/suites/object-metadata/utils/generate-mock-create-object-metadata-input';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
|
|
||||||
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
||||||
@@ -65,6 +66,15 @@ describe('Field metadata relation update should succeed', () => {
|
|||||||
globalTestContext.employeeObjectId,
|
globalTestContext.employeeObjectId,
|
||||||
globalTestContext.enterpriseObjectId,
|
globalTestContext.enterpriseObjectId,
|
||||||
]) {
|
]) {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: objectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: {
|
input: {
|
||||||
idToDelete: objectMetadataId,
|
idToDelete: objectMetadataId,
|
||||||
|
|||||||
+29
@@ -1,11 +1,23 @@
|
|||||||
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
|
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
|
|
||||||
|
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
||||||
|
|
||||||
describe('create one unique field metadata', () => {
|
describe('create one unique field metadata', () => {
|
||||||
let createdObjectMetadataId = '';
|
let createdObjectMetadataId = '';
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: false,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
const {
|
const {
|
||||||
data: {
|
data: {
|
||||||
@@ -25,11 +37,28 @@ describe('create one unique field metadata', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: createdObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: createdObjectMetadataId },
|
input: { idToDelete: createdObjectMetadataId },
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('should create one unique field metadata', async () => {
|
it('should create one unique field metadata', async () => {
|
||||||
const createFieldInput = {
|
const createFieldInput = {
|
||||||
name: 'uniqueTestField',
|
name: 'uniqueTestField',
|
||||||
|
|||||||
+29
@@ -4,8 +4,12 @@ import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-m
|
|||||||
import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/update-one-field-metadata.util';
|
import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/update-one-field-metadata.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
|
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
|
|
||||||
|
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
||||||
|
|
||||||
const createRecordQuery = gql`
|
const createRecordQuery = gql`
|
||||||
mutation CreateFirstRecord($data: TestRecordObjectCreateInput!) {
|
mutation CreateFirstRecord($data: TestRecordObjectCreateInput!) {
|
||||||
createTestRecordObject(data: $data) {
|
createTestRecordObject(data: $data) {
|
||||||
@@ -19,6 +23,22 @@ describe('create records with custom unique fields', () => {
|
|||||||
let createdObjectMetadataId = '';
|
let createdObjectMetadataId = '';
|
||||||
let uniqueFieldId = '';
|
let uniqueFieldId = '';
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: false,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
const {
|
const {
|
||||||
data: {
|
data: {
|
||||||
@@ -57,6 +77,15 @@ describe('create records with custom unique fields', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: createdObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: createdObjectMetadataId },
|
input: { idToDelete: createdObjectMetadataId },
|
||||||
});
|
});
|
||||||
|
|||||||
+29
@@ -3,11 +3,31 @@ import { deleteOneFieldMetadata } from 'test/integration/metadata/suites/field-m
|
|||||||
import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/update-one-field-metadata.util';
|
import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/update-one-field-metadata.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
|
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
|
|
||||||
|
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
||||||
|
|
||||||
describe('update one unique field metadata', () => {
|
describe('update one unique field metadata', () => {
|
||||||
let createdObjectId = '';
|
let createdObjectId = '';
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: false,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
const {
|
const {
|
||||||
data: {
|
data: {
|
||||||
@@ -27,6 +47,15 @@ describe('update one unique field metadata', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: createdObjectId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: createdObjectId },
|
input: { idToDelete: createdObjectId },
|
||||||
});
|
});
|
||||||
|
|||||||
+31
@@ -4,6 +4,7 @@ import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-m
|
|||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { getMockCreateObjectInput } from 'test/integration/metadata/suites/object-metadata/utils/generate-mock-create-object-metadata-input';
|
import { getMockCreateObjectInput } from 'test/integration/metadata/suites/object-metadata/utils/generate-mock-create-object-metadata-input';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import {
|
import {
|
||||||
createTestViewFilterWithRestApi,
|
createTestViewFilterWithRestApi,
|
||||||
createTestViewWithRestApi,
|
createTestViewWithRestApi,
|
||||||
@@ -15,7 +16,9 @@ import {
|
|||||||
FieldMetadataType,
|
FieldMetadataType,
|
||||||
} from 'twenty-shared/types';
|
} from 'twenty-shared/types';
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
|
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
||||||
|
|
||||||
|
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
||||||
import { ViewFilterOperand } from 'src/engine/core-modules/view/enums/view-filter-operand';
|
import { ViewFilterOperand } from 'src/engine/core-modules/view/enums/view-filter-operand';
|
||||||
import { ViewType } from 'src/engine/core-modules/view/enums/view-type.enum';
|
import { ViewType } from 'src/engine/core-modules/view/enums/view-type.enum';
|
||||||
import { type ViewFilterValue } from 'src/engine/core-modules/view/types/view-filter-value.type';
|
import { type ViewFilterValue } from 'src/engine/core-modules/view/types/view-filter-value.type';
|
||||||
@@ -69,6 +72,22 @@ const testFieldMetadataType: EnumFieldMetadataType[] = [
|
|||||||
describe('update-one-field-metadata-related-record', () => {
|
describe('update-one-field-metadata-related-record', () => {
|
||||||
let idToDelete: string;
|
let idToDelete: string;
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: false,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
const createObjectSelectFieldAndView = async ({
|
const createObjectSelectFieldAndView = async ({
|
||||||
options,
|
options,
|
||||||
type: fieldMetadataType,
|
type: fieldMetadataType,
|
||||||
@@ -78,6 +97,7 @@ describe('update-one-field-metadata-related-record', () => {
|
|||||||
const {
|
const {
|
||||||
data: { createOneObject },
|
data: { createOneObject },
|
||||||
} = await createOneObjectMetadata({
|
} = await createOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
input: getMockCreateObjectInput({
|
input: getMockCreateObjectInput({
|
||||||
labelSingular: singular,
|
labelSingular: singular,
|
||||||
labelPlural: plural,
|
labelPlural: plural,
|
||||||
@@ -92,6 +112,7 @@ describe('update-one-field-metadata-related-record', () => {
|
|||||||
const {
|
const {
|
||||||
data: { createOneField },
|
data: { createOneField },
|
||||||
} = await createOneFieldMetadata<typeof fieldMetadataType>({
|
} = await createOneFieldMetadata<typeof fieldMetadataType>({
|
||||||
|
expectToFail: false,
|
||||||
input: {
|
input: {
|
||||||
objectMetadataId: createOneObject.id,
|
objectMetadataId: createOneObject.id,
|
||||||
type: fieldMetadataType,
|
type: fieldMetadataType,
|
||||||
@@ -118,7 +139,17 @@ describe('update-one-field-metadata-related-record', () => {
|
|||||||
|
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
if (isDefined(idToDelete)) {
|
if (isDefined(idToDelete)) {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: idToDelete,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
input: { idToDelete: idToDelete },
|
input: { idToDelete: idToDelete },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
+27
-7
@@ -6,6 +6,8 @@ import {
|
|||||||
} from 'test/integration/metadata/suites/object-metadata/constants/test-object-names.constant';
|
} from 'test/integration/metadata/suites/object-metadata/constants/test-object-names.constant';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
|
import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
|
|
||||||
describe('updateOne', () => {
|
describe('updateOne', () => {
|
||||||
@@ -42,6 +44,15 @@ describe('updateOne', () => {
|
|||||||
testFieldId = createdFieldMetadata.createOneField.id;
|
testFieldId = createdFieldMetadata.createOneField.id;
|
||||||
});
|
});
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: listingObjectId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
expectToFail: false,
|
expectToFail: false,
|
||||||
input: { idToDelete: listingObjectId },
|
input: { idToDelete: listingObjectId },
|
||||||
@@ -128,6 +139,15 @@ describe('updateOne', () => {
|
|||||||
testFieldId = createdFieldMetadata.createOneField.id;
|
testFieldId = createdFieldMetadata.createOneField.id;
|
||||||
});
|
});
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: listingObjectId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
expectToFail: false,
|
expectToFail: false,
|
||||||
input: { idToDelete: listingObjectId },
|
input: { idToDelete: listingObjectId },
|
||||||
@@ -153,14 +173,14 @@ describe('updateOne', () => {
|
|||||||
expectToFail: true,
|
expectToFail: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
// Assert
|
expect(errors).toMatchSnapshot(
|
||||||
expect(errors[0].message).toBe(
|
extractRecordIdsAndDatesAsExpectAny(errors),
|
||||||
'Name is not synced with label. Expected name: "testName", got newName',
|
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw if the field name is not available because of other field with the same name', async () => {
|
it('should throw if the field name is not available because of other field with the same name', async () => {
|
||||||
await createOneFieldMetadata({
|
await createOneFieldMetadata({
|
||||||
|
expectToFail: false,
|
||||||
input: {
|
input: {
|
||||||
objectMetadataId: listingObjectId,
|
objectMetadataId: listingObjectId,
|
||||||
type: FieldMetadataType.TEXT,
|
type: FieldMetadataType.TEXT,
|
||||||
@@ -170,15 +190,15 @@ describe('updateOne', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const { errors } = await updateOneFieldMetadata({
|
const { errors } = await updateOneFieldMetadata({
|
||||||
|
expectToFail: true,
|
||||||
input: {
|
input: {
|
||||||
idToUpdate: testFieldId,
|
idToUpdate: testFieldId,
|
||||||
updatePayload: { name: 'testName' },
|
updatePayload: { name: 'otherTestName' },
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
// Assert
|
expect(errors).toMatchSnapshot(
|
||||||
expect(errors[0].message).toBe(
|
extractRecordIdsAndDatesAsExpectAny(errors),
|
||||||
'Name "testName" is not available, check that it is not duplicating another field\'s name.',
|
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
-19
@@ -3,12 +3,9 @@ import { createOneObjectMetadata } from 'test/integration/metadata/suites/object
|
|||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { findManyObjectMetadataWithIndexes } from 'test/integration/metadata/suites/object-metadata/utils/find-many-object-metadata-with-indexes.util';
|
import { findManyObjectMetadataWithIndexes } from 'test/integration/metadata/suites/object-metadata/utils/find-many-object-metadata-with-indexes.util';
|
||||||
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
|
||||||
import { jestExpectToBeDefined } from 'test/utils/expect-to-be-defined.util.test';
|
import { jestExpectToBeDefined } from 'test/utils/expect-to-be-defined.util.test';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
|
|
||||||
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
|
||||||
|
|
||||||
const findObjectWithIndex = async ({
|
const findObjectWithIndex = async ({
|
||||||
objectMetadataId,
|
objectMetadataId,
|
||||||
}: {
|
}: {
|
||||||
@@ -29,22 +26,6 @@ const findObjectWithIndex = async ({
|
|||||||
describe('Index metadata creation through object metadata creation v2', () => {
|
describe('Index metadata creation through object metadata creation v2', () => {
|
||||||
let createdObjectId: string;
|
let createdObjectId: string;
|
||||||
|
|
||||||
beforeAll(async () => {
|
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: true,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
afterAll(async () => {
|
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: false,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
const {
|
const {
|
||||||
labelPlural,
|
labelPlural,
|
||||||
|
|||||||
+3
-22
@@ -1,39 +1,20 @@
|
|||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
|
||||||
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
|
||||||
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
|
||||||
import { FieldMetadataType, RelationType } from 'twenty-shared/types';
|
|
||||||
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
||||||
import { deleteOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/delete-one-field-metadata.util';
|
import { deleteOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/delete-one-field-metadata.util';
|
||||||
import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/update-one-field-metadata.util';
|
import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/update-one-field-metadata.util';
|
||||||
import { CUSTOM_OBJECT_DISHES } from 'test/integration/metadata/suites/object-metadata/constants/custom-object-dishes.constants';
|
import { CUSTOM_OBJECT_DISHES } from 'test/integration/metadata/suites/object-metadata/constants/custom-object-dishes.constants';
|
||||||
import { CUSTOM_OBJECT_FOOD } from 'test/integration/metadata/suites/object-metadata/constants/custom-object-food.constants';
|
import { CUSTOM_OBJECT_FOOD } from 'test/integration/metadata/suites/object-metadata/constants/custom-object-food.constants';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { findManyObjectMetadataWithIndexes } from 'test/integration/metadata/suites/object-metadata/utils/find-many-object-metadata-with-indexes.util';
|
import { findManyObjectMetadataWithIndexes } from 'test/integration/metadata/suites/object-metadata/utils/find-many-object-metadata-with-indexes.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { jestExpectToBeDefined } from 'test/utils/expect-to-be-defined.util.test';
|
import { jestExpectToBeDefined } from 'test/utils/expect-to-be-defined.util.test';
|
||||||
import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any';
|
import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any';
|
||||||
|
import { FieldMetadataType, RelationType } from 'twenty-shared/types';
|
||||||
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
|
||||||
|
|
||||||
describe('Index metadata creation on relation field creation v2', () => {
|
describe('Index metadata creation on relation field creation v2', () => {
|
||||||
let createdObjectId: string;
|
let createdObjectId: string;
|
||||||
let secondCreatedObjectId: string;
|
let secondCreatedObjectId: string;
|
||||||
|
|
||||||
beforeAll(async () => {
|
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: true,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
afterAll(async () => {
|
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: false,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
const {
|
const {
|
||||||
labelPlural,
|
labelPlural,
|
||||||
|
|||||||
+117
-8
@@ -5,11 +5,43 @@ exports[`Object metadata update should fail when labelIdentifier is not a TEXT o
|
|||||||
{
|
{
|
||||||
"extensions": {
|
"extensions": {
|
||||||
"code": "BAD_USER_INPUT",
|
"code": "BAD_USER_INPUT",
|
||||||
"subCode": "INVALID_OBJECT_INPUT",
|
"errors": {
|
||||||
"userFriendlyMessage": "An error occurred.",
|
"index": [],
|
||||||
|
"objectMetadata": [
|
||||||
|
{
|
||||||
|
"errors": [
|
||||||
|
{
|
||||||
|
"code": "INVALID_OBJECT_INPUT",
|
||||||
|
"message": "Label identifier field metadata must be a TEXT or FULL_NAME field type",
|
||||||
|
"userFriendlyMessage": "Label identifier field metadata must be a TEXT or FULL_NAME field type",
|
||||||
|
"value": "NUMBER",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"flatEntityMinimalInformation": {
|
||||||
|
"id": Any<String>,
|
||||||
|
"namePlural": "whatevers",
|
||||||
|
"nameSingular": "whatever",
|
||||||
|
},
|
||||||
|
"type": "update_object",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"serverlessFunction": [],
|
||||||
|
"view": [],
|
||||||
|
"viewField": [],
|
||||||
|
},
|
||||||
|
"message": "Validation failed for 0 object(s) and 0 field(s)",
|
||||||
|
"summary": {
|
||||||
|
"invalidIndex": 0,
|
||||||
|
"invalidObjectMetadata": 0,
|
||||||
|
"invalidServerlessFunction": 0,
|
||||||
|
"invalidView": 0,
|
||||||
|
"invalidViewField": 0,
|
||||||
|
"totalErrors": 0,
|
||||||
|
},
|
||||||
|
"userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)",
|
||||||
},
|
},
|
||||||
"message": "labelIdentifierFieldMetadataId validation failed: it must be a TEXT or FULL_NAME field metadata type id",
|
"message": "Multiple validation errors occurred while updating object",
|
||||||
"name": "UserInputError",
|
"name": "GraphQLError",
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
`;
|
`;
|
||||||
@@ -19,11 +51,43 @@ exports[`Object metadata update should fail when labelIdentifier is not a known
|
|||||||
{
|
{
|
||||||
"extensions": {
|
"extensions": {
|
||||||
"code": "BAD_USER_INPUT",
|
"code": "BAD_USER_INPUT",
|
||||||
"subCode": "INVALID_OBJECT_INPUT",
|
"errors": {
|
||||||
"userFriendlyMessage": "An error occurred.",
|
"index": [],
|
||||||
|
"objectMetadata": [
|
||||||
|
{
|
||||||
|
"errors": [
|
||||||
|
{
|
||||||
|
"code": "INVALID_OBJECT_INPUT",
|
||||||
|
"message": "Label identifier field metadata not found in field metadata list",
|
||||||
|
"userFriendlyMessage": "Label identifier field metadata not found in field metadata list",
|
||||||
|
"value": "42422020-f49c-4159-8751-76a24f47b360",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"flatEntityMinimalInformation": {
|
||||||
|
"id": Any<String>,
|
||||||
|
"namePlural": "whatevers",
|
||||||
|
"nameSingular": "whatever",
|
||||||
|
},
|
||||||
|
"type": "update_object",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"serverlessFunction": [],
|
||||||
|
"view": [],
|
||||||
|
"viewField": [],
|
||||||
|
},
|
||||||
|
"message": "Validation failed for 0 object(s) and 0 field(s)",
|
||||||
|
"summary": {
|
||||||
|
"invalidIndex": 0,
|
||||||
|
"invalidObjectMetadata": 0,
|
||||||
|
"invalidServerlessFunction": 0,
|
||||||
|
"invalidView": 0,
|
||||||
|
"invalidViewField": 0,
|
||||||
|
"totalErrors": 0,
|
||||||
|
},
|
||||||
|
"userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)",
|
||||||
},
|
},
|
||||||
"message": "labelIdentifierFieldMetadataId validation failed: related field metadata not found",
|
"message": "Multiple validation errors occurred while updating object",
|
||||||
"name": "UserInputError",
|
"name": "GraphQLError",
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
`;
|
`;
|
||||||
@@ -43,3 +107,48 @@ exports[`Object metadata update should fail when labelIdentifier is not a uuid 1
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
exports[`Object metadata update should fail when labelIdentifier is null 1`] = `
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"extensions": {
|
||||||
|
"code": "BAD_USER_INPUT",
|
||||||
|
"errors": {
|
||||||
|
"index": [],
|
||||||
|
"objectMetadata": [
|
||||||
|
{
|
||||||
|
"errors": [
|
||||||
|
{
|
||||||
|
"code": "MISSING_CUSTOM_OBJECT_DEFAULT_LABEL_IDENTIFIER_FIELD",
|
||||||
|
"message": "Label identifier field metadata is required",
|
||||||
|
"userFriendlyMessage": "Label identifier field metadata is required",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"flatEntityMinimalInformation": {
|
||||||
|
"id": Any<String>,
|
||||||
|
"namePlural": "whatevers",
|
||||||
|
"nameSingular": "whatever",
|
||||||
|
},
|
||||||
|
"type": "update_object",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"serverlessFunction": [],
|
||||||
|
"view": [],
|
||||||
|
"viewField": [],
|
||||||
|
},
|
||||||
|
"message": "Validation failed for 0 object(s) and 0 field(s)",
|
||||||
|
"summary": {
|
||||||
|
"invalidIndex": 0,
|
||||||
|
"invalidObjectMetadata": 0,
|
||||||
|
"invalidServerlessFunction": 0,
|
||||||
|
"invalidView": 0,
|
||||||
|
"invalidViewField": 0,
|
||||||
|
"totalErrors": 0,
|
||||||
|
},
|
||||||
|
"userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)",
|
||||||
|
},
|
||||||
|
"message": "Multiple validation errors occurred while updating object",
|
||||||
|
"name": "GraphQLError",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`;
|
||||||
|
|||||||
+1
-18
@@ -1,35 +1,18 @@
|
|||||||
import { type CreateOneFieldFactoryInput } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata-query-factory.util';
|
import { type CreateOneFieldFactoryInput } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata-query-factory.util';
|
||||||
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
||||||
import { deleteOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/delete-one-field-metadata.util';
|
import { deleteOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/delete-one-field-metadata.util';
|
||||||
|
import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/update-one-field-metadata.util';
|
||||||
import { CUSTOM_OBJECT_DISHES } from 'test/integration/metadata/suites/object-metadata/constants/custom-object-dishes.constants';
|
import { CUSTOM_OBJECT_DISHES } from 'test/integration/metadata/suites/object-metadata/constants/custom-object-dishes.constants';
|
||||||
import { type CreateOneObjectFactoryInput } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata-query-factory.util';
|
import { type CreateOneObjectFactoryInput } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata-query-factory.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/update-one-field-metadata.util';
|
|
||||||
|
|
||||||
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
|
||||||
|
|
||||||
describe('Handle same object sequential operations test suite', () => {
|
describe('Handle same object sequential operations test suite', () => {
|
||||||
let createdObjectMetadataId: string | undefined = undefined;
|
let createdObjectMetadataId: string | undefined = undefined;
|
||||||
|
|
||||||
beforeAll(async () => {
|
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: true,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
afterAll(async () => {
|
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: false,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
if (!isDefined(createdObjectMetadataId)) {
|
if (!isDefined(createdObjectMetadataId)) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
-21
@@ -4,10 +4,6 @@ import { createOneObjectMetadata } from 'test/integration/metadata/suites/object
|
|||||||
import { getMockCreateObjectInput } from 'test/integration/metadata/suites/object-metadata/utils/generate-mock-create-object-metadata-input';
|
import { getMockCreateObjectInput } from 'test/integration/metadata/suites/object-metadata/utils/generate-mock-create-object-metadata-input';
|
||||||
import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any';
|
import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any';
|
||||||
import { eachTestingContextFilter } from 'twenty-shared/testing';
|
import { eachTestingContextFilter } from 'twenty-shared/testing';
|
||||||
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
|
||||||
|
|
||||||
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
|
||||||
import { SEED_APPLE_WORKSPACE_ID } from 'src/engine/workspace-manager/dev-seeder/core/utils/seed-workspaces.util';
|
|
||||||
|
|
||||||
const allTestsUseCases = [
|
const allTestsUseCases = [
|
||||||
...OBJECT_METADATA_NAMES_FAILING_TEST_CASES,
|
...OBJECT_METADATA_NAMES_FAILING_TEST_CASES,
|
||||||
@@ -15,23 +11,6 @@ const allTestsUseCases = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
describe('Object metadata creation should fail v2', () => {
|
describe('Object metadata creation should fail v2', () => {
|
||||||
beforeAll(async () => {
|
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: true,
|
|
||||||
workspaceId: SEED_APPLE_WORKSPACE_ID,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
afterAll(async () => {
|
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: false,
|
|
||||||
workspaceId: SEED_APPLE_WORKSPACE_ID,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
it.each(eachTestingContextFilter(allTestsUseCases))(
|
it.each(eachTestingContextFilter(allTestsUseCases))(
|
||||||
'$title',
|
'$title',
|
||||||
async ({ context }) => {
|
async ({ context }) => {
|
||||||
|
|||||||
+23
-2
@@ -1,9 +1,12 @@
|
|||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
|
||||||
import { getMockCreateObjectInput } from 'test/integration/metadata/suites/object-metadata/utils/generate-mock-create-object-metadata-input';
|
|
||||||
import { OBJECT_METADATA_LABEL_FAILING_TEST_CASES } from 'test/integration/metadata/suites/object-metadata/common/object-metadata-label-failing-tests-cases';
|
import { OBJECT_METADATA_LABEL_FAILING_TEST_CASES } from 'test/integration/metadata/suites/object-metadata/common/object-metadata-label-failing-tests-cases';
|
||||||
import { OBJECT_METADATA_NAMES_FAILING_TEST_CASES } from 'test/integration/metadata/suites/object-metadata/common/object-metadata-names-failing-tests-cases';
|
import { OBJECT_METADATA_NAMES_FAILING_TEST_CASES } from 'test/integration/metadata/suites/object-metadata/common/object-metadata-names-failing-tests-cases';
|
||||||
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
|
import { getMockCreateObjectInput } from 'test/integration/metadata/suites/object-metadata/utils/generate-mock-create-object-metadata-input';
|
||||||
|
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
||||||
|
|
||||||
|
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
||||||
import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
|
import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
|
||||||
|
import { SEED_APPLE_WORKSPACE_ID } from 'src/engine/workspace-manager/dev-seeder/core/utils/seed-workspaces.util';
|
||||||
|
|
||||||
const allTestsUseCases = [
|
const allTestsUseCases = [
|
||||||
...OBJECT_METADATA_NAMES_FAILING_TEST_CASES,
|
...OBJECT_METADATA_NAMES_FAILING_TEST_CASES,
|
||||||
@@ -11,6 +14,24 @@ const allTestsUseCases = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
describe('Object metadata creation should fail', () => {
|
describe('Object metadata creation should fail', () => {
|
||||||
|
beforeAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: false,
|
||||||
|
workspaceId: SEED_APPLE_WORKSPACE_ID,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await updateFeatureFlag({
|
||||||
|
expectToFail: false,
|
||||||
|
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
||||||
|
value: true,
|
||||||
|
workspaceId: SEED_APPLE_WORKSPACE_ID,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it.each(allTestsUseCases)('$title', async ({ context }) => {
|
it.each(allTestsUseCases)('$title', async ({ context }) => {
|
||||||
const { errors } = await createOneObjectMetadata({
|
const { errors } = await createOneObjectMetadata({
|
||||||
input: getMockCreateObjectInput(context),
|
input: getMockCreateObjectInput(context),
|
||||||
|
|||||||
+49
-19
@@ -1,10 +1,13 @@
|
|||||||
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { getMockCreateObjectInput } from 'test/integration/metadata/suites/object-metadata/utils/generate-mock-create-object-metadata-input';
|
|
||||||
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { type EachTestingContext } from 'twenty-shared/testing';
|
import {
|
||||||
|
eachTestingContextFilter,
|
||||||
|
type EachTestingContext,
|
||||||
|
} from 'twenty-shared/testing';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
|
import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any';
|
||||||
|
|
||||||
import { type UpdateObjectPayload } from 'src/engine/metadata-modules/object-metadata/dtos/update-object.input';
|
import { type UpdateObjectPayload } from 'src/engine/metadata-modules/object-metadata/dtos/update-object.input';
|
||||||
|
|
||||||
@@ -32,6 +35,12 @@ const labelIdentifierFailingTestsUseCase: CreateOneObjectMetadataItemTestingCont
|
|||||||
labelIdentifierFieldMetadataId: '42422020-f49c-4159-8751-76a24f47b360',
|
labelIdentifierFieldMetadataId: '42422020-f49c-4159-8751-76a24f47b360',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: 'when labelIdentifier is null',
|
||||||
|
context: {
|
||||||
|
labelIdentifierFieldMetadataId: null as any,
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: 'when labelIdentifier is not a TEXT or NAME field',
|
title: 'when labelIdentifier is not a TEXT or NAME field',
|
||||||
context: ({ numberFieldMetadataId }) => ({
|
context: ({ numberFieldMetadataId }) => ({
|
||||||
@@ -48,7 +57,13 @@ describe('Object metadata update should fail', () => {
|
|||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
const { data } = await createOneObjectMetadata({
|
const { data } = await createOneObjectMetadata({
|
||||||
input: getMockCreateObjectInput(),
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
labelPlural: 'whatevers',
|
||||||
|
labelSingular: 'whatever',
|
||||||
|
namePlural: 'whatevers',
|
||||||
|
nameSingular: 'whatever',
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
objectMetadataId = data.createOneObject.id;
|
objectMetadataId = data.createOneObject.id;
|
||||||
@@ -56,6 +71,7 @@ describe('Object metadata update should fail', () => {
|
|||||||
const {
|
const {
|
||||||
data: { createOneField },
|
data: { createOneField },
|
||||||
} = await createOneFieldMetadata({
|
} = await createOneFieldMetadata({
|
||||||
|
expectToFail: false,
|
||||||
input: {
|
input: {
|
||||||
objectMetadataId: objectMetadataId,
|
objectMetadataId: objectMetadataId,
|
||||||
name: 'testName',
|
name: 'testName',
|
||||||
@@ -69,6 +85,15 @@ describe('Object metadata update should fail', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: objectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: {
|
input: {
|
||||||
idToDelete: objectMetadataId,
|
idToDelete: objectMetadataId,
|
||||||
@@ -76,21 +101,26 @@ describe('Object metadata update should fail', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it.each(allTestsUseCases)('$title', async ({ context }) => {
|
it.each(eachTestingContextFilter(allTestsUseCases))(
|
||||||
const updatePayload =
|
'$title',
|
||||||
typeof context === 'function'
|
async ({ context }) => {
|
||||||
? context({ numberFieldMetadataId, objectMetadataId })
|
const updatePayload =
|
||||||
: context;
|
typeof context === 'function'
|
||||||
|
? context({ numberFieldMetadataId, objectMetadataId })
|
||||||
|
: context;
|
||||||
|
|
||||||
const { errors } = await updateOneObjectMetadata({
|
const { errors } = await updateOneObjectMetadata({
|
||||||
input: {
|
input: {
|
||||||
idToUpdate: objectMetadataId,
|
idToUpdate: objectMetadataId,
|
||||||
updatePayload,
|
updatePayload,
|
||||||
},
|
},
|
||||||
expectToFail: true,
|
expectToFail: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(errors).toBeDefined();
|
expect(errors).toBeDefined();
|
||||||
expect(errors).toMatchSnapshot();
|
expect(errors).toMatchSnapshot(
|
||||||
});
|
extractRecordIdsAndDatesAsExpectAny(errors),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
+49
-3
@@ -1,14 +1,17 @@
|
|||||||
import { findManyFieldsMetadataQueryFactory } from 'test/integration/metadata/suites/field-metadata/utils/find-many-fields-metadata-query-factory.util';
|
import { findManyFieldsMetadataQueryFactory } from 'test/integration/metadata/suites/field-metadata/utils/find-many-fields-metadata-query-factory.util';
|
||||||
import { createMorphRelationBetweenObjects } from 'test/integration/metadata/suites/object-metadata/utils/create-morph-relation-between-objects.util';
|
import { createMorphRelationBetweenObjects } from 'test/integration/metadata/suites/object-metadata/utils/create-morph-relation-between-objects.util';
|
||||||
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { makeMetadataAPIRequest } from 'test/integration/metadata/suites/utils/make-metadata-api-request.util';
|
import { makeMetadataAPIRequest } from 'test/integration/metadata/suites/utils/make-metadata-api-request.util';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { jestExpectToBeDefined } from 'test/utils/expect-to-be-defined.util.test';
|
||||||
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
|
|
||||||
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
||||||
|
|
||||||
describe('Delete Object metadata with morph relation should succeed', () => {
|
describe('Delete Object metadata with morph relation should succeed', () => {
|
||||||
let opportunityId = '';
|
let opportunityId: undefined | string;
|
||||||
let personId = '';
|
let personId = '';
|
||||||
let companyId = '';
|
let companyId = '';
|
||||||
let morphRelationField: { id: string };
|
let morphRelationField: { id: string };
|
||||||
@@ -62,12 +65,45 @@ describe('Delete Object metadata with morph relation should succeed', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
await deleteOneObjectMetadata({ input: { idToDelete: opportunityId } });
|
if (isDefined(opportunityId)) {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: opportunityId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
await deleteOneObjectMetadata({ input: { idToDelete: opportunityId } });
|
||||||
|
opportunityId = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: personId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({ input: { idToDelete: personId } });
|
await deleteOneObjectMetadata({ input: { idToDelete: personId } });
|
||||||
|
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: companyId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({ input: { idToDelete: companyId } });
|
await deleteOneObjectMetadata({ input: { idToDelete: companyId } });
|
||||||
});
|
});
|
||||||
|
|
||||||
it('When deleting source object, the relation on the target should be deleted', async () => {
|
it('When deleting source object, the relation on the target should be deleted', async () => {
|
||||||
|
jestExpectToBeDefined(opportunityId);
|
||||||
morphRelationField = await createMorphRelationBetweenObjects({
|
morphRelationField = await createMorphRelationBetweenObjects({
|
||||||
objectMetadataId: opportunityId,
|
objectMetadataId: opportunityId,
|
||||||
firstTargetObjectMetadataId: personId,
|
firstTargetObjectMetadataId: personId,
|
||||||
@@ -76,12 +112,22 @@ describe('Delete Object metadata with morph relation should succeed', () => {
|
|||||||
relationType: RelationType.MANY_TO_ONE,
|
relationType: RelationType.MANY_TO_ONE,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: opportunityId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({ input: { idToDelete: opportunityId } });
|
await deleteOneObjectMetadata({ input: { idToDelete: opportunityId } });
|
||||||
const fieldAfterDeletion = await findFieldMetadata({
|
const fieldAfterDeletion = await findFieldMetadata({
|
||||||
fieldMetadataId: morphRelationField.id,
|
fieldMetadataId: morphRelationField.id,
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(fieldAfterDeletion).toBeUndefined();
|
expect(fieldAfterDeletion).toBeUndefined();
|
||||||
|
opportunityId = undefined;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
+46
-59
@@ -1,37 +1,18 @@
|
|||||||
import { findManyFieldsMetadataQueryFactory } from 'test/integration/metadata/suites/field-metadata/utils/find-many-fields-metadata-query-factory.util';
|
import { findManyFieldsMetadataQueryFactory } from 'test/integration/metadata/suites/field-metadata/utils/find-many-fields-metadata-query-factory.util';
|
||||||
import { createMorphRelationBetweenObjects } from 'test/integration/metadata/suites/object-metadata/utils/create-morph-relation-between-objects.util';
|
import { createMorphRelationBetweenObjects } from 'test/integration/metadata/suites/object-metadata/utils/create-morph-relation-between-objects.util';
|
||||||
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { makeMetadataAPIRequest } from 'test/integration/metadata/suites/utils/make-metadata-api-request.util';
|
import { makeMetadataAPIRequest } from 'test/integration/metadata/suites/utils/make-metadata-api-request.util';
|
||||||
import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util';
|
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
|
||||||
|
|
||||||
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
||||||
|
|
||||||
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
|
||||||
|
|
||||||
describe('Rename an object metadata with morph relation should succeed', () => {
|
describe('Rename an object metadata with morph relation should succeed', () => {
|
||||||
let createdObjectMetadataPersonId: string;
|
let createdObjectMetadataPersonId: string;
|
||||||
let createdObjectMetadataOpportunityId: string;
|
let createdObjectMetadataOpportunityId: string;
|
||||||
let createdObjectMetadataCompanyId: string;
|
let createdObjectMetadataCompanyId: string;
|
||||||
|
|
||||||
beforeAll(async () => {
|
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: true,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
afterAll(async () => {
|
|
||||||
await updateFeatureFlag({
|
|
||||||
expectToFail: false,
|
|
||||||
featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED,
|
|
||||||
value: false,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
const {
|
const {
|
||||||
data: {
|
data: {
|
||||||
@@ -102,57 +83,63 @@ describe('Rename an object metadata with morph relation should succeed', () => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should rename custom object, and update both the field name and join column name of the morph relation that contains the object name', async () => {
|
it.failing(
|
||||||
const morphRelationField = await createMorphRelationBetweenObjects({
|
'should rename custom object, and update both the field name and join column name of the morph relation that contains the object name',
|
||||||
name: 'owner',
|
async () => {
|
||||||
objectMetadataId: createdObjectMetadataOpportunityId,
|
const morphRelationField = await createMorphRelationBetweenObjects({
|
||||||
firstTargetObjectMetadataId: createdObjectMetadataPersonId,
|
name: 'owner',
|
||||||
secondTargetObjectMetadataId: createdObjectMetadataCompanyId,
|
objectMetadataId: createdObjectMetadataOpportunityId,
|
||||||
type: FieldMetadataType.MORPH_RELATION,
|
firstTargetObjectMetadataId: createdObjectMetadataPersonId,
|
||||||
relationType: RelationType.MANY_TO_ONE,
|
secondTargetObjectMetadataId: createdObjectMetadataCompanyId,
|
||||||
});
|
type: FieldMetadataType.MORPH_RELATION,
|
||||||
|
relationType: RelationType.MANY_TO_ONE,
|
||||||
|
});
|
||||||
|
|
||||||
expect(morphRelationField.morphRelations.length).toBe(2);
|
expect(morphRelationField.morphRelations.length).toBe(2);
|
||||||
|
|
||||||
const { data } = await updateOneObjectMetadata({
|
const { data } = await updateOneObjectMetadata({
|
||||||
gqlFields: `
|
expectToFail: false,
|
||||||
|
gqlFields: `
|
||||||
nameSingular
|
nameSingular
|
||||||
labelSingular
|
labelSingular
|
||||||
namePlural
|
namePlural
|
||||||
labelPlural
|
labelPlural
|
||||||
`,
|
`,
|
||||||
input: {
|
input: {
|
||||||
idToUpdate: createdObjectMetadataPersonId,
|
idToUpdate: createdObjectMetadataPersonId,
|
||||||
updatePayload: {
|
updatePayload: {
|
||||||
nameSingular: 'personForRenameSecond2',
|
nameSingular: 'personForRenameSecond2',
|
||||||
namePlural: 'peopleForRenameSecond2',
|
namePlural: 'peopleForRenameSecond2',
|
||||||
labelSingular: 'Person For Rename2',
|
labelSingular: 'Person For Rename2',
|
||||||
labelPlural: 'People For Rename2',
|
labelPlural: 'People For Rename2',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
});
|
||||||
});
|
|
||||||
|
|
||||||
expect(data.updateOneObject.nameSingular).toBe('personForRenameSecond2');
|
expect(data.updateOneObject.nameSingular).toBe('personForRenameSecond2');
|
||||||
|
|
||||||
const ownerFieldMetadataOnPersonId = morphRelationField.morphRelations.find(
|
const ownerFieldMetadataOnPersonId =
|
||||||
(morphRelation) =>
|
morphRelationField.morphRelations.find(
|
||||||
morphRelation.targetObjectMetadata.id === createdObjectMetadataPersonId,
|
(morphRelation) =>
|
||||||
)?.sourceFieldMetadata.id;
|
morphRelation.targetObjectMetadata.id ===
|
||||||
|
createdObjectMetadataPersonId,
|
||||||
|
)?.sourceFieldMetadata.id;
|
||||||
|
|
||||||
if (!ownerFieldMetadataOnPersonId) {
|
if (!ownerFieldMetadataOnPersonId) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
'Morph Relation Error: Owner field metadata on person not found',
|
'Morph Relation Error: Owner field metadata on person not found',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const fieldAfterRenaming = await findFieldMetadata({
|
||||||
|
fieldMetadataId: ownerFieldMetadataOnPersonId,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(fieldAfterRenaming.settings.joinColumnName).toBe(
|
||||||
|
'ownerPersonForRenameSecond2Id',
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
|
);
|
||||||
const fieldAfterRenaming = await findFieldMetadata({
|
|
||||||
fieldMetadataId: ownerFieldMetadataOnPersonId,
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(fieldAfterRenaming.settings.joinColumnName).toBe(
|
|
||||||
'ownerPersonForRenameSecondId',
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const findFieldMetadata = async ({
|
const findFieldMetadata = async ({
|
||||||
|
|||||||
+74
-29
@@ -1,10 +1,13 @@
|
|||||||
import { findManyFieldsMetadataQueryFactory } from 'test/integration/metadata/suites/field-metadata/utils/find-many-fields-metadata-query-factory.util';
|
import { findManyFieldsMetadataQueryFactory } from 'test/integration/metadata/suites/field-metadata/utils/find-many-fields-metadata-query-factory.util';
|
||||||
import { createRelationBetweenObjects } from 'test/integration/metadata/suites/object-metadata/utils/create-relation-between-objects.util';
|
import { createRelationBetweenObjects } from 'test/integration/metadata/suites/object-metadata/utils/create-relation-between-objects.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { makeMetadataAPIRequest } from 'test/integration/metadata/suites/utils/make-metadata-api-request.util';
|
import { makeMetadataAPIRequest } from 'test/integration/metadata/suites/utils/make-metadata-api-request.util';
|
||||||
import { type EachTestingContext } from 'twenty-shared/testing';
|
import { type EachTestingContext } from 'twenty-shared/testing';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
|
import { jestExpectToBeDefined } from 'test/utils/expect-to-be-defined.util.test';
|
||||||
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
|
|
||||||
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
||||||
|
|
||||||
@@ -42,14 +45,10 @@ const successfulDeleteTargetUseCase: DeleteOneObjectMetadataItemTestingContext =
|
|||||||
];
|
];
|
||||||
|
|
||||||
describe('Delete Object metadata with relation should succeed', () => {
|
describe('Delete Object metadata with relation should succeed', () => {
|
||||||
let createdObjectMetadataPersonId = '';
|
let createdObjectMetadataPersonId: undefined | string;
|
||||||
let createdObjectMetadataOpportunityId = '';
|
let createdObjectMetadataOpportunityId: undefined | string;
|
||||||
let globalTestContext: {
|
let relationField: FieldMetadataDTO & {
|
||||||
opportunityMetadataId: string;
|
relation: RelationDTO;
|
||||||
personMetadataId: string;
|
|
||||||
relationField: FieldMetadataDTO & {
|
|
||||||
relation: RelationDTO;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
@@ -58,6 +57,7 @@ describe('Delete Object metadata with relation should succeed', () => {
|
|||||||
createOneObject: { id: objectMetadataPersonId },
|
createOneObject: { id: objectMetadataPersonId },
|
||||||
},
|
},
|
||||||
} = await createOneObjectMetadata({
|
} = await createOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
input: {
|
input: {
|
||||||
nameSingular: 'personForRelation',
|
nameSingular: 'personForRelation',
|
||||||
namePlural: 'peopleForRelation',
|
namePlural: 'peopleForRelation',
|
||||||
@@ -74,6 +74,7 @@ describe('Delete Object metadata with relation should succeed', () => {
|
|||||||
createOneObject: { id: objectMetadataOpportunityId },
|
createOneObject: { id: objectMetadataOpportunityId },
|
||||||
},
|
},
|
||||||
} = await createOneObjectMetadata({
|
} = await createOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
input: {
|
input: {
|
||||||
nameSingular: 'opportunityForRelation',
|
nameSingular: 'opportunityForRelation',
|
||||||
namePlural: 'opportunitiesForRelation',
|
namePlural: 'opportunitiesForRelation',
|
||||||
@@ -85,38 +86,70 @@ describe('Delete Object metadata with relation should succeed', () => {
|
|||||||
|
|
||||||
createdObjectMetadataOpportunityId = objectMetadataOpportunityId;
|
createdObjectMetadataOpportunityId = objectMetadataOpportunityId;
|
||||||
|
|
||||||
globalTestContext = {
|
relationField =
|
||||||
opportunityMetadataId: createdObjectMetadataOpportunityId,
|
await createRelationBetweenObjects<FieldMetadataType.RELATION>({
|
||||||
personMetadataId: createdObjectMetadataPersonId,
|
objectMetadataId: createdObjectMetadataOpportunityId,
|
||||||
relationField:
|
targetObjectMetadataId: createdObjectMetadataPersonId,
|
||||||
await createRelationBetweenObjects<FieldMetadataType.RELATION>({
|
type: FieldMetadataType.RELATION,
|
||||||
objectMetadataId: createdObjectMetadataOpportunityId,
|
relationType: RelationType.MANY_TO_ONE,
|
||||||
targetObjectMetadataId: createdObjectMetadataPersonId,
|
});
|
||||||
type: FieldMetadataType.RELATION,
|
|
||||||
relationType: RelationType.MANY_TO_ONE,
|
|
||||||
}),
|
|
||||||
};
|
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
await deleteOneObjectMetadata({
|
if (isDefined(createdObjectMetadataPersonId)) {
|
||||||
input: { idToDelete: createdObjectMetadataPersonId },
|
await updateOneObjectMetadata({
|
||||||
});
|
expectToFail: false,
|
||||||
await deleteOneObjectMetadata({
|
input: {
|
||||||
input: { idToDelete: createdObjectMetadataOpportunityId },
|
idToUpdate: createdObjectMetadataPersonId,
|
||||||
});
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
await deleteOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: { idToDelete: createdObjectMetadataPersonId },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isDefined(createdObjectMetadataOpportunityId)) {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: createdObjectMetadataOpportunityId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
await deleteOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: { idToDelete: createdObjectMetadataOpportunityId },
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it.each(successfulDeleteSourceUseCase)('$title', async ({ context }) => {
|
it.each(successfulDeleteSourceUseCase)('$title', async ({ context }) => {
|
||||||
|
jestExpectToBeDefined(createdObjectMetadataPersonId);
|
||||||
const computedContext = context({
|
const computedContext = context({
|
||||||
objectMetadataIdToDelete: globalTestContext.personMetadataId,
|
objectMetadataIdToDelete: createdObjectMetadataPersonId,
|
||||||
relationFieldId: globalTestContext.relationField.id,
|
relationFieldId: relationField.id,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: computedContext.objectMetadataIdToDelete,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: computedContext.objectMetadataIdToDelete },
|
input: { idToDelete: computedContext.objectMetadataIdToDelete },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
createdObjectMetadataPersonId = undefined;
|
||||||
const opportunityFieldOnPersonAfterDeletion = await findFieldMetadata({
|
const opportunityFieldOnPersonAfterDeletion = await findFieldMetadata({
|
||||||
fieldMetadataId: computedContext.relationFieldId,
|
fieldMetadataId: computedContext.relationFieldId,
|
||||||
});
|
});
|
||||||
@@ -125,15 +158,27 @@ describe('Delete Object metadata with relation should succeed', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it.each(successfulDeleteTargetUseCase)('$title', async ({ context }) => {
|
it.each(successfulDeleteTargetUseCase)('$title', async ({ context }) => {
|
||||||
|
jestExpectToBeDefined(createdObjectMetadataOpportunityId);
|
||||||
const computedContext = context({
|
const computedContext = context({
|
||||||
objectMetadataIdToDelete: globalTestContext.opportunityMetadataId,
|
objectMetadataIdToDelete: createdObjectMetadataOpportunityId,
|
||||||
relationFieldId: globalTestContext.relationField.id,
|
relationFieldId: relationField.id,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: computedContext.objectMetadataIdToDelete,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
input: { idToDelete: computedContext.objectMetadataIdToDelete },
|
input: { idToDelete: computedContext.objectMetadataIdToDelete },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
createdObjectMetadataOpportunityId = undefined;
|
||||||
const personFieldOnOpportunityAfterDeletion = await findFieldMetadata({
|
const personFieldOnOpportunityAfterDeletion = await findFieldMetadata({
|
||||||
fieldMetadataId: computedContext.relationFieldId,
|
fieldMetadataId: computedContext.relationFieldId,
|
||||||
});
|
});
|
||||||
|
|||||||
+4
-43
@@ -163,58 +163,19 @@ describe('Custom object renaming', () => {
|
|||||||
expect(data.updateOneObject.namePlural).toBe(HOUSE_NAME_PLURAL);
|
expect(data.updateOneObject.namePlural).toBe(HOUSE_NAME_PLURAL);
|
||||||
expect(data.updateOneObject.labelSingular).toBe(HOUSE_LABEL_SINGULAR);
|
expect(data.updateOneObject.labelSingular).toBe(HOUSE_LABEL_SINGULAR);
|
||||||
expect(data.updateOneObject.labelPlural).toBe(HOUSE_LABEL_PLURAL);
|
expect(data.updateOneObject.labelPlural).toBe(HOUSE_LABEL_PLURAL);
|
||||||
|
|
||||||
const fieldsResponse = await makeMetadataAPIRequest(fieldsGraphqlOperation);
|
|
||||||
|
|
||||||
const fieldsMetadata = fieldsResponse.body.data.fields.edges.map(
|
|
||||||
// @ts-expect-error legacy noImplicitAny
|
|
||||||
(field) => field.node,
|
|
||||||
);
|
|
||||||
|
|
||||||
// standard relations have been updated
|
|
||||||
STANDARD_OBJECT_RELATIONS.forEach((relation) => {
|
|
||||||
// relation field
|
|
||||||
const relationFieldMetadataId =
|
|
||||||
// @ts-expect-error legacy noImplicitAny
|
|
||||||
standardObjectRelationsMap[relation].relationFieldMetadataId;
|
|
||||||
|
|
||||||
const updatedRelationFieldMetadata = fieldsMetadata.find(
|
|
||||||
// @ts-expect-error legacy noImplicitAny
|
|
||||||
(field) => field.id === relationFieldMetadataId,
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(updatedRelationFieldMetadata.name).toBe(HOUSE_NAME_SINGULAR);
|
|
||||||
expect(updatedRelationFieldMetadata.label).toBe(HOUSE_LABEL_SINGULAR);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('3. should fail when trying to rename object to "name"', async () => {
|
it('3. should delete custom object', async () => {
|
||||||
// Act & Assert
|
await updateOneObjectMetadata({
|
||||||
const { errors } = await updateOneObjectMetadata({
|
expectToFail: false,
|
||||||
gqlFields: `
|
|
||||||
nameSingular
|
|
||||||
labelSingular
|
|
||||||
namePlural
|
|
||||||
labelPlural
|
|
||||||
`,
|
|
||||||
input: {
|
input: {
|
||||||
idToUpdate: listingObjectId,
|
idToUpdate: listingObjectId,
|
||||||
updatePayload: {
|
updatePayload: {
|
||||||
nameSingular: 'name',
|
isActive: false,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
expectToFail: true,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Assert that an error was thrown
|
|
||||||
expect(errors).toBeDefined();
|
|
||||||
expect(errors).toHaveLength(1);
|
|
||||||
expect(errors[0].extensions.userFriendlyMessage).toContain(
|
|
||||||
'Name "name" is not available',
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('4. should delete custom object', async () => {
|
|
||||||
const { data } = await deleteOneObjectMetadata({
|
const { data } = await deleteOneObjectMetadata({
|
||||||
input: {
|
input: {
|
||||||
idToDelete: listingObjectId,
|
idToDelete: listingObjectId,
|
||||||
|
|||||||
+25
-4
@@ -1,7 +1,9 @@
|
|||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
import { getMockCreateObjectInput } from 'test/integration/metadata/suites/object-metadata/utils/generate-mock-create-object-metadata-input';
|
import { getMockCreateObjectInput } from 'test/integration/metadata/suites/object-metadata/utils/generate-mock-create-object-metadata-input';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { type EachTestingContext } from 'twenty-shared/testing';
|
import { type EachTestingContext } from 'twenty-shared/testing';
|
||||||
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
|
|
||||||
import { type CreateObjectInput } from 'src/engine/metadata-modules/object-metadata/dtos/create-object.input';
|
import { type CreateObjectInput } from 'src/engine/metadata-modules/object-metadata/dtos/create-object.input';
|
||||||
|
|
||||||
@@ -19,20 +21,39 @@ const successfulObjectMetadataItemCreateOneUseCase: CreateOneObjectMetadataItemT
|
|||||||
title: 'with basic input',
|
title: 'with basic input',
|
||||||
context: {},
|
context: {},
|
||||||
},
|
},
|
||||||
// TODO populate
|
|
||||||
];
|
];
|
||||||
|
|
||||||
const allTestsUseCases = [...successfulObjectMetadataItemCreateOneUseCase];
|
const allTestsUseCases = [...successfulObjectMetadataItemCreateOneUseCase];
|
||||||
|
|
||||||
describe('Object metadata creation should succeed', () => {
|
describe('Object metadata creation should succeed', () => {
|
||||||
|
let createdObjectId: string | undefined;
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
if (!isDefined(createdObjectId)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: createdObjectId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
await deleteOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: { idToDelete: createdObjectId },
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it.each(allTestsUseCases)('$title', async ({ context }) => {
|
it.each(allTestsUseCases)('$title', async ({ context }) => {
|
||||||
const { data } = await createOneObjectMetadata({
|
const { data } = await createOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
input: getMockCreateObjectInput(context),
|
input: getMockCreateObjectInput(context),
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(data.createOneObject.id).toBeDefined();
|
expect(data.createOneObject.id).toBeDefined();
|
||||||
await deleteOneObjectMetadata({
|
createdObjectId = data.createOneObject.id;
|
||||||
input: { idToDelete: data.createOneObject.id },
|
|
||||||
}).catch();
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
+1
-1
@@ -13,7 +13,7 @@ import { type ObjectMetadataDTO } from 'src/engine/metadata-modules/object-metad
|
|||||||
export const createOneObjectMetadata = async ({
|
export const createOneObjectMetadata = async ({
|
||||||
input,
|
input,
|
||||||
gqlFields,
|
gqlFields,
|
||||||
expectToFail,
|
expectToFail = false,
|
||||||
}: PerformMetadataQueryParams<CreateOneObjectFactoryInput>): CommonResponseBody<{
|
}: PerformMetadataQueryParams<CreateOneObjectFactoryInput>): CommonResponseBody<{
|
||||||
createOneObject: ObjectMetadataDTO;
|
createOneObject: ObjectMetadataDTO;
|
||||||
}> => {
|
}> => {
|
||||||
|
|||||||
+1
-1
@@ -10,7 +10,7 @@ import { warnIfNoErrorButExpectedToFail } from 'test/integration/metadata/utils/
|
|||||||
export const deleteOneObjectMetadata = async ({
|
export const deleteOneObjectMetadata = async ({
|
||||||
input,
|
input,
|
||||||
gqlFields,
|
gqlFields,
|
||||||
expectToFail,
|
expectToFail = false,
|
||||||
}: PerformMetadataQueryParams<DeleteOneObjectFactoryInput>) => {
|
}: PerformMetadataQueryParams<DeleteOneObjectFactoryInput>) => {
|
||||||
const graphqlOperation = deleteOneObjectMetadataQueryFactory({
|
const graphqlOperation = deleteOneObjectMetadataQueryFactory({
|
||||||
input,
|
input,
|
||||||
|
|||||||
+1
@@ -24,6 +24,7 @@ export const forceCreateOneObjectMetadata = async ({
|
|||||||
input: CreateOneObjectFactoryInput;
|
input: CreateOneObjectFactoryInput;
|
||||||
}) => {
|
}) => {
|
||||||
const result = await createOneObjectMetadata({
|
const result = await createOneObjectMetadata({
|
||||||
|
expectToFail: null,
|
||||||
input: {
|
input: {
|
||||||
labelSingular,
|
labelSingular,
|
||||||
labelPlural,
|
labelPlural,
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
export type PerformMetadataQueryParams<T> = {
|
export type PerformMetadataQueryParams<T> = {
|
||||||
input: T;
|
input: T;
|
||||||
gqlFields?: string;
|
gqlFields?: string;
|
||||||
expectToFail?: boolean;
|
expectToFail?: boolean | null;
|
||||||
};
|
};
|
||||||
|
|||||||
+10
@@ -2,6 +2,7 @@ import { TEST_NOT_EXISTING_PAGE_LAYOUT_ID } from 'test/integration/constants/tes
|
|||||||
import { TEST_NOT_EXISTING_PAGE_LAYOUT_TAB_ID } from 'test/integration/constants/test-page-layout-tab-ids.constants';
|
import { TEST_NOT_EXISTING_PAGE_LAYOUT_TAB_ID } from 'test/integration/constants/test-page-layout-tab-ids.constants';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { makeRestAPIRequest } from 'test/integration/rest/utils/make-rest-api-request.util';
|
import { makeRestAPIRequest } from 'test/integration/rest/utils/make-rest-api-request.util';
|
||||||
import {
|
import {
|
||||||
createTestPageLayoutWithRestApi,
|
createTestPageLayoutWithRestApi,
|
||||||
@@ -59,6 +60,15 @@ describe('Page Layout Tab REST API', () => {
|
|||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
await deleteTestPageLayoutWithRestApi(testPageLayoutId);
|
await deleteTestPageLayoutWithRestApi(testPageLayoutId);
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: testObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: testObjectMetadataId },
|
input: { idToDelete: testObjectMetadataId },
|
||||||
});
|
});
|
||||||
|
|||||||
+10
@@ -2,6 +2,7 @@ import { TEST_NOT_EXISTING_PAGE_LAYOUT_TAB_ID } from 'test/integration/constants
|
|||||||
import { TEST_NOT_EXISTING_PAGE_LAYOUT_WIDGET_ID } from 'test/integration/constants/test-page-layout-widget-ids.constants';
|
import { TEST_NOT_EXISTING_PAGE_LAYOUT_WIDGET_ID } from 'test/integration/constants/test-page-layout-widget-ids.constants';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { makeRestAPIRequest } from 'test/integration/rest/utils/make-rest-api-request.util';
|
import { makeRestAPIRequest } from 'test/integration/rest/utils/make-rest-api-request.util';
|
||||||
import {
|
import {
|
||||||
createTestPageLayoutWithRestApi,
|
createTestPageLayoutWithRestApi,
|
||||||
@@ -74,6 +75,15 @@ describe('Page Layout Widget REST API', () => {
|
|||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
await deleteTestPageLayoutTabWithRestApi(testPageLayoutTabId);
|
await deleteTestPageLayoutTabWithRestApi(testPageLayoutTabId);
|
||||||
await deleteTestPageLayoutWithRestApi(testPageLayoutId);
|
await deleteTestPageLayoutWithRestApi(testPageLayoutId);
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: testObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: testObjectMetadataId },
|
input: { idToDelete: testObjectMetadataId },
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { TEST_NOT_EXISTING_PAGE_LAYOUT_ID } from 'test/integration/constants/test-page-layout-ids.constants';
|
import { TEST_NOT_EXISTING_PAGE_LAYOUT_ID } from 'test/integration/constants/test-page-layout-ids.constants';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { makeRestAPIRequest } from 'test/integration/rest/utils/make-rest-api-request.util';
|
import { makeRestAPIRequest } from 'test/integration/rest/utils/make-rest-api-request.util';
|
||||||
import {
|
import {
|
||||||
createTestPageLayoutWithRestApi,
|
createTestPageLayoutWithRestApi,
|
||||||
@@ -44,6 +45,15 @@ describe('Page Layout REST API', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: testObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: testObjectMetadataId },
|
input: { idToDelete: testObjectMetadataId },
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ import {
|
|||||||
TEST_VIEW_1_ID,
|
TEST_VIEW_1_ID,
|
||||||
} from 'test/integration/constants/test-view-ids.constants';
|
} from 'test/integration/constants/test-view-ids.constants';
|
||||||
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
||||||
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { makeRestAPIRequest } from 'test/integration/rest/utils/make-rest-api-request.util';
|
import { makeRestAPIRequest } from 'test/integration/rest/utils/make-rest-api-request.util';
|
||||||
import {
|
import {
|
||||||
assertRestApiErrorNotFoundResponse,
|
assertRestApiErrorNotFoundResponse,
|
||||||
@@ -20,7 +22,6 @@ import {
|
|||||||
cleanupViewRecords,
|
cleanupViewRecords,
|
||||||
} from 'test/integration/utils/view-test.util';
|
} from 'test/integration/utils/view-test.util';
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
generateViewFieldExceptionMessage,
|
generateViewFieldExceptionMessage,
|
||||||
@@ -76,6 +77,15 @@ describe('View Field REST API', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: testObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
expectToFail: false,
|
expectToFail: false,
|
||||||
input: { idToDelete: testObjectMetadataId },
|
input: { idToDelete: testObjectMetadataId },
|
||||||
|
|||||||
+10
-4
@@ -4,6 +4,7 @@ import {
|
|||||||
} from 'test/integration/constants/test-view-ids.constants';
|
} from 'test/integration/constants/test-view-ids.constants';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { makeRestAPIRequest } from 'test/integration/rest/utils/make-rest-api-request.util';
|
import { makeRestAPIRequest } from 'test/integration/rest/utils/make-rest-api-request.util';
|
||||||
import {
|
import {
|
||||||
assertRestApiErrorNotFoundResponse,
|
assertRestApiErrorNotFoundResponse,
|
||||||
@@ -31,10 +32,6 @@ describe('View Filter Group REST API', () => {
|
|||||||
let testObjectMetadataId: string;
|
let testObjectMetadataId: string;
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
await deleteOneObjectMetadata({
|
|
||||||
input: { idToDelete: testObjectMetadataId },
|
|
||||||
});
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
data: {
|
data: {
|
||||||
createOneObject: { id: objectMetadataId },
|
createOneObject: { id: objectMetadataId },
|
||||||
@@ -53,6 +50,15 @@ describe('View Filter Group REST API', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: testObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: testObjectMetadataId },
|
input: { idToDelete: testObjectMetadataId },
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import {
|
|||||||
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { makeRestAPIRequest } from 'test/integration/rest/utils/make-rest-api-request.util';
|
import { makeRestAPIRequest } from 'test/integration/rest/utils/make-rest-api-request.util';
|
||||||
import {
|
import {
|
||||||
assertRestApiErrorNotFoundResponse,
|
assertRestApiErrorNotFoundResponse,
|
||||||
@@ -70,6 +71,15 @@ describe('View Filter REST API', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: testObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: testObjectMetadataId },
|
input: { idToDelete: testObjectMetadataId },
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import {
|
|||||||
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { makeRestAPIRequest } from 'test/integration/rest/utils/make-rest-api-request.util';
|
import { makeRestAPIRequest } from 'test/integration/rest/utils/make-rest-api-request.util';
|
||||||
import {
|
import {
|
||||||
assertRestApiErrorNotFoundResponse,
|
assertRestApiErrorNotFoundResponse,
|
||||||
@@ -34,15 +35,12 @@ describe('View Group REST API', () => {
|
|||||||
let testFieldMetadataId: string;
|
let testFieldMetadataId: string;
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
await deleteOneObjectMetadata({
|
|
||||||
input: { idToDelete: testObjectMetadataId },
|
|
||||||
});
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
data: {
|
data: {
|
||||||
createOneObject: { id: objectMetadataId },
|
createOneObject: { id: objectMetadataId },
|
||||||
},
|
},
|
||||||
} = await createOneObjectMetadata({
|
} = await createOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
input: {
|
input: {
|
||||||
nameSingular: 'myTestObject',
|
nameSingular: 'myTestObject',
|
||||||
namePlural: 'myTestObjects',
|
namePlural: 'myTestObjects',
|
||||||
@@ -80,6 +78,15 @@ describe('View Group REST API', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: testObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: testObjectMetadataId },
|
input: { idToDelete: testObjectMetadataId },
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import {
|
|||||||
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
||||||
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
|
||||||
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
|
||||||
|
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
|
||||||
import { makeRestAPIRequest } from 'test/integration/rest/utils/make-rest-api-request.util';
|
import { makeRestAPIRequest } from 'test/integration/rest/utils/make-rest-api-request.util';
|
||||||
import {
|
import {
|
||||||
assertRestApiErrorNotFoundResponse,
|
assertRestApiErrorNotFoundResponse,
|
||||||
@@ -75,6 +76,15 @@ describe('View Sort REST API', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
|
await updateOneObjectMetadata({
|
||||||
|
expectToFail: false,
|
||||||
|
input: {
|
||||||
|
idToUpdate: testObjectMetadataId,
|
||||||
|
updatePayload: {
|
||||||
|
isActive: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
await deleteOneObjectMetadata({
|
await deleteOneObjectMetadata({
|
||||||
input: { idToDelete: testObjectMetadataId },
|
input: { idToDelete: testObjectMetadataId },
|
||||||
});
|
});
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user