From 580ce312fd0ca7ba443ebe48e6a0d9b0bc482ea7 Mon Sep 17 00:00:00 2001 From: Etienne <45695613+etiennejouan@users.noreply.github.com> Date: Mon, 20 Oct 2025 18:19:50 +0200 Subject: [PATCH] Common api - Add field create input validation integration testing (#15026) closes https://github.com/twentyhq/core-team-issues/issues/1624 --- .../types/field-metadata-type-to-test.ts | 15 - .../test-object-gql-fields.constant.ts | 5 + ...-input-validation.integration-spec.ts.snap | 9 + ...-input-validation.integration-spec.ts.snap | 21 + ...-input-validation.integration-spec.ts.snap | 21 + ...-input-validation.integration-spec.ts.snap | 13 + ...-input-validation.integration-spec.ts.snap | 21 + ...-input-validation.integration-spec.ts.snap | 5 + ...-input-validation.integration-spec.ts.snap | 17 + ...-input-validation.integration-spec.ts.snap | 5 + ...-input-validation.integration-spec.ts.snap | 21 + ...-input-validation.integration-spec.ts.snap | 5 + ...-input-validation.integration-spec.ts.snap | 21 + ...reate-input-validation.integration-spec.ts | 71 +++ ...reate-input-validation.integration-spec.ts | 110 +++++ ...reate-input-validation.integration-spec.ts | 105 +++++ ...e-input-by-field-metadata-type.constant.ts | 418 +++++++++++++++++ ...e-input-by-field-metadata-type.constant.ts | 425 ++++++++++++++++++ ...reate-input-validation.integration-spec.ts | 71 +++ ...reate-input-validation.integration-spec.ts | 110 +++++ ...reate-input-validation.integration-spec.ts | 110 +++++ ...reate-input-validation.integration-spec.ts | 71 +++ ...reate-input-validation.integration-spec.ts | 71 +++ ...reate-input-validation.integration-spec.ts | 71 +++ ...reate-input-validation.integration-spec.ts | 110 +++++ ...reate-input-validation.integration-spec.ts | 105 +++++ ...reate-input-validation.integration-spec.ts | 71 +++ ...reate-input-validation.integration-spec.ts | 110 +++++ ...reate-input-validation.integration-spec.ts | 110 +++++ ...reate-input-validation.integration-spec.ts | 110 +++++ ...reate-input-validation.integration-spec.ts | 68 +++ ...reate-input-validation.integration-spec.ts | 71 +++ ...reate-input-validation.integration-spec.ts | 110 +++++ ...reate-input-validation.integration-spec.ts | 110 +++++ ...-gql-create-input-validation-error.util.ts | 20 + ...ql-create-input-validation-success.util.ts | 30 ++ ...rest-create-input-validation-error.util.ts | 15 + ...st-create-input-validation-success.util.ts | 22 + ...reate-input-validation.integration-spec.ts | 110 +++++ ...ilter-input-validation.integration-spec.ts | 16 +- ...ilter-input-validation.integration-spec.ts | 18 +- ...ilter-input-validation.integration-spec.ts | 21 +- ...r-input-by-field-metadata-type.constant.ts | 7 +- ...r-input-by-field-metadata-type.constant.ts | 8 +- ...ilter-input-validation.integration-spec.ts | 16 +- ...ilter-input-validation.integration-spec.ts | 26 +- ...ilter-input-validation.integration-spec.ts | 26 +- ...ilter-input-validation.integration-spec.ts | 16 +- ...ilter-input-validation.integration-spec.ts | 16 +- ...ilter-input-validation.integration-spec.ts | 16 +- ...ilter-input-validation.integration-spec.ts | 26 +- ...ilter-input-validation.integration-spec.ts | 20 +- ...ilter-input-validation.integration-spec.ts | 16 +- ...ilter-input-validation.integration-spec.ts | 26 +- ...ilter-input-validation.integration-spec.ts | 20 +- ...ilter-input-validation.integration-spec.ts | 26 +- ...ilter-input-validation.integration-spec.ts | 24 +- ...ilter-input-validation.integration-spec.ts | 27 +- .../utils/test-gql-failing-scenario.util.ts | 0 .../test-gql-successful-scenario.util.ts | 2 +- .../utils/test-rest-failing-scenario.util.ts | 0 .../test-rest-successful-scenario.util.ts | 0 ...ilter-input-validation.integration-spec.ts | 26 +- .../types/field-metadata-type-to-test.ts | 27 ++ .../utils/destroy-many-objects-metadata.ts | 0 ...get-field-metadata-creation-inputs.util.ts | 25 +- ...-test-objects-with-all-field-types.util.ts | 29 +- 67 files changed, 3239 insertions(+), 225 deletions(-) delete mode 100644 packages/twenty-server/test/integration/graphql/suites/args-validation/types/field-metadata-type-to-test.ts rename packages/twenty-server/test/integration/graphql/suites/{args-validation/filter-validation => inputs-validation}/constants/test-object-gql-fields.constant.ts (91%) create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/array-field-create-input-validation.integration-spec.ts.snap create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/date-field-create-input-validation.integration-spec.ts.snap create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/date-time-field-create-input-validation.integration-spec.ts.snap create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/multi-select-field-create-input-validation.integration-spec.ts.snap create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/rating-field-create-input-validation.integration-spec.ts.snap create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/raw-json-field-create-input-validation.integration-spec.ts.snap create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/relation-field-create-input-validation.integration-spec.ts.snap create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/rich-text-field-create-input-validation.integration-spec.ts.snap create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/select-field-create-input-validation.integration-spec.ts.snap create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/text-field-create-input-validation.integration-spec.ts.snap create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/uuid-field-create-input-validation.integration-spec.ts.snap create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/address-field-create-input-validation.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/array-field-create-input-validation.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/boolean-field-create-input-validation.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/constants/failing-create-input-by-field-metadata-type.constant.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/currency-field-create-input-validation.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/date-field-create-input-validation.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/date-time-field-create-input-validation.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/emails-field-create-input-validation.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/full-name-field-create-input-validation.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/links-field-create-input-validation.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/multi-select-field-create-input-validation.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/number-field-create-input-validation.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/phones-field-create-input-validation.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/rating-field-create-input-validation.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/raw-json-field-create-input-validation.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/relation-field-create-input-validation.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/rich-text-field-create-input-validation.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/rich-text-v2-field-create-input-validation.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/select-field-create-input-validation.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/text-field-create-input-validation.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-error.util.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-error.util.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/uuid-field-create-input-validation.integration-spec.ts rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/address-field-filter-input-validation.integration-spec.ts (78%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/array-field-filter-input-validation.integration-spec.ts (84%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/boolean-field-filter-input-validation.integration-spec.ts (82%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant.ts (98%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant.ts (98%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/currency-field-filter-input-validation.integration-spec.ts (78%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/date-field-filter-input-validation.integration-spec.ts (78%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/date-time-field-filter-input-validation.integration-spec.ts (78%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/emails-field-filter-input-validation.integration-spec.ts (78%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/full-name-field-filter-input-validation.integration-spec.ts (78%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/links-field-filter-input-validation.integration-spec.ts (78%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/multi-select-field-filter-input-validation.integration-spec.ts (78%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/number-field-filter-input-validation.integration-spec.ts (82%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/phones-field-filter-input-validation.integration-spec.ts (78%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/rating-field-filter-input-validation.integration-spec.ts (78%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/raw-json-field-filter-input-validation.integration-spec.ts (82%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/relation-field-filter-input-validation.integration-spec.ts (78%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/select-field-filter-input-validation.integration-spec.ts (79%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/text-field-filter-input-validation.integration-spec.ts (77%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/utils/test-gql-failing-scenario.util.ts (100%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/utils/test-gql-successful-scenario.util.ts (92%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/utils/test-rest-failing-scenario.util.ts (100%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/utils/test-rest-successful-scenario.util.ts (100%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/filter-validation/uuid-field-filter-input-validation.integration-spec.ts (78%) create mode 100644 packages/twenty-server/test/integration/graphql/suites/inputs-validation/types/field-metadata-type-to-test.ts rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/utils/destroy-many-objects-metadata.ts (100%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/utils/get-field-metadata-creation-inputs.util.ts (85%) rename packages/twenty-server/test/integration/graphql/suites/{args-validation => inputs-validation}/utils/setup-test-objects-with-all-field-types.util.ts (85%) diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/types/field-metadata-type-to-test.ts b/packages/twenty-server/test/integration/graphql/suites/args-validation/types/field-metadata-type-to-test.ts deleted file mode 100644 index a21d1a31a68..00000000000 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/types/field-metadata-type-to-test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { type FieldMetadataType } from 'twenty-shared/types'; - -type FieldMetadataTypesNotTested = - | 'TS_VECTOR' - | 'RICH_TEXT' - | 'POSITION' - | 'ACTOR' - | 'MORPH_RELATION' - | 'NUMERIC' - | 'RICH_TEXT_V2'; - -export type FieldMetadataTypeToTest = Exclude< - FieldMetadataType, - FieldMetadataTypesNotTested ->; diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/constants/test-object-gql-fields.constant.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/constants/test-object-gql-fields.constant.ts similarity index 91% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/constants/test-object-gql-fields.constant.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/constants/test-object-gql-fields.constant.ts index 843ce83a28c..4cb8d065a6b 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/constants/test-object-gql-fields.constant.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/constants/test-object-gql-fields.constant.ts @@ -46,4 +46,9 @@ export const TEST_OBJECT_GQL_FIELDS = ` } rawJsonField arrayField + richTextField + richTextV2Field { + blocknote + markdown + } `; diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/array-field-create-input-validation.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/array-field-create-input-validation.integration-spec.ts.snap new file mode 100644 index 00000000000..379dc379881 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/array-field-create-input-validation.integration-spec.ts.snap @@ -0,0 +1,9 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Create input validation - ARRAY Gql create input - failure ARRAY - should fail with : {"arrayField":1} 1`] = `"String cannot represent a non string value: 1"`; + +exports[`Create input validation - ARRAY Gql create input - failure ARRAY - should fail with : {"arrayField":true} 1`] = `"String cannot represent a non string value: true"`; + +exports[`Create input validation - ARRAY Rest create input - failure ARRAY - should fail with : {"arrayField":1} 1`] = `"["malformed array literal: \\"1\\""]"`; + +exports[`Create input validation - ARRAY Rest create input - failure ARRAY - should fail with : {"arrayField":true} 1`] = `"["malformed array literal: \\"true\\""]"`; diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/date-field-create-input-validation.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/date-field-create-input-validation.integration-spec.ts.snap new file mode 100644 index 00000000000..5f86a833135 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/date-field-create-input-validation.integration-spec.ts.snap @@ -0,0 +1,21 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Create input validation - DATE Gql create input - failure DATE - should fail with : {"dateField":"malformed-date"} 1`] = `"invalid input syntax for type date: "malformed-date""`; + +exports[`Create input validation - DATE Gql create input - failure DATE - should fail with : {"dateField":[]} 1`] = `"invalid input syntax for type date: "{}""`; + +exports[`Create input validation - DATE Gql create input - failure DATE - should fail with : {"dateField":{}} 1`] = `"invalid input syntax for type date: "{}""`; + +exports[`Create input validation - DATE Gql create input - failure DATE - should fail with : {"dateField":1} 1`] = `"invalid input syntax for type date: "1""`; + +exports[`Create input validation - DATE Gql create input - failure DATE - should fail with : {"dateField":true} 1`] = `"invalid input syntax for type date: "true""`; + +exports[`Create input validation - DATE Rest create input - failure DATE - should fail with : {"dateField":"malformed-date"} 1`] = `"["invalid input syntax for type date: \\"malformed-date\\""]"`; + +exports[`Create input validation - DATE Rest create input - failure DATE - should fail with : {"dateField":[]} 1`] = `"["invalid input syntax for type date: \\"{}\\""]"`; + +exports[`Create input validation - DATE Rest create input - failure DATE - should fail with : {"dateField":{}} 1`] = `"["invalid input syntax for type date: \\"{}\\""]"`; + +exports[`Create input validation - DATE Rest create input - failure DATE - should fail with : {"dateField":1} 1`] = `"["invalid input syntax for type date: \\"1\\""]"`; + +exports[`Create input validation - DATE Rest create input - failure DATE - should fail with : {"dateField":true} 1`] = `"["invalid input syntax for type date: \\"true\\""]"`; diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/date-time-field-create-input-validation.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/date-time-field-create-input-validation.integration-spec.ts.snap new file mode 100644 index 00000000000..413ee14d76a --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/date-time-field-create-input-validation.integration-spec.ts.snap @@ -0,0 +1,21 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Create input validation - DATE_TIME Gql create input - failure DATE_TIME - should fail with : {"dateTimeField":"malformed-date"} 1`] = `"invalid input syntax for type timestamp with time zone: "malformed-date""`; + +exports[`Create input validation - DATE_TIME Gql create input - failure DATE_TIME - should fail with : {"dateTimeField":[]} 1`] = `"invalid input syntax for type timestamp with time zone: "{}""`; + +exports[`Create input validation - DATE_TIME Gql create input - failure DATE_TIME - should fail with : {"dateTimeField":{}} 1`] = `"invalid input syntax for type timestamp with time zone: "{}""`; + +exports[`Create input validation - DATE_TIME Gql create input - failure DATE_TIME - should fail with : {"dateTimeField":1} 1`] = `"invalid input syntax for type timestamp with time zone: "1""`; + +exports[`Create input validation - DATE_TIME Gql create input - failure DATE_TIME - should fail with : {"dateTimeField":true} 1`] = `"invalid input syntax for type timestamp with time zone: "true""`; + +exports[`Create input validation - DATE_TIME Rest create input - failure DATE_TIME - should fail with : {"dateTimeField":"malformed-date"} 1`] = `"["invalid input syntax for type timestamp with time zone: \\"malformed-date\\""]"`; + +exports[`Create input validation - DATE_TIME Rest create input - failure DATE_TIME - should fail with : {"dateTimeField":[]} 1`] = `"["invalid input syntax for type timestamp with time zone: \\"{}\\""]"`; + +exports[`Create input validation - DATE_TIME Rest create input - failure DATE_TIME - should fail with : {"dateTimeField":{}} 1`] = `"["invalid input syntax for type timestamp with time zone: \\"{}\\""]"`; + +exports[`Create input validation - DATE_TIME Rest create input - failure DATE_TIME - should fail with : {"dateTimeField":1} 1`] = `"["invalid input syntax for type timestamp with time zone: \\"1\\""]"`; + +exports[`Create input validation - DATE_TIME Rest create input - failure DATE_TIME - should fail with : {"dateTimeField":true} 1`] = `"["invalid input syntax for type timestamp with time zone: \\"true\\""]"`; diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/multi-select-field-create-input-validation.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/multi-select-field-create-input-validation.integration-spec.ts.snap new file mode 100644 index 00000000000..538d8a75129 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/multi-select-field-create-input-validation.integration-spec.ts.snap @@ -0,0 +1,13 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Create input validation - MULTI_SELECT Gql create input - failure MULTI_SELECT - should fail with : {"multiSelectField":"not-a-select-option"} 1`] = `"Value "not-a-select-option" does not exist in "ApiInputValidationTestObjectMultiSelectFieldEnum" enum."`; + +exports[`Create input validation - MULTI_SELECT Gql create input - failure MULTI_SELECT - should fail with : {"multiSelectField":1} 1`] = `"Enum "ApiInputValidationTestObjectMultiSelectFieldEnum" cannot represent non-string value: 1."`; + +exports[`Create input validation - MULTI_SELECT Gql create input - failure MULTI_SELECT - should fail with : {"multiSelectField":true} 1`] = `"Enum "ApiInputValidationTestObjectMultiSelectFieldEnum" cannot represent non-string value: true."`; + +exports[`Create input validation - MULTI_SELECT Rest create input - failure MULTI_SELECT - should fail with : {"multiSelectField":"not-a-select-option"} 1`] = `"["malformed array literal: \\"not-a-select-option\\""]"`; + +exports[`Create input validation - MULTI_SELECT Rest create input - failure MULTI_SELECT - should fail with : {"multiSelectField":1} 1`] = `"["malformed array literal: \\"1\\""]"`; + +exports[`Create input validation - MULTI_SELECT Rest create input - failure MULTI_SELECT - should fail with : {"multiSelectField":true} 1`] = `"["malformed array literal: \\"true\\""]"`; diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/rating-field-create-input-validation.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/rating-field-create-input-validation.integration-spec.ts.snap new file mode 100644 index 00000000000..95420d0bbb4 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/rating-field-create-input-validation.integration-spec.ts.snap @@ -0,0 +1,21 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Create input validation - RATING Gql create input - failure RATING - should fail with : {"ratingField":"not-a-rating"} 1`] = `"Value "not-a-rating" does not exist in "ApiInputValidationTestObjectRatingFieldEnum" enum."`; + +exports[`Create input validation - RATING Gql create input - failure RATING - should fail with : {"ratingField":[]} 1`] = `"Enum "ApiInputValidationTestObjectRatingFieldEnum" cannot represent non-string value: []."`; + +exports[`Create input validation - RATING Gql create input - failure RATING - should fail with : {"ratingField":{}} 1`] = `"Enum "ApiInputValidationTestObjectRatingFieldEnum" cannot represent non-string value: {}."`; + +exports[`Create input validation - RATING Gql create input - failure RATING - should fail with : {"ratingField":1} 1`] = `"Enum "ApiInputValidationTestObjectRatingFieldEnum" cannot represent non-string value: 1."`; + +exports[`Create input validation - RATING Gql create input - failure RATING - should fail with : {"ratingField":true} 1`] = `"Enum "ApiInputValidationTestObjectRatingFieldEnum" cannot represent non-string value: true."`; + +exports[`Create input validation - RATING Rest create input - failure RATING - should fail with : {"ratingField":"not-a-rating"} 1`] = `"["invalid input value for enum workspace_1wgvd1injqtife6y4rvfbu3h5.\\"_apiInputValidationTestObject_ratingField_enum\\": \\"not-a-rating\\""]"`; + +exports[`Create input validation - RATING Rest create input - failure RATING - should fail with : {"ratingField":[]} 1`] = `"["invalid input value for enum workspace_1wgvd1injqtife6y4rvfbu3h5.\\"_apiInputValidationTestObject_ratingField_enum\\": \\"\\""]"`; + +exports[`Create input validation - RATING Rest create input - failure RATING - should fail with : {"ratingField":{}} 1`] = `"["invalid input value for enum workspace_1wgvd1injqtife6y4rvfbu3h5.\\"_apiInputValidationTestObject_ratingField_enum\\": \\"[object Object]\\""]"`; + +exports[`Create input validation - RATING Rest create input - failure RATING - should fail with : {"ratingField":1} 1`] = `"["invalid input value for enum workspace_1wgvd1injqtife6y4rvfbu3h5.\\"_apiInputValidationTestObject_ratingField_enum\\": \\"1\\""]"`; + +exports[`Create input validation - RATING Rest create input - failure RATING - should fail with : {"ratingField":true} 1`] = `"["invalid input value for enum workspace_1wgvd1injqtife6y4rvfbu3h5.\\"_apiInputValidationTestObject_ratingField_enum\\": \\"true\\""]"`; diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/raw-json-field-create-input-validation.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/raw-json-field-create-input-validation.integration-spec.ts.snap new file mode 100644 index 00000000000..ce3e029b046 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/raw-json-field-create-input-validation.integration-spec.ts.snap @@ -0,0 +1,5 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Create input validation - RAW_JSON Gql create input - failure RAW_JSON - should fail with : {"rawJsonField":"not-a-json"} 1`] = `"Unexpected token 'o', "not-a-json" is not valid JSON"`; + +exports[`Create input validation - RAW_JSON Rest create input - failure RAW_JSON - should fail with : {"rawJsonField":"not-a-json"} 1`] = `"["Unexpected token 'o', \\"not-a-json\\" is not valid JSON"]"`; \ No newline at end of file diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/relation-field-create-input-validation.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/relation-field-create-input-validation.integration-spec.ts.snap new file mode 100644 index 00000000000..78aab899a4a --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/relation-field-create-input-validation.integration-spec.ts.snap @@ -0,0 +1,17 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Create input validation - RELATION Gql create input - failure RELATION - should fail with : {"manyToOneRelationFieldId":"non-uuid"} 1`] = `"invalid input syntax for type uuid: "non-uuid""`; + +exports[`Create input validation - RELATION Gql create input - failure RELATION - should fail with : {"manyToOneRelationFieldId":1} 1`] = `"invalid input syntax for type uuid: "1""`; + +exports[`Create input validation - RELATION Gql create input - failure RELATION - should fail with : {"manyToOneRelationFieldId":true} 1`] = `"ID cannot represent value: true"`; + +exports[`Create input validation - RELATION Gql create input - failure RELATION - should fail with : {"oneToManyRelationFieldId":"not-existing-field"} 1`] = `"Field "oneToManyRelationFieldId" is not defined by type "ApiInputValidationTestObjectCreateInput". Did you mean "manyToOneRelationFieldId" or "manyToOneRelationField"?"`; + +exports[`Create input validation - RELATION Rest create input - failure RELATION - should fail with : {"manyToOneRelationFieldId":"non-uuid"} 1`] = `"["invalid input syntax for type uuid: \\"non-uuid\\""]"`; + +exports[`Create input validation - RELATION Rest create input - failure RELATION - should fail with : {"manyToOneRelationFieldId":1} 1`] = `"["invalid input syntax for type uuid: \\"1\\""]"`; + +exports[`Create input validation - RELATION Rest create input - failure RELATION - should fail with : {"manyToOneRelationFieldId":true} 1`] = `"["invalid input syntax for type uuid: \\"true\\""]"`; + +exports[`Create input validation - RELATION Rest create input - failure RELATION - should fail with : {"oneToManyRelationFieldId":"not-existing-field"} 1`] = `"["Field metadata for field \\"oneToManyRelationFieldId\\" is missing in object metadata apiInputValidationTestObject"]"`; diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/rich-text-field-create-input-validation.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/rich-text-field-create-input-validation.integration-spec.ts.snap new file mode 100644 index 00000000000..52b700a0087 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/rich-text-field-create-input-validation.integration-spec.ts.snap @@ -0,0 +1,5 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Create input validation - RICH_TEXT Gql create input - failure RICH_TEXT - should fail with : {"richTextField":"test"} 1`] = `"Rich text is not supported, please use RICH_TEXT_V2 instead"`; + +exports[`Create input validation - RICH_TEXT Rest create input - failure RICH_TEXT - should fail with : {"richTextField":"test"} 1`] = `"["Rich text is not supported, please use RICH_TEXT_V2 instead"]"`; diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/select-field-create-input-validation.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/select-field-create-input-validation.integration-spec.ts.snap new file mode 100644 index 00000000000..4a8f02a32e8 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/select-field-create-input-validation.integration-spec.ts.snap @@ -0,0 +1,21 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Create input validation - SELECT Gql create input - failure SELECT - should fail with : {"selectField":"not-a-select-option"} 1`] = `"Value "not-a-select-option" does not exist in "ApiInputValidationTestObjectSelectFieldEnum" enum."`; + +exports[`Create input validation - SELECT Gql create input - failure SELECT - should fail with : {"selectField":[]} 1`] = `"Enum "ApiInputValidationTestObjectSelectFieldEnum" cannot represent non-string value: []."`; + +exports[`Create input validation - SELECT Gql create input - failure SELECT - should fail with : {"selectField":{}} 1`] = `"Enum "ApiInputValidationTestObjectSelectFieldEnum" cannot represent non-string value: {}."`; + +exports[`Create input validation - SELECT Gql create input - failure SELECT - should fail with : {"selectField":1} 1`] = `"Enum "ApiInputValidationTestObjectSelectFieldEnum" cannot represent non-string value: 1."`; + +exports[`Create input validation - SELECT Gql create input - failure SELECT - should fail with : {"selectField":true} 1`] = `"Enum "ApiInputValidationTestObjectSelectFieldEnum" cannot represent non-string value: true."`; + +exports[`Create input validation - SELECT Rest create input - failure SELECT - should fail with : {"selectField":"not-a-select-option"} 1`] = `"["invalid input value for enum workspace_1wgvd1injqtife6y4rvfbu3h5.\\"_apiInputValidationTestObject_selectField_enum\\": \\"not-a-select-option\\""]"`; + +exports[`Create input validation - SELECT Rest create input - failure SELECT - should fail with : {"selectField":[]} 1`] = `"["invalid input value for enum workspace_1wgvd1injqtife6y4rvfbu3h5.\\"_apiInputValidationTestObject_selectField_enum\\": \\"\\""]"`; + +exports[`Create input validation - SELECT Rest create input - failure SELECT - should fail with : {"selectField":{}} 1`] = `"["invalid input value for enum workspace_1wgvd1injqtife6y4rvfbu3h5.\\"_apiInputValidationTestObject_selectField_enum\\": \\"[object Object]\\""]"`; + +exports[`Create input validation - SELECT Rest create input - failure SELECT - should fail with : {"selectField":1} 1`] = `"["invalid input value for enum workspace_1wgvd1injqtife6y4rvfbu3h5.\\"_apiInputValidationTestObject_selectField_enum\\": \\"1\\""]"`; + +exports[`Create input validation - SELECT Rest create input - failure SELECT - should fail with : {"selectField":true} 1`] = `"["invalid input value for enum workspace_1wgvd1injqtife6y4rvfbu3h5.\\"_apiInputValidationTestObject_selectField_enum\\": \\"true\\""]"`; diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/text-field-create-input-validation.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/text-field-create-input-validation.integration-spec.ts.snap new file mode 100644 index 00000000000..53b86773a6e --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/text-field-create-input-validation.integration-spec.ts.snap @@ -0,0 +1,5 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Create input validation - TEXT Gql create input - failure TEXT - should fail with : {"textField":null} 1`] = `"null value in column "textField" of relation "_apiInputValidationTestObject" violates not-null constraint"`; + +exports[`Create input validation - TEXT Rest create input - failure TEXT - should fail with : {"textField":null} 1`] = `"["null value in column \\"textField\\" of relation \\"_apiInputValidationTestObject\\" violates not-null constraint"]"`; diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/uuid-field-create-input-validation.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/uuid-field-create-input-validation.integration-spec.ts.snap new file mode 100644 index 00000000000..44e0a7d7223 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/__snapshots__/uuid-field-create-input-validation.integration-spec.ts.snap @@ -0,0 +1,21 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Create input validation - UUID Gql create input - failure UUID - should fail with : {"uuidField":"non-uuid"} 1`] = `"Invalid UUID"`; + +exports[`Create input validation - UUID Gql create input - failure UUID - should fail with : {"uuidField":[]} 1`] = `"UUID must be a string"`; + +exports[`Create input validation - UUID Gql create input - failure UUID - should fail with : {"uuidField":{}} 1`] = `"UUID must be a string"`; + +exports[`Create input validation - UUID Gql create input - failure UUID - should fail with : {"uuidField":1} 1`] = `"UUID must be a string"`; + +exports[`Create input validation - UUID Gql create input - failure UUID - should fail with : {"uuidField":true} 1`] = `"UUID must be a string"`; + +exports[`Create input validation - UUID Rest create input - failure UUID - should fail with : {"uuidField":"non-uuid"} 1`] = `"["invalid input syntax for type uuid: \\"non-uuid\\""]"`; + +exports[`Create input validation - UUID Rest create input - failure UUID - should fail with : {"uuidField":[]} 1`] = `"["invalid input syntax for type uuid: \\"{}\\""]"`; + +exports[`Create input validation - UUID Rest create input - failure UUID - should fail with : {"uuidField":{}} 1`] = `"["invalid input syntax for type uuid: \\"{}\\""]"`; + +exports[`Create input validation - UUID Rest create input - failure UUID - should fail with : {"uuidField":1} 1`] = `"["invalid input syntax for type uuid: \\"1\\""]"`; + +exports[`Create input validation - UUID Rest create input - failure UUID - should fail with : {"uuidField":true} 1`] = `"["invalid input syntax for type uuid: \\"true\\""]"`; diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/address-field-create-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/address-field-create-input-validation.integration-spec.ts new file mode 100644 index 00000000000..7b78152c55c --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/address-field-create-input-validation.integration-spec.ts @@ -0,0 +1,71 @@ +import { successfulCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant'; +import { expectGqlCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util'; +import { expectRestCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +const FIELD_METADATA_TYPE = FieldMetadataType.ADDRESS; + +const successfulTestCases = + successfulCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; + +describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => { + let objectMetadataId: string; + let objectMetadataSingularName: string; + let objectMetadataPluralName: string; + let targetObjectMetadataId: string; + + beforeAll(async () => { + const setupTest = await setupTestObjectsWithAllFieldTypes(); + + objectMetadataId = setupTest.objectMetadataId; + objectMetadataSingularName = setupTest.objectMetadataSingularName; + objectMetadataPluralName = setupTest.objectMetadataPluralName; + targetObjectMetadataId = setupTest.targetObjectMetadataId; + }); + + afterAll(async () => { + await destroyManyObjectsMetadata([ + objectMetadataId, + targetObjectMetadataId, + ]); + }); + + describe('Gql create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectGqlCreateInputValidationSuccess( + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); + + describe('Rest create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectRestCreateInputValidationSuccess( + objectMetadataPluralName, + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/array-field-create-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/array-field-create-input-validation.integration-spec.ts new file mode 100644 index 00000000000..32c4bfee5d5 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/array-field-create-input-validation.integration-spec.ts @@ -0,0 +1,110 @@ +import { failingCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/failing-create-input-by-field-metadata-type.constant'; +import { successfulCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant'; +import { expectGqlCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-error.util'; +import { expectGqlCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util'; +import { expectRestCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-error.util'; +import { expectRestCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +const FIELD_METADATA_TYPE = FieldMetadataType.ARRAY; + +const failingTestCases = + failingCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; +const successfulTestCases = + successfulCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; + +describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => { + let objectMetadataId: string; + let objectMetadataSingularName: string; + let objectMetadataPluralName: string; + let targetObjectMetadataId: string; + + beforeAll(async () => { + const setupTest = await setupTestObjectsWithAllFieldTypes(); + + objectMetadataId = setupTest.objectMetadataId; + objectMetadataSingularName = setupTest.objectMetadataSingularName; + objectMetadataPluralName = setupTest.objectMetadataPluralName; + targetObjectMetadataId = setupTest.targetObjectMetadataId; + }); + + afterAll(async () => { + await destroyManyObjectsMetadata([ + objectMetadataId, + targetObjectMetadataId, + ]); + }); + + describe('Gql create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectGqlCreateInputValidationError( + objectMetadataSingularName, + input, + ); + }, + ); + }); + + describe('Rest create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectRestCreateInputValidationError( + objectMetadataPluralName, + input, + ); + }, + ); + }); + + describe('Gql create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectGqlCreateInputValidationSuccess( + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); + + describe('Rest create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectRestCreateInputValidationSuccess( + objectMetadataPluralName, + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/boolean-field-create-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/boolean-field-create-input-validation.integration-spec.ts new file mode 100644 index 00000000000..0c72ddc6d00 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/boolean-field-create-input-validation.integration-spec.ts @@ -0,0 +1,105 @@ +import { successfulCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant'; +import { expectGqlCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util'; +import { expectRestCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +const FIELD_METADATA_TYPE = FieldMetadataType.BOOLEAN; + +const successfulTestCases = + successfulCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; + +describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => { + let objectMetadataId: string; + let objectMetadataSingularName: string; + let objectMetadataPluralName: string; + let targetObjectMetadataId: string; + + beforeAll(async () => { + const setupTest = await setupTestObjectsWithAllFieldTypes(); + + objectMetadataId = setupTest.objectMetadataId; + objectMetadataSingularName = setupTest.objectMetadataSingularName; + objectMetadataPluralName = setupTest.objectMetadataPluralName; + targetObjectMetadataId = setupTest.targetObjectMetadataId; + }); + + afterAll(async () => { + await destroyManyObjectsMetadata([ + objectMetadataId, + targetObjectMetadataId, + ]); + }); + + // describe('Gql create input - failure', () => { + // it.each( + // failingTestCases.map((testCase) => ({ + // ...testCase, + // stringifiedInput: JSON.stringify(testCase.input), + // })), + // )( + // `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + // async ({ input }) => { + // await expectGqlCreateInputValidationError( + // objectMetadataSingularName, + // input, + // ); + // }, + // ); + // }); + + // describe('Rest create input - failure', () => { + // it.each( + // failingTestCases.map((testCase) => ({ + // ...testCase, + // stringifiedInput: JSON.stringify(testCase.input), + // })), + // )( + // `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + // async ({ input }) => { + // await expectRestCreateInputValidationError( + // objectMetadataPluralName, + // input, + // ); + // }, + // ); + // }); + + describe('Gql create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectGqlCreateInputValidationSuccess( + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); + + describe('Rest create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectRestCreateInputValidationSuccess( + objectMetadataPluralName, + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/constants/failing-create-input-by-field-metadata-type.constant.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/constants/failing-create-input-by-field-metadata-type.constant.ts new file mode 100644 index 00000000000..e6f644a2f7d --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/constants/failing-create-input-by-field-metadata-type.constant.ts @@ -0,0 +1,418 @@ +import { type FieldMetadataTypesToTestForCreateInputValidation } from 'test/integration/graphql/suites/inputs-validation/types/field-metadata-type-to-test'; +import { FieldMetadataType } from 'twenty-shared/types'; + +import { type CompositeFieldMetadataType } from 'src/engine/metadata-modules/workspace-migration/factories/composite-column-action.factory'; + +export const failingCreateInputByFieldMetadataType: { + [K in Exclude< + FieldMetadataTypesToTestForCreateInputValidation, + | CompositeFieldMetadataType + | FieldMetadataType.NUMBER + | FieldMetadataType.BOOLEAN + >]: { + input: any; + }[]; +} = { + [FieldMetadataType.TEXT]: [ + { + input: { + textField: null, + }, + }, + // { + // input: { + // textField: {}, + // }, + // //TODO - rest api to fix, should throw + // }, + // { + // input: { + // textField: [], + // }, + // //TODO - rest api to fix, should throw + // }, + // { + // input: { + // textField: true, + // }, + // //TODO - rest api to fix, should throw + // }, + // { + // input: { + // textField: 1, + // }, + // //TODO - rest api to fix, should throw + // }, + ], + // [FieldMetadataType.NUMBER]: [ + // { + // input: { + // numberField: {}, + // }, + // //TODO - rest api to fix, should throw + // }, + // { + // input: { + // numberField: [], + // }, + // //TODO - rest api to fix, should throw + // }, + // { + // input: { + // numberField: true, + // }, + // //TODO - rest api to fix, should throw + // }, + // { + // input: { + // numberField: 'string', + // }, + // // TODO - rest api to fix, should throw + // }, + // ], + [FieldMetadataType.UUID]: [ + { + input: { + uuidField: {}, + }, + }, + { + input: { + uuidField: [], + }, + }, + { + input: { + uuidField: true, + }, + }, + { + input: { + uuidField: 1, + }, + }, + { + input: { + uuidField: 'non-uuid', + }, + }, + ], + [FieldMetadataType.SELECT]: [ + { + input: { + selectField: 'not-a-select-option', + }, + }, + { + input: { + selectField: {}, + }, + }, + { + input: { + selectField: [], + }, + }, + { + input: { + selectField: true, + }, + }, + { + input: { + selectField: 1, + }, + }, + ], + [FieldMetadataType.RELATION]: [ + // { + // input: { + // manyToOneRelationFieldId: {}, + // }, + // //TODO - rest api to fix, should throw + // }, + // { + // input: { + // manyToOneRelationFieldId: [], + // }, + // //TODO - rest api to fix, should throw + // }, + { + input: { + manyToOneRelationFieldId: true, + }, + }, + { + input: { + manyToOneRelationFieldId: 1, + }, + }, + { + input: { + manyToOneRelationFieldId: 'non-uuid', + }, + }, + // { + // input: { + // manyToOneRelationField: 'not-existing-field', + // }, + // //TODO - rest api to fix, should throw + // }, + { + input: { + oneToManyRelationFieldId: 'not-existing-field', + }, + }, + ], + [FieldMetadataType.RAW_JSON]: [ + { + input: { + rawJsonField: 'not-a-json', + }, + }, + // //TODO - to fix, should throw + // { + // input: { + // rawJsonField: true, + // }, + // }, + // //TODO - to fix, should throw + // { + // input: { + // rawJsonField: 1, + // }, + // }, + ], + [FieldMetadataType.ARRAY]: [ + // //TODO - to fix, should throw + // { + // input: { + // arrayField: 'not-an-array', + // }, + // }, + { + input: { + arrayField: true, + }, + }, + { + input: { + arrayField: 1, + }, + }, + ], + [FieldMetadataType.RATING]: [ + { + input: { + ratingField: 'not-a-rating', + }, + }, + { + input: { + ratingField: {}, + }, + }, + { + input: { + ratingField: [], + }, + }, + { + input: { + ratingField: true, + }, + }, + { + input: { + ratingField: 1, + }, + }, + ], + [FieldMetadataType.MULTI_SELECT]: [ + { + input: { + multiSelectField: 'not-a-select-option', + }, + }, + // { + // input: { + // multiSelectField: {}, + // }, + // //TODO - rest api to fix, should throw + // }, + { + input: { + multiSelectField: true, + }, + }, + { + input: { + multiSelectField: 1, + }, + }, + ], + [FieldMetadataType.DATE]: [ + { + input: { + dateField: 'malformed-date', + }, + }, + { + input: { + dateField: {}, + }, + }, + { + input: { + dateField: [], + }, + }, + { + input: { + dateField: true, + }, + }, + { + input: { + dateField: 1, + }, + }, + ], + [FieldMetadataType.DATE_TIME]: [ + { + input: { + dateTimeField: 'malformed-date', + }, + }, + { + input: { + dateTimeField: {}, + }, + }, + { + input: { + dateTimeField: [], + }, + }, + { + input: { + dateTimeField: true, + }, + }, + { + input: { + dateTimeField: 1, + }, + }, + ], + // [FieldMetadataType.BOOLEAN]: [ + // // { + // // input: { + // // booleanField: null, + // // }, + // // }, + // // { + // // input: { + // // booleanField: {}, + // // }, + // // //TODO - rest api to fix, should throw + // // }, + // // { + // // input: { + // // booleanField: [], + // // }, + // // gqlErrorMessage: 'cannot represent a non string value', + // // //TODO - rest api to fix, should throw + // // restErrorMessage: '', + // // }, + // // { + // // input: { + // // booleanField: 'string', + // // }, + // // //TODO - rest api to fix, should throw + // // }, + // // { + // // input: { + // // booleanField: 1, + // // }, + // // //TODO - rest api to fix, should throw + // // }, + // ], + [FieldMetadataType.RICH_TEXT]: [ + { + input: { + richTextField: 'test', + }, + }, + ], + // [FieldMetadataType.ADDRESS]: [ + // // { + // // input: { + // // addressField: null, + // // }, + // // //TODO - rest api to fix, should throw + // // }, + // // { + // // input: { + // // addressField: 'not-an-address', + // // }, + // // //TODO - rest api to fix, should throw + // // }, + // ], + // [FieldMetadataType.CURRENCY]: [ + // // { + // // input: { + // // currencyField: null, + // // }, + // // //TODO - rest api to fix, should throw + // // }, + // ], + // [FieldMetadataType.EMAILS]: [ + // // { + // // input: { + // // emailsField: null, + // // }, + // // //TODO - rest api to fix, should throw + // // }, + // ], + // [FieldMetadataType.PHONES]: [ + // // { + // // input: { + // // phonesField: null, + // // }, + // // //TODO - rest api to fix, should throw + // // }, + // ], + // [FieldMetadataType.FULL_NAME]: [ + // // { + // // input: { + // // fullNameField: null, + // // }, + // // //TODO - rest api to fix, should throw + // // }, + // ], + // [FieldMetadataType.LINKS]: [ + // // { + // // input: { + // // linksField: null, + // // }, + // // //TODO - rest api to fix, should throw + // // }, + // ], + // [FieldMetadataType.RICH_TEXT_V2]: [ + // // { + // // input: { + // // richTextV2Field: null, + // // }, + // // //TODO - rest api to fix, should throw + // // }, + // ], + // [FieldMetadataType.ACTOR]: [ + // // { + // // input: { + // // actorField: null, + // // }, + // // //TODO - rest api to fix, should throw + // // }, + // ], +}; diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant.ts new file mode 100644 index 00000000000..7c8d94f5d14 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant.ts @@ -0,0 +1,425 @@ +import { type FieldMetadataTypesToTestForCreateInputValidation } from 'test/integration/graphql/suites/inputs-validation/types/field-metadata-type-to-test'; +import { TEST_TARGET_OBJECT_RECORD_ID_FIELD_VALUE } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +export const successfulCreateInputByFieldMetadataType: { + [K in Exclude< + FieldMetadataTypesToTestForCreateInputValidation, + FieldMetadataType.RICH_TEXT + >]: { + input: any; + validateInput: (record: Record) => boolean; + }[]; +} = { + [FieldMetadataType.TEXT]: [ + { + input: { + textField: 'test', + }, + validateInput: (record: Record) => { + return record.textField === 'test'; + }, + }, + { + input: { + textField: '', + }, + validateInput: (record: Record) => { + return record.textField === ''; + }, + }, + ], + [FieldMetadataType.NUMBER]: [ + { + input: { + numberField: 1, + }, + validateInput: (record: Record) => { + return record.numberField === 1; + }, + }, + { + input: { + numberField: null, + }, + validateInput: (record: Record) => { + return record.numberField === null; + }, + }, + { + input: { + numberField: 0, + }, + validateInput: (record: Record) => { + return record.numberField === 0; + }, + }, + { + input: { + numberField: -1.1, + }, + validateInput: (record: Record) => { + return record.numberField === -1.1; + }, + }, + ], + [FieldMetadataType.UUID]: [ + { + input: { + uuidField: '00000000-0000-4000-8000-000000000000', + }, + validateInput: (record: Record) => { + return record.uuidField === '00000000-0000-4000-8000-000000000000'; + }, + }, + { + input: { + uuidField: null, + }, + validateInput: (record: Record) => { + return record.uuidField === null; + }, + }, + ], + [FieldMetadataType.SELECT]: [ + { + input: { + selectField: 'OPTION_1', + }, + validateInput: (record: Record) => { + return record.selectField === 'OPTION_1'; + }, + }, + { + input: { + selectField: null, + }, + validateInput: (record: Record) => { + return record.selectField === null; + }, + }, + ], + [FieldMetadataType.RELATION]: [ + { + input: { + manyToOneRelationFieldId: TEST_TARGET_OBJECT_RECORD_ID_FIELD_VALUE, + }, + validateInput: (record: Record) => { + return ( + record.manyToOneRelationFieldId === + TEST_TARGET_OBJECT_RECORD_ID_FIELD_VALUE + ); + }, + }, + { + input: { + manyToOneRelationFieldId: null, + }, + validateInput: (record: Record) => { + return record.manyToOneRelationFieldId === null; + }, + }, + ], + [FieldMetadataType.RAW_JSON]: [ + { + input: { + rawJsonField: { key: 'value' }, + }, + validateInput: (record: Record) => { + return record.rawJsonField.key === 'value'; + }, + }, + { + input: { + rawJsonField: {}, + }, + validateInput: (record: Record) => { + return Object.keys(record.rawJsonField).length === 0; + }, + }, + { + input: { + rawJsonField: null, + }, + validateInput: (record: Record) => { + return record.rawJsonField === null; + }, + }, + ], + [FieldMetadataType.ARRAY]: [ + { + input: { + arrayField: ['item1', 'item2'], + }, + validateInput: (record: Record) => { + return ( + record.arrayField.length === 2 && + record.arrayField.includes('item1') && + record.arrayField.includes('item2') + ); + }, + }, + { + input: { + arrayField: [], + }, + validateInput: (record: Record) => { + return record.arrayField.length === 0; + }, + }, + { + input: { + arrayField: null, + }, + validateInput: (record: Record) => { + return record.arrayField === null; + }, + }, + ], + [FieldMetadataType.RATING]: [ + { + input: { + ratingField: 'RATING_2', + }, + validateInput: (record: Record) => { + return record.ratingField === 'RATING_2'; + }, + }, + { + input: { + ratingField: null, + }, + validateInput: (record: Record) => { + return record.ratingField === null; + }, + }, + ], + [FieldMetadataType.MULTI_SELECT]: [ + { + input: { + multiSelectField: ['OPTION_1'], + }, + validateInput: (record: Record) => { + return ( + record.multiSelectField.includes('OPTION_1') && + record.multiSelectField.length === 1 + ); + }, + }, + { + input: { + multiSelectField: [], + }, + validateInput: (record: Record) => { + return record.multiSelectField.length === 0; + }, + }, + { + input: { + multiSelectField: null, + }, + validateInput: (record: Record) => { + return record.multiSelectField === null; + }, + }, + ], + [FieldMetadataType.DATE]: [ + { + input: { + dateField: '2025-01-13', + }, + validateInput: (record: Record) => { + return new Date(record.dateField).toDateString() === 'Mon Jan 13 2025'; + }, + }, + { + input: { + dateField: null, + }, + validateInput: (record: Record) => { + return record.dateField === null; + }, + }, + ], + [FieldMetadataType.DATE_TIME]: [ + { + input: { + dateTimeField: '2025-01-13 00:00:00', + }, + validateInput: (record: Record) => { + const date = new Date(record.dateTimeField); + + return ( + date.toDateString() === 'Mon Jan 13 2025' && + date.getMinutes() === 0 && + date.getSeconds() === 0 + ); + }, + }, + { + input: { + dateTimeField: null, + }, + validateInput: (record: Record) => { + return record.dateTimeField === null; + }, + }, + ], + [FieldMetadataType.BOOLEAN]: [ + { + input: { + booleanField: null, + }, + validateInput: (record: Record) => { + return record.booleanField === null; + }, + }, + { + input: { + booleanField: false, + }, + validateInput: (record: Record) => { + return record.booleanField === false; + }, + }, + { + input: { + booleanField: true, + }, + validateInput: (record: Record) => { + return record.booleanField === true; + }, + }, + ], + [FieldMetadataType.ADDRESS]: [ + { + input: { + addressField: { + addressPostcode: 'address postcode', + addressStreet1: 'address street 1', + addressStreet2: 'address street 2', + addressCity: 'address city', + addressState: 'address state', + addressCountry: 'address country', + }, + }, + validateInput: (record: Record) => { + return ( + record.addressField.addressPostcode === 'address postcode' && + record.addressField.addressStreet1 === 'address street 1' && + record.addressField.addressStreet2 === 'address street 2' && + record.addressField.addressCity === 'address city' && + record.addressField.addressState === 'address state' && + record.addressField.addressCountry === 'address country' + ); + }, + }, + ], + [FieldMetadataType.CURRENCY]: [ + { + input: { + currencyField: { amountMicros: 1000000, currencyCode: 'USD' }, + }, + validateInput: (record: Record) => { + return ( + Number(record.currencyField.amountMicros) === 1000000 && + record.currencyField.currencyCode === 'USD' + ); + }, + }, + ], + [FieldMetadataType.EMAILS]: [ + { + input: { + emailsField: { + primaryEmail: 'test@test.com', + additionalEmails: ['test2@test.com'], + }, + }, + validateInput: (record: Record) => { + return ( + record.emailsField.primaryEmail === 'test@test.com' && + record.emailsField.additionalEmails.length === 1 && + record.emailsField.additionalEmails[0] === 'test2@test.com' + ); + }, + }, + ], + [FieldMetadataType.PHONES]: [ + { + input: { + phonesField: { + primaryPhoneNumber: '1234567890', + primaryPhoneCountryCode: 'FR', + primaryPhoneCallingCode: '+33', + additionalPhones: [ + { number: '1234567890', callingCode: '+33', countryCode: 'FR' }, + ], + }, + }, + validateInput: (record: Record) => { + return ( + record.phonesField.primaryPhoneNumber === '1234567890' && + record.phonesField.primaryPhoneCountryCode === 'FR' && + record.phonesField.primaryPhoneCallingCode === '+33' && + record.phonesField.additionalPhones.length === 1 && + record.phonesField.additionalPhones[0].number === '1234567890' && + record.phonesField.additionalPhones[0].callingCode === '+33' && + record.phonesField.additionalPhones[0].countryCode === 'FR' + ); + }, + }, + ], + [FieldMetadataType.FULL_NAME]: [ + { + input: { + fullNameField: { + firstName: 'John', + lastName: 'Doe', + }, + }, + validateInput: (record: Record) => { + return ( + record.fullNameField.firstName === 'John' && + record.fullNameField.lastName === 'Doe' + ); + }, + }, + ], + [FieldMetadataType.LINKS]: [ + { + input: { + linksField: { + primaryLinkUrl: 'https://twenty.com', + primaryLinkLabel: '#1 Open source CRM', + secondaryLinks: [{ url: 'twenty.com', label: '#1 Open source CRM' }], + }, + }, + validateInput: (record: Record) => { + return ( + record.linksField.primaryLinkUrl === 'https://twenty.com' && + record.linksField.primaryLinkLabel === '#1 Open source CRM' && + record.linksField.secondaryLinks.length === 1 && + record.linksField.secondaryLinks[0].url === 'twenty.com' && + record.linksField.secondaryLinks[0].label === '#1 Open source CRM' + ); + }, + }, + ], + [FieldMetadataType.RICH_TEXT_V2]: [ + { + input: { + richTextV2Field: { + blocknote: 'test', + markdown: 'test', + }, + }, + validateInput: (record: Record) => { + return ( + record.richTextV2Field.blocknote === 'test' && + record.richTextV2Field.markdown === 'test' + ); + }, + }, + ], +}; diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/currency-field-create-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/currency-field-create-input-validation.integration-spec.ts new file mode 100644 index 00000000000..4463811d80f --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/currency-field-create-input-validation.integration-spec.ts @@ -0,0 +1,71 @@ +import { successfulCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant'; +import { expectGqlCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util'; +import { expectRestCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +const FIELD_METADATA_TYPE = FieldMetadataType.CURRENCY; + +const successfulTestCases = + successfulCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; + +describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => { + let objectMetadataId: string; + let objectMetadataSingularName: string; + let objectMetadataPluralName: string; + let targetObjectMetadataId: string; + + beforeAll(async () => { + const setupTest = await setupTestObjectsWithAllFieldTypes(); + + objectMetadataId = setupTest.objectMetadataId; + objectMetadataSingularName = setupTest.objectMetadataSingularName; + objectMetadataPluralName = setupTest.objectMetadataPluralName; + targetObjectMetadataId = setupTest.targetObjectMetadataId; + }); + + afterAll(async () => { + await destroyManyObjectsMetadata([ + objectMetadataId, + targetObjectMetadataId, + ]); + }); + + describe('Gql create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectGqlCreateInputValidationSuccess( + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); + + describe('Rest create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectRestCreateInputValidationSuccess( + objectMetadataPluralName, + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/date-field-create-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/date-field-create-input-validation.integration-spec.ts new file mode 100644 index 00000000000..275a382adab --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/date-field-create-input-validation.integration-spec.ts @@ -0,0 +1,110 @@ +import { failingCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/failing-create-input-by-field-metadata-type.constant'; +import { successfulCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant'; +import { expectGqlCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-error.util'; +import { expectGqlCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util'; +import { expectRestCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-error.util'; +import { expectRestCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +const FIELD_METADATA_TYPE = FieldMetadataType.DATE; + +const failingTestCases = + failingCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; +const successfulTestCases = + successfulCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; + +describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => { + let objectMetadataId: string; + let objectMetadataSingularName: string; + let objectMetadataPluralName: string; + let targetObjectMetadataId: string; + + beforeAll(async () => { + const setupTest = await setupTestObjectsWithAllFieldTypes(); + + objectMetadataId = setupTest.objectMetadataId; + objectMetadataSingularName = setupTest.objectMetadataSingularName; + objectMetadataPluralName = setupTest.objectMetadataPluralName; + targetObjectMetadataId = setupTest.targetObjectMetadataId; + }); + + afterAll(async () => { + await destroyManyObjectsMetadata([ + objectMetadataId, + targetObjectMetadataId, + ]); + }); + + describe('Gql create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectGqlCreateInputValidationError( + objectMetadataSingularName, + input, + ); + }, + ); + }); + + describe('Rest create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectRestCreateInputValidationError( + objectMetadataPluralName, + input, + ); + }, + ); + }); + + describe('Gql create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectGqlCreateInputValidationSuccess( + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); + + describe('Rest create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectRestCreateInputValidationSuccess( + objectMetadataPluralName, + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/date-time-field-create-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/date-time-field-create-input-validation.integration-spec.ts new file mode 100644 index 00000000000..e5dd711823c --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/date-time-field-create-input-validation.integration-spec.ts @@ -0,0 +1,110 @@ +import { failingCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/failing-create-input-by-field-metadata-type.constant'; +import { successfulCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant'; +import { expectGqlCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-error.util'; +import { expectGqlCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util'; +import { expectRestCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-error.util'; +import { expectRestCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +const FIELD_METADATA_TYPE = FieldMetadataType.DATE_TIME; + +const failingTestCases = + failingCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; +const successfulTestCases = + successfulCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; + +describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => { + let objectMetadataId: string; + let objectMetadataSingularName: string; + let objectMetadataPluralName: string; + let targetObjectMetadataId: string; + + beforeAll(async () => { + const setupTest = await setupTestObjectsWithAllFieldTypes(); + + objectMetadataId = setupTest.objectMetadataId; + objectMetadataSingularName = setupTest.objectMetadataSingularName; + objectMetadataPluralName = setupTest.objectMetadataPluralName; + targetObjectMetadataId = setupTest.targetObjectMetadataId; + }); + + afterAll(async () => { + await destroyManyObjectsMetadata([ + objectMetadataId, + targetObjectMetadataId, + ]); + }); + + describe('Gql create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectGqlCreateInputValidationError( + objectMetadataSingularName, + input, + ); + }, + ); + }); + + describe('Rest create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectRestCreateInputValidationError( + objectMetadataPluralName, + input, + ); + }, + ); + }); + + describe('Gql create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectGqlCreateInputValidationSuccess( + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); + + describe('Rest create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectRestCreateInputValidationSuccess( + objectMetadataPluralName, + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/emails-field-create-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/emails-field-create-input-validation.integration-spec.ts new file mode 100644 index 00000000000..bb9c680b576 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/emails-field-create-input-validation.integration-spec.ts @@ -0,0 +1,71 @@ +import { successfulCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant'; +import { expectGqlCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util'; +import { expectRestCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +const FIELD_METADATA_TYPE = FieldMetadataType.EMAILS; + +const successfulTestCases = + successfulCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; + +describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => { + let objectMetadataId: string; + let objectMetadataSingularName: string; + let objectMetadataPluralName: string; + let targetObjectMetadataId: string; + + beforeAll(async () => { + const setupTest = await setupTestObjectsWithAllFieldTypes(); + + objectMetadataId = setupTest.objectMetadataId; + objectMetadataSingularName = setupTest.objectMetadataSingularName; + objectMetadataPluralName = setupTest.objectMetadataPluralName; + targetObjectMetadataId = setupTest.targetObjectMetadataId; + }); + + afterAll(async () => { + await destroyManyObjectsMetadata([ + objectMetadataId, + targetObjectMetadataId, + ]); + }); + + describe('Gql create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectGqlCreateInputValidationSuccess( + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); + + describe('Rest create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectRestCreateInputValidationSuccess( + objectMetadataPluralName, + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/full-name-field-create-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/full-name-field-create-input-validation.integration-spec.ts new file mode 100644 index 00000000000..94b423e406a --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/full-name-field-create-input-validation.integration-spec.ts @@ -0,0 +1,71 @@ +import { successfulCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant'; +import { expectGqlCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util'; +import { expectRestCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +const FIELD_METADATA_TYPE = FieldMetadataType.FULL_NAME; + +const successfulTestCases = + successfulCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; + +describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => { + let objectMetadataId: string; + let objectMetadataSingularName: string; + let objectMetadataPluralName: string; + let targetObjectMetadataId: string; + + beforeAll(async () => { + const setupTest = await setupTestObjectsWithAllFieldTypes(); + + objectMetadataId = setupTest.objectMetadataId; + objectMetadataSingularName = setupTest.objectMetadataSingularName; + objectMetadataPluralName = setupTest.objectMetadataPluralName; + targetObjectMetadataId = setupTest.targetObjectMetadataId; + }); + + afterAll(async () => { + await destroyManyObjectsMetadata([ + objectMetadataId, + targetObjectMetadataId, + ]); + }); + + describe('Gql create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectGqlCreateInputValidationSuccess( + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); + + describe('Rest create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectRestCreateInputValidationSuccess( + objectMetadataPluralName, + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/links-field-create-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/links-field-create-input-validation.integration-spec.ts new file mode 100644 index 00000000000..cc17c07d2d1 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/links-field-create-input-validation.integration-spec.ts @@ -0,0 +1,71 @@ +import { successfulCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant'; +import { expectGqlCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util'; +import { expectRestCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +const FIELD_METADATA_TYPE = FieldMetadataType.LINKS; + +const successfulTestCases = + successfulCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; + +describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => { + let objectMetadataId: string; + let objectMetadataSingularName: string; + let objectMetadataPluralName: string; + let targetObjectMetadataId: string; + + beforeAll(async () => { + const setupTest = await setupTestObjectsWithAllFieldTypes(); + + objectMetadataId = setupTest.objectMetadataId; + objectMetadataSingularName = setupTest.objectMetadataSingularName; + objectMetadataPluralName = setupTest.objectMetadataPluralName; + targetObjectMetadataId = setupTest.targetObjectMetadataId; + }); + + afterAll(async () => { + await destroyManyObjectsMetadata([ + objectMetadataId, + targetObjectMetadataId, + ]); + }); + + describe('Gql create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectGqlCreateInputValidationSuccess( + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); + + describe('Rest create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectRestCreateInputValidationSuccess( + objectMetadataPluralName, + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/multi-select-field-create-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/multi-select-field-create-input-validation.integration-spec.ts new file mode 100644 index 00000000000..8aa78735fb8 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/multi-select-field-create-input-validation.integration-spec.ts @@ -0,0 +1,110 @@ +import { failingCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/failing-create-input-by-field-metadata-type.constant'; +import { successfulCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant'; +import { expectGqlCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-error.util'; +import { expectGqlCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util'; +import { expectRestCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-error.util'; +import { expectRestCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +const FIELD_METADATA_TYPE = FieldMetadataType.MULTI_SELECT; + +const failingTestCases = + failingCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; +const successfulTestCases = + successfulCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; + +describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => { + let objectMetadataId: string; + let objectMetadataSingularName: string; + let objectMetadataPluralName: string; + let targetObjectMetadataId: string; + + beforeAll(async () => { + const setupTest = await setupTestObjectsWithAllFieldTypes(); + + objectMetadataId = setupTest.objectMetadataId; + objectMetadataSingularName = setupTest.objectMetadataSingularName; + objectMetadataPluralName = setupTest.objectMetadataPluralName; + targetObjectMetadataId = setupTest.targetObjectMetadataId; + }); + + afterAll(async () => { + await destroyManyObjectsMetadata([ + objectMetadataId, + targetObjectMetadataId, + ]); + }); + + describe('Gql create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectGqlCreateInputValidationError( + objectMetadataSingularName, + input, + ); + }, + ); + }); + + describe('Rest create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectRestCreateInputValidationError( + objectMetadataPluralName, + input, + ); + }, + ); + }); + + describe('Gql create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectGqlCreateInputValidationSuccess( + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); + + describe('Rest create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectRestCreateInputValidationSuccess( + objectMetadataPluralName, + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/number-field-create-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/number-field-create-input-validation.integration-spec.ts new file mode 100644 index 00000000000..31a65c04ff2 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/number-field-create-input-validation.integration-spec.ts @@ -0,0 +1,105 @@ +import { successfulCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant'; +import { expectGqlCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util'; +import { expectRestCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +const FIELD_METADATA_TYPE = FieldMetadataType.NUMBER; + +const successfulTestCases = + successfulCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; + +describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => { + let objectMetadataId: string; + let objectMetadataSingularName: string; + let objectMetadataPluralName: string; + let targetObjectMetadataId: string; + + beforeAll(async () => { + const setupTest = await setupTestObjectsWithAllFieldTypes(); + + objectMetadataId = setupTest.objectMetadataId; + objectMetadataSingularName = setupTest.objectMetadataSingularName; + objectMetadataPluralName = setupTest.objectMetadataPluralName; + targetObjectMetadataId = setupTest.targetObjectMetadataId; + }); + + afterAll(async () => { + await destroyManyObjectsMetadata([ + objectMetadataId, + targetObjectMetadataId, + ]); + }); + + // describe('Gql create input - failure', () => { + // it.each( + // failingTestCases.map((testCase) => ({ + // ...testCase, + // stringifiedInput: JSON.stringify(testCase.input), + // })), + // )( + // `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + // async ({ input }) => { + // await expectGqlCreateInputValidationError( + // objectMetadataSingularName, + // input, + // ); + // }, + // ); + // }); + + // describe('Rest create input - failure', () => { + // it.each( + // failingTestCases.map((testCase) => ({ + // ...testCase, + // stringifiedInput: JSON.stringify(testCase.input), + // })), + // )( + // `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + // async ({ input }) => { + // await expectRestCreateInputValidationError( + // objectMetadataPluralName, + // input, + // ); + // }, + // ); + // }); + + describe('Gql create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectGqlCreateInputValidationSuccess( + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); + + describe('Rest create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectRestCreateInputValidationSuccess( + objectMetadataPluralName, + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/phones-field-create-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/phones-field-create-input-validation.integration-spec.ts new file mode 100644 index 00000000000..9d21b5b9d11 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/phones-field-create-input-validation.integration-spec.ts @@ -0,0 +1,71 @@ +import { successfulCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant'; +import { expectGqlCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util'; +import { expectRestCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +const FIELD_METADATA_TYPE = FieldMetadataType.PHONES; + +const successfulTestCases = + successfulCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; + +describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => { + let objectMetadataId: string; + let objectMetadataSingularName: string; + let objectMetadataPluralName: string; + let targetObjectMetadataId: string; + + beforeAll(async () => { + const setupTest = await setupTestObjectsWithAllFieldTypes(); + + objectMetadataId = setupTest.objectMetadataId; + objectMetadataSingularName = setupTest.objectMetadataSingularName; + objectMetadataPluralName = setupTest.objectMetadataPluralName; + targetObjectMetadataId = setupTest.targetObjectMetadataId; + }); + + afterAll(async () => { + await destroyManyObjectsMetadata([ + objectMetadataId, + targetObjectMetadataId, + ]); + }); + + describe('Gql create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectGqlCreateInputValidationSuccess( + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); + + describe('Rest create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectRestCreateInputValidationSuccess( + objectMetadataPluralName, + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/rating-field-create-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/rating-field-create-input-validation.integration-spec.ts new file mode 100644 index 00000000000..c066ce4ba9a --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/rating-field-create-input-validation.integration-spec.ts @@ -0,0 +1,110 @@ +import { failingCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/failing-create-input-by-field-metadata-type.constant'; +import { successfulCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant'; +import { expectGqlCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-error.util'; +import { expectGqlCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util'; +import { expectRestCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-error.util'; +import { expectRestCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +const FIELD_METADATA_TYPE = FieldMetadataType.RATING; + +const failingTestCases = + failingCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; +const successfulTestCases = + successfulCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; + +describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => { + let objectMetadataId: string; + let objectMetadataSingularName: string; + let objectMetadataPluralName: string; + let targetObjectMetadataId: string; + + beforeAll(async () => { + const setupTest = await setupTestObjectsWithAllFieldTypes(); + + objectMetadataId = setupTest.objectMetadataId; + objectMetadataSingularName = setupTest.objectMetadataSingularName; + objectMetadataPluralName = setupTest.objectMetadataPluralName; + targetObjectMetadataId = setupTest.targetObjectMetadataId; + }); + + afterAll(async () => { + await destroyManyObjectsMetadata([ + objectMetadataId, + targetObjectMetadataId, + ]); + }); + + describe('Gql create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectGqlCreateInputValidationError( + objectMetadataSingularName, + input, + ); + }, + ); + }); + + describe('Rest create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectRestCreateInputValidationError( + objectMetadataPluralName, + input, + ); + }, + ); + }); + + describe('Gql create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectGqlCreateInputValidationSuccess( + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); + + describe('Rest create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectRestCreateInputValidationSuccess( + objectMetadataPluralName, + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/raw-json-field-create-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/raw-json-field-create-input-validation.integration-spec.ts new file mode 100644 index 00000000000..2411b0df0cc --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/raw-json-field-create-input-validation.integration-spec.ts @@ -0,0 +1,110 @@ +import { failingCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/failing-create-input-by-field-metadata-type.constant'; +import { successfulCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant'; +import { expectGqlCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-error.util'; +import { expectGqlCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util'; +import { expectRestCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-error.util'; +import { expectRestCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +const FIELD_METADATA_TYPE = FieldMetadataType.RAW_JSON; + +const failingTestCases = + failingCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; +const successfulTestCases = + successfulCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; + +describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => { + let objectMetadataId: string; + let objectMetadataSingularName: string; + let objectMetadataPluralName: string; + let targetObjectMetadataId: string; + + beforeAll(async () => { + const setupTest = await setupTestObjectsWithAllFieldTypes(); + + objectMetadataId = setupTest.objectMetadataId; + objectMetadataSingularName = setupTest.objectMetadataSingularName; + objectMetadataPluralName = setupTest.objectMetadataPluralName; + targetObjectMetadataId = setupTest.targetObjectMetadataId; + }); + + afterAll(async () => { + await destroyManyObjectsMetadata([ + objectMetadataId, + targetObjectMetadataId, + ]); + }); + + describe('Gql create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectGqlCreateInputValidationError( + objectMetadataSingularName, + input, + ); + }, + ); + }); + + describe('Rest create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectRestCreateInputValidationError( + objectMetadataPluralName, + input, + ); + }, + ); + }); + + describe('Gql create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectGqlCreateInputValidationSuccess( + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); + + describe('Rest create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectRestCreateInputValidationSuccess( + objectMetadataPluralName, + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/relation-field-create-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/relation-field-create-input-validation.integration-spec.ts new file mode 100644 index 00000000000..412dc237aff --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/relation-field-create-input-validation.integration-spec.ts @@ -0,0 +1,110 @@ +import { failingCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/failing-create-input-by-field-metadata-type.constant'; +import { successfulCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant'; +import { expectGqlCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-error.util'; +import { expectGqlCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util'; +import { expectRestCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-error.util'; +import { expectRestCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +const FIELD_METADATA_TYPE = FieldMetadataType.RELATION; + +const failingTestCases = + failingCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; +const successfulTestCases = + successfulCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; + +describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => { + let objectMetadataId: string; + let objectMetadataSingularName: string; + let objectMetadataPluralName: string; + let targetObjectMetadataId: string; + + beforeAll(async () => { + const setupTest = await setupTestObjectsWithAllFieldTypes(); + + objectMetadataId = setupTest.objectMetadataId; + objectMetadataSingularName = setupTest.objectMetadataSingularName; + objectMetadataPluralName = setupTest.objectMetadataPluralName; + targetObjectMetadataId = setupTest.targetObjectMetadataId; + }); + + afterAll(async () => { + await destroyManyObjectsMetadata([ + objectMetadataId, + targetObjectMetadataId, + ]); + }); + + describe('Gql create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectGqlCreateInputValidationError( + objectMetadataSingularName, + input, + ); + }, + ); + }); + + describe('Rest create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectRestCreateInputValidationError( + objectMetadataPluralName, + input, + ); + }, + ); + }); + + describe('Gql create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectGqlCreateInputValidationSuccess( + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); + + describe('Rest create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectRestCreateInputValidationSuccess( + objectMetadataPluralName, + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/rich-text-field-create-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/rich-text-field-create-input-validation.integration-spec.ts new file mode 100644 index 00000000000..fa1c75b5207 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/rich-text-field-create-input-validation.integration-spec.ts @@ -0,0 +1,68 @@ +import { failingCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/failing-create-input-by-field-metadata-type.constant'; +import { expectGqlCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-error.util'; +import { expectRestCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-error.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +const FIELD_METADATA_TYPE = FieldMetadataType.RICH_TEXT; + +const failingTestCases = + failingCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; + +describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => { + let objectMetadataId: string; + let objectMetadataSingularName: string; + let objectMetadataPluralName: string; + let targetObjectMetadataId: string; + + beforeAll(async () => { + const setupTest = await setupTestObjectsWithAllFieldTypes(); + + objectMetadataId = setupTest.objectMetadataId; + objectMetadataSingularName = setupTest.objectMetadataSingularName; + objectMetadataPluralName = setupTest.objectMetadataPluralName; + targetObjectMetadataId = setupTest.targetObjectMetadataId; + }); + + afterAll(async () => { + await destroyManyObjectsMetadata([ + objectMetadataId, + targetObjectMetadataId, + ]); + }); + + describe('Gql create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectGqlCreateInputValidationError( + objectMetadataSingularName, + input, + ); + }, + ); + }); + + describe('Rest create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectRestCreateInputValidationError( + objectMetadataPluralName, + input, + ); + }, + ); + }); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/rich-text-v2-field-create-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/rich-text-v2-field-create-input-validation.integration-spec.ts new file mode 100644 index 00000000000..400300efc27 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/rich-text-v2-field-create-input-validation.integration-spec.ts @@ -0,0 +1,71 @@ +import { successfulCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant'; +import { expectGqlCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util'; +import { expectRestCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +const FIELD_METADATA_TYPE = FieldMetadataType.RICH_TEXT_V2; + +const successfulTestCases = + successfulCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; + +describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => { + let objectMetadataId: string; + let objectMetadataSingularName: string; + let objectMetadataPluralName: string; + let targetObjectMetadataId: string; + + beforeAll(async () => { + const setupTest = await setupTestObjectsWithAllFieldTypes(); + + objectMetadataId = setupTest.objectMetadataId; + objectMetadataSingularName = setupTest.objectMetadataSingularName; + objectMetadataPluralName = setupTest.objectMetadataPluralName; + targetObjectMetadataId = setupTest.targetObjectMetadataId; + }); + + afterAll(async () => { + await destroyManyObjectsMetadata([ + objectMetadataId, + targetObjectMetadataId, + ]); + }); + + describe('Gql create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectGqlCreateInputValidationSuccess( + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); + + describe('Rest create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectRestCreateInputValidationSuccess( + objectMetadataPluralName, + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/select-field-create-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/select-field-create-input-validation.integration-spec.ts new file mode 100644 index 00000000000..6697123c40f --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/select-field-create-input-validation.integration-spec.ts @@ -0,0 +1,110 @@ +import { failingCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/failing-create-input-by-field-metadata-type.constant'; +import { successfulCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant'; +import { expectGqlCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-error.util'; +import { expectGqlCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util'; +import { expectRestCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-error.util'; +import { expectRestCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +const FIELD_METADATA_TYPE = FieldMetadataType.SELECT; + +const failingTestCases = + failingCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; +const successfulTestCases = + successfulCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; + +describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => { + let objectMetadataId: string; + let objectMetadataSingularName: string; + let objectMetadataPluralName: string; + let targetObjectMetadataId: string; + + beforeAll(async () => { + const setupTest = await setupTestObjectsWithAllFieldTypes(); + + objectMetadataId = setupTest.objectMetadataId; + objectMetadataSingularName = setupTest.objectMetadataSingularName; + objectMetadataPluralName = setupTest.objectMetadataPluralName; + targetObjectMetadataId = setupTest.targetObjectMetadataId; + }); + + afterAll(async () => { + await destroyManyObjectsMetadata([ + objectMetadataId, + targetObjectMetadataId, + ]); + }); + + describe('Gql create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectGqlCreateInputValidationError( + objectMetadataSingularName, + input, + ); + }, + ); + }); + + describe('Rest create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectRestCreateInputValidationError( + objectMetadataPluralName, + input, + ); + }, + ); + }); + + describe('Gql create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectGqlCreateInputValidationSuccess( + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); + + describe('Rest create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectRestCreateInputValidationSuccess( + objectMetadataPluralName, + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/text-field-create-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/text-field-create-input-validation.integration-spec.ts new file mode 100644 index 00000000000..e751c8404ca --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/text-field-create-input-validation.integration-spec.ts @@ -0,0 +1,110 @@ +import { failingCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/failing-create-input-by-field-metadata-type.constant'; +import { successfulCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant'; +import { expectGqlCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-error.util'; +import { expectGqlCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util'; +import { expectRestCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-error.util'; +import { expectRestCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +const FIELD_METADATA_TYPE = FieldMetadataType.TEXT; + +const failingTestCases = + failingCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; +const successfulTestCases = + successfulCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; + +describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => { + let objectMetadataId: string; + let objectMetadataSingularName: string; + let objectMetadataPluralName: string; + let targetObjectMetadataId: string; + + beforeAll(async () => { + const setupTest = await setupTestObjectsWithAllFieldTypes(); + + objectMetadataId = setupTest.objectMetadataId; + objectMetadataSingularName = setupTest.objectMetadataSingularName; + objectMetadataPluralName = setupTest.objectMetadataPluralName; + targetObjectMetadataId = setupTest.targetObjectMetadataId; + }); + + afterAll(async () => { + await destroyManyObjectsMetadata([ + objectMetadataId, + targetObjectMetadataId, + ]); + }); + + describe('Gql create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectGqlCreateInputValidationError( + objectMetadataSingularName, + input, + ); + }, + ); + }); + + describe('Rest create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectRestCreateInputValidationError( + objectMetadataPluralName, + input, + ); + }, + ); + }); + + describe('Gql create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectGqlCreateInputValidationSuccess( + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); + + describe('Rest create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectRestCreateInputValidationSuccess( + objectMetadataPluralName, + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-error.util.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-error.util.ts new file mode 100644 index 00000000000..fdce879886e --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-error.util.ts @@ -0,0 +1,20 @@ +import { createOneOperationFactory } from 'test/integration/graphql/utils/create-one-operation-factory.util'; +import { makeGraphqlAPIRequestWithApiKey } from 'test/integration/graphql/utils/make-graphql-api-request-with-api-key.util'; + +export const expectGqlCreateInputValidationError = async ( + objectMetadataSingularName: string, + input: any, +) => { + const createManyGraphqlOperation = createOneOperationFactory({ + objectMetadataSingularName: objectMetadataSingularName, + gqlFields: 'id', + data: input, + }); + + const createManyResponse = await makeGraphqlAPIRequestWithApiKey( + createManyGraphqlOperation, + ); + + expect(createManyResponse.body.errors).toBeDefined(); + expect(createManyResponse.body.errors[0].message).toMatchSnapshot(); +}; diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util.ts new file mode 100644 index 00000000000..a1729c07bcb --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util.ts @@ -0,0 +1,30 @@ +import { TEST_OBJECT_GQL_FIELDS } from 'test/integration/graphql/suites/inputs-validation/constants/test-object-gql-fields.constant'; +import { createOneOperationFactory } from 'test/integration/graphql/utils/create-one-operation-factory.util'; +import { makeGraphqlAPIRequestWithApiKey } from 'test/integration/graphql/utils/make-graphql-api-request-with-api-key.util'; + +import { pascalCase } from 'src/utils/pascal-case'; + +export const expectGqlCreateInputValidationSuccess = async ( + objectMetadataSingularName: string, + input: any, + validateInput: (record: Record) => boolean, +) => { + const createOneOperation = createOneOperationFactory({ + objectMetadataSingularName: objectMetadataSingularName, + gqlFields: TEST_OBJECT_GQL_FIELDS, + data: input, + }); + + const createOneResponse = + await makeGraphqlAPIRequestWithApiKey(createOneOperation); + + expect(createOneResponse.body.errors).toBeUndefined(); + expect(createOneResponse.body.data).toBeDefined(); + expect( + validateInput( + createOneResponse.body.data[ + `create${pascalCase(objectMetadataSingularName)}` + ], + ), + ).toBe(true); +}; diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-error.util.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-error.util.ts new file mode 100644 index 00000000000..b1bac208d7e --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-error.util.ts @@ -0,0 +1,15 @@ +import { makeRestAPIRequest } from 'test/integration/rest/utils/make-rest-api-request.util'; + +export const expectRestCreateInputValidationError = async ( + objectMetadataPluralName: string, + input: any, +) => { + const response = await makeRestAPIRequest({ + method: 'post', + path: `/${objectMetadataPluralName}`, + body: input, + }); + + expect(response.body.error).toBeDefined(); + expect(JSON.stringify(response.body.messages)).toMatchSnapshot(); +}; diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util.ts new file mode 100644 index 00000000000..f8df006ae15 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util.ts @@ -0,0 +1,22 @@ +import { makeRestAPIRequest } from 'test/integration/rest/utils/make-rest-api-request.util'; + +import { pascalCase } from 'src/utils/pascal-case'; + +export const expectRestCreateInputValidationSuccess = async ( + objectMetadataPluralName: string, + objectMetadataSingularName: string, + input: any, + validateInput: (record: Record) => boolean, +) => { + const response = await makeRestAPIRequest({ + method: 'post', + path: `/${objectMetadataPluralName}`, + body: input, + }); + + const records = + response.body.data[`create${pascalCase(objectMetadataSingularName)}`]; + + expect(response.body.error).toBeUndefined(); + expect(validateInput(records)).toBe(true); +}; diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/uuid-field-create-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/uuid-field-create-input-validation.integration-spec.ts new file mode 100644 index 00000000000..be9456c545e --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/create-validation/uuid-field-create-input-validation.integration-spec.ts @@ -0,0 +1,110 @@ +import { failingCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/failing-create-input-by-field-metadata-type.constant'; +import { successfulCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant'; +import { expectGqlCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-error.util'; +import { expectGqlCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util'; +import { expectRestCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-error.util'; +import { expectRestCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +const FIELD_METADATA_TYPE = FieldMetadataType.UUID; + +const failingTestCases = + failingCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; +const successfulTestCases = + successfulCreateInputByFieldMetadataType[FIELD_METADATA_TYPE]; + +describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => { + let objectMetadataId: string; + let objectMetadataSingularName: string; + let objectMetadataPluralName: string; + let targetObjectMetadataId: string; + + beforeAll(async () => { + const setupTest = await setupTestObjectsWithAllFieldTypes(); + + objectMetadataId = setupTest.objectMetadataId; + objectMetadataSingularName = setupTest.objectMetadataSingularName; + objectMetadataPluralName = setupTest.objectMetadataPluralName; + targetObjectMetadataId = setupTest.targetObjectMetadataId; + }); + + afterAll(async () => { + await destroyManyObjectsMetadata([ + objectMetadataId, + targetObjectMetadataId, + ]); + }); + + describe('Gql create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectGqlCreateInputValidationError( + objectMetadataSingularName, + input, + ); + }, + ); + }); + + describe('Rest create input - failure', () => { + it.each( + failingTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`, + async ({ input }) => { + await expectRestCreateInputValidationError( + objectMetadataPluralName, + input, + ); + }, + ); + }); + + describe('Gql create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectGqlCreateInputValidationSuccess( + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); + + describe('Rest create input - success', () => { + it.each( + successfulTestCases.map((testCase) => ({ + ...testCase, + stringifiedInput: JSON.stringify(testCase.input), + })), + )( + `${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`, + async ({ input, validateInput }) => { + await expectRestCreateInputValidationSuccess( + objectMetadataPluralName, + objectMetadataSingularName, + input, + validateInput, + ); + }, + ); + }); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/address-field-filter-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/address-field-filter-input-validation.integration-spec.ts similarity index 78% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/address-field-filter-input-validation.integration-spec.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/address-field-filter-input-validation.integration-spec.ts index e2bcfa8e2db..46e917cdc70 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/address-field-filter-input-validation.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/address-field-filter-input-validation.integration-spec.ts @@ -1,15 +1,15 @@ -import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; -import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-successful-scenario.util'; -import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-successful-scenario.util'; -import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/args-validation/utils/destroy-many-objects-metadata'; -import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util'; +import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; +import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util'; +import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-successful-scenario.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; import { FieldMetadataType } from 'twenty-shared/types'; const FIELD_METADATA_TYPE = FieldMetadataType.ADDRESS; const successfulTestCases = successfulFilterInputByFieldMetadataType[FIELD_METADATA_TYPE]; -describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { +describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => { let objectMetadataId: string; let objectMetadataSingularName: string; let objectMetadataPluralName: string; @@ -31,7 +31,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ]); }); - describe('Gql filterInput - success', () => { + describe('Gql filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, @@ -50,7 +50,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Rest filterInput - success', () => { + describe('Rest filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/array-field-filter-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/array-field-filter-input-validation.integration-spec.ts similarity index 84% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/array-field-filter-input-validation.integration-spec.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/array-field-filter-input-validation.integration-spec.ts index 66e475bfc81..a28cdc85a8d 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/array-field-filter-input-validation.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/array-field-filter-input-validation.integration-spec.ts @@ -1,8 +1,8 @@ -import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; -import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-successful-scenario.util'; -import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-successful-scenario.util'; -import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/args-validation/utils/destroy-many-objects-metadata'; -import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util'; +import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; +import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util'; +import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-successful-scenario.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; import { FieldMetadataType } from 'twenty-shared/types'; const FIELD_METADATA_TYPE = FieldMetadataType.ARRAY; @@ -33,7 +33,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ]); }); - // describe('Gql filterInput - failure', () => { + // describe('Gql filter input - failure', () => { // it.each( // failingTestCases.map((testCase) => ({ // ...testCase, @@ -53,7 +53,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { // }); // // TODO : Refacto-common - Uncomment this - // describe('Rest filterInput - failure', () => { + // describe('Rest filter input - failure', () => { // it.each( // failingTestCases.map((testCase) => ({ // ...testCase, @@ -71,7 +71,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { // ); // }); - describe('Gql filterInput - success', () => { + describe('Gql filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, @@ -90,7 +90,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Rest filterInput - success', () => { + describe('Rest filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/boolean-field-filter-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/boolean-field-filter-input-validation.integration-spec.ts similarity index 82% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/boolean-field-filter-input-validation.integration-spec.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/boolean-field-filter-input-validation.integration-spec.ts index 32ca1f47ef3..1da007caeda 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/boolean-field-filter-input-validation.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/boolean-field-filter-input-validation.integration-spec.ts @@ -1,17 +1,16 @@ -import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; -import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-successful-scenario.util'; -import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-successful-scenario.util'; -import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/args-validation/utils/destroy-many-objects-metadata'; -import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util'; +import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; +import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util'; +import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-successful-scenario.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; import { FieldMetadataType } from 'twenty-shared/types'; - const FIELD_METADATA_TYPE = FieldMetadataType.BOOLEAN; // const failingTestCases = // failingFilterInputByFieldMetadataType[FIELD_METADATA_TYPE]; const successfulTestCases = successfulFilterInputByFieldMetadataType[FIELD_METADATA_TYPE]; -describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { +describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => { let objectMetadataId: string; let objectMetadataSingularName: string; let objectMetadataPluralName: string; @@ -33,7 +32,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ]); }); - // describe('Gql filterInput - failure', () => { + // describe('Gql filter input - failure', () => { // it.each( // failingTestCases.map((testCase) => ({ // ...testCase, @@ -53,7 +52,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { // }); // // TODO : Refacto-common - Uncomment this - // describe('Rest filterInput - failure', () => { + // describe('Rest filter input - failure', () => { // it.each( // failingTestCases.map((testCase) => ({ // ...testCase, @@ -71,7 +70,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { // ); // }); - describe('Gql filterInput - success', () => { + describe('Gql filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, @@ -90,7 +89,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Rest filterInput - success', () => { + describe('Rest filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant.ts similarity index 98% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant.ts index bcee26c7858..765b4cbb15b 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant.ts @@ -1,10 +1,13 @@ -import { type FieldMetadataTypeToTest } from 'test/integration/graphql/suites/args-validation/types/field-metadata-type-to-test'; +import { type FieldMetadataTypesToTestForFilterInputValidation } from 'test/integration/graphql/suites/inputs-validation/types/field-metadata-type-to-test'; import { FieldMetadataType } from 'twenty-shared/types'; import { type CompositeFieldMetadataType } from 'src/engine/metadata-modules/workspace-migration/factories/composite-column-action.factory'; export const failingFilterInputByFieldMetadataType: { - [K in Exclude]: { + [K in Exclude< + FieldMetadataTypesToTestForFilterInputValidation, + CompositeFieldMetadataType + >]: { gqlFilterInput: any; restFilterInput: any; gqlErrorMessage: string; diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant.ts similarity index 98% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant.ts index 85fd83d60e2..9ed57b09dad 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant.ts @@ -1,13 +1,13 @@ -import { isDefined } from 'class-validator'; -import { type FieldMetadataTypeToTest } from 'test/integration/graphql/suites/args-validation/types/field-metadata-type-to-test'; +import { type FieldMetadataTypesToTestForFilterInputValidation } from 'test/integration/graphql/suites/inputs-validation/types/field-metadata-type-to-test'; import { TEST_TARGET_OBJECT_RECORD_ID, TEST_UUID_FIELD_VALUE, -} from 'test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util'; +} from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; import { FieldMetadataType } from 'twenty-shared/types'; +import { isDefined } from 'twenty-shared/utils'; export const successfulFilterInputByFieldMetadataType: { - [K in FieldMetadataTypeToTest]: { + [K in FieldMetadataTypesToTestForFilterInputValidation]: { gqlFilterInput: any; restFilterInput: string; validateFilter: (record: Record) => boolean; diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/currency-field-filter-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/currency-field-filter-input-validation.integration-spec.ts similarity index 78% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/currency-field-filter-input-validation.integration-spec.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/currency-field-filter-input-validation.integration-spec.ts index bdbd5f85a91..b1f10daf247 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/currency-field-filter-input-validation.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/currency-field-filter-input-validation.integration-spec.ts @@ -1,15 +1,15 @@ -import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; -import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-successful-scenario.util'; -import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-successful-scenario.util'; -import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/args-validation/utils/destroy-many-objects-metadata'; -import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util'; +import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; +import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util'; +import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-successful-scenario.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; import { FieldMetadataType } from 'twenty-shared/types'; const FIELD_METADATA_TYPE = FieldMetadataType.CURRENCY; const successfulTestCases = successfulFilterInputByFieldMetadataType[FIELD_METADATA_TYPE]; -describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { +describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => { let objectMetadataId: string; let objectMetadataSingularName: string; let objectMetadataPluralName: string; @@ -31,7 +31,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ]); }); - describe('Gql filterInput - success', () => { + describe('Gql filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, @@ -50,7 +50,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Rest filterInput - success', () => { + describe('Rest filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/date-field-filter-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/date-field-filter-input-validation.integration-spec.ts similarity index 78% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/date-field-filter-input-validation.integration-spec.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/date-field-filter-input-validation.integration-spec.ts index 4688d6e704d..2c7d1625a34 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/date-field-filter-input-validation.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/date-field-filter-input-validation.integration-spec.ts @@ -1,11 +1,11 @@ -import { failingFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant'; -import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; -import { testGqlFailingScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-failing-scenario.util'; -import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-successful-scenario.util'; -import { testRestFailingScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-failing-scenario.util'; -import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-successful-scenario.util'; -import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/args-validation/utils/destroy-many-objects-metadata'; -import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util'; +import { failingFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant'; +import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; +import { testGqlFailingScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-failing-scenario.util'; +import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util'; +import { testRestFailingScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-failing-scenario.util'; +import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-successful-scenario.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; import { FieldMetadataType } from 'twenty-shared/types'; const FIELD_METADATA_TYPE = FieldMetadataType.DATE; @@ -14,7 +14,7 @@ const failingTestCases = const successfulTestCases = successfulFilterInputByFieldMetadataType[FIELD_METADATA_TYPE]; -describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { +describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => { let objectMetadataId: string; let objectMetadataSingularName: string; let objectMetadataPluralName: string; @@ -36,7 +36,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ]); }); - describe('Gql filterInput - failure', () => { + describe('Gql filter input - failure', () => { it.each( failingTestCases.map((testCase) => ({ ...testCase, @@ -56,7 +56,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { }); // TODO : Refacto-common - Uncomment this - describe('Rest filterInput - failure', () => { + describe('Rest filter input - failure', () => { it.each( failingTestCases.map((testCase) => ({ ...testCase, @@ -74,7 +74,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Gql filterInput - success', () => { + describe('Gql filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, @@ -93,7 +93,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Rest filterInput - success', () => { + describe('Rest filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/date-time-field-filter-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/date-time-field-filter-input-validation.integration-spec.ts similarity index 78% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/date-time-field-filter-input-validation.integration-spec.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/date-time-field-filter-input-validation.integration-spec.ts index 4dad9612c71..52e1691abc2 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/date-time-field-filter-input-validation.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/date-time-field-filter-input-validation.integration-spec.ts @@ -1,11 +1,11 @@ -import { failingFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant'; -import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; -import { testGqlFailingScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-failing-scenario.util'; -import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-successful-scenario.util'; -import { testRestFailingScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-failing-scenario.util'; -import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-successful-scenario.util'; -import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/args-validation/utils/destroy-many-objects-metadata'; -import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util'; +import { failingFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant'; +import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; +import { testGqlFailingScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-failing-scenario.util'; +import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util'; +import { testRestFailingScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-failing-scenario.util'; +import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-successful-scenario.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; import { FieldMetadataType } from 'twenty-shared/types'; const FIELD_METADATA_TYPE = FieldMetadataType.DATE_TIME; @@ -14,7 +14,7 @@ const failingTestCases = const successfulTestCases = successfulFilterInputByFieldMetadataType[FIELD_METADATA_TYPE]; -describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { +describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => { let objectMetadataId: string; let objectMetadataSingularName: string; let objectMetadataPluralName: string; @@ -36,7 +36,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ]); }); - describe('Gql filterInput - failure', () => { + describe('Gql filter input - failure', () => { it.each( failingTestCases.map((testCase) => ({ ...testCase, @@ -56,7 +56,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { }); // TODO : Refacto-common - Uncomment this - describe('Rest filterInput - failure', () => { + describe('Rest filter input - failure', () => { it.each( failingTestCases.map((testCase) => ({ ...testCase, @@ -74,7 +74,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Gql filterInput - success', () => { + describe('Gql filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, @@ -93,7 +93,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Rest filterInput - success', () => { + describe('Rest filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/emails-field-filter-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/emails-field-filter-input-validation.integration-spec.ts similarity index 78% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/emails-field-filter-input-validation.integration-spec.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/emails-field-filter-input-validation.integration-spec.ts index af9d0e51745..655262ad4bf 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/emails-field-filter-input-validation.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/emails-field-filter-input-validation.integration-spec.ts @@ -1,15 +1,15 @@ -import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; -import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-successful-scenario.util'; -import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-successful-scenario.util'; -import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/args-validation/utils/destroy-many-objects-metadata'; -import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util'; +import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; +import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util'; +import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-successful-scenario.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; import { FieldMetadataType } from 'twenty-shared/types'; const FIELD_METADATA_TYPE = FieldMetadataType.EMAILS; const successfulTestCases = successfulFilterInputByFieldMetadataType[FIELD_METADATA_TYPE]; -describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { +describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => { let objectMetadataId: string; let objectMetadataSingularName: string; let objectMetadataPluralName: string; @@ -31,7 +31,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ]); }); - describe('Gql filterInput - success', () => { + describe('Gql filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, @@ -50,7 +50,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Rest filterInput - success', () => { + describe('Rest filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/full-name-field-filter-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/full-name-field-filter-input-validation.integration-spec.ts similarity index 78% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/full-name-field-filter-input-validation.integration-spec.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/full-name-field-filter-input-validation.integration-spec.ts index 734c62f2fa8..954c41246bc 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/full-name-field-filter-input-validation.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/full-name-field-filter-input-validation.integration-spec.ts @@ -1,15 +1,15 @@ -import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; -import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-successful-scenario.util'; -import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-successful-scenario.util'; -import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/args-validation/utils/destroy-many-objects-metadata'; -import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util'; +import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; +import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util'; +import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-successful-scenario.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; import { FieldMetadataType } from 'twenty-shared/types'; const FIELD_METADATA_TYPE = FieldMetadataType.FULL_NAME; const successfulTestCases = successfulFilterInputByFieldMetadataType[FIELD_METADATA_TYPE]; -describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { +describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => { let objectMetadataId: string; let objectMetadataSingularName: string; let objectMetadataPluralName: string; @@ -31,7 +31,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ]); }); - describe('Gql filterInput - success', () => { + describe('Gql filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, @@ -50,7 +50,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Rest filterInput - success', () => { + describe('Rest filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/links-field-filter-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/links-field-filter-input-validation.integration-spec.ts similarity index 78% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/links-field-filter-input-validation.integration-spec.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/links-field-filter-input-validation.integration-spec.ts index 1cf27691830..032dda274a3 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/links-field-filter-input-validation.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/links-field-filter-input-validation.integration-spec.ts @@ -1,15 +1,15 @@ -import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; -import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-successful-scenario.util'; -import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-successful-scenario.util'; -import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/args-validation/utils/destroy-many-objects-metadata'; -import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util'; +import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; +import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util'; +import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-successful-scenario.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; import { FieldMetadataType } from 'twenty-shared/types'; const FIELD_METADATA_TYPE = FieldMetadataType.LINKS; const successfulTestCases = successfulFilterInputByFieldMetadataType[FIELD_METADATA_TYPE]; -describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { +describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => { let objectMetadataId: string; let objectMetadataSingularName: string; let objectMetadataPluralName: string; @@ -31,7 +31,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ]); }); - describe('Gql filterInput - success', () => { + describe('Gql filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, @@ -50,7 +50,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Rest filterInput - success', () => { + describe('Rest filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/multi-select-field-filter-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/multi-select-field-filter-input-validation.integration-spec.ts similarity index 78% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/multi-select-field-filter-input-validation.integration-spec.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/multi-select-field-filter-input-validation.integration-spec.ts index 176a52d0bc8..0632db0b7d0 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/multi-select-field-filter-input-validation.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/multi-select-field-filter-input-validation.integration-spec.ts @@ -1,11 +1,11 @@ -import { failingFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant'; -import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; -import { testGqlFailingScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-failing-scenario.util'; -import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-successful-scenario.util'; -import { testRestFailingScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-failing-scenario.util'; -import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-successful-scenario.util'; -import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/args-validation/utils/destroy-many-objects-metadata'; -import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util'; +import { failingFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant'; +import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; +import { testGqlFailingScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-failing-scenario.util'; +import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util'; +import { testRestFailingScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-failing-scenario.util'; +import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-successful-scenario.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; import { FieldMetadataType } from 'twenty-shared/types'; const FIELD_METADATA_TYPE = FieldMetadataType.MULTI_SELECT; @@ -14,7 +14,7 @@ const failingTestCases = const successfulTestCases = successfulFilterInputByFieldMetadataType[FIELD_METADATA_TYPE]; -describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { +describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => { let objectMetadataId: string; let objectMetadataSingularName: string; let objectMetadataPluralName: string; @@ -36,7 +36,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ]); }); - describe('Gql filterInput - failure', () => { + describe('Gql filter input - failure', () => { it.each( failingTestCases.map((testCase) => ({ ...testCase, @@ -56,7 +56,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { }); // TODO : Refacto-common - Uncomment this - describe('Rest filterInput - failure', () => { + describe('Rest filter input - failure', () => { it.each( failingTestCases.map((testCase) => ({ ...testCase, @@ -74,7 +74,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Gql filterInput - success', () => { + describe('Gql filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, @@ -93,7 +93,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Rest filterInput - success', () => { + describe('Rest filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/number-field-filter-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/number-field-filter-input-validation.integration-spec.ts similarity index 82% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/number-field-filter-input-validation.integration-spec.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/number-field-filter-input-validation.integration-spec.ts index 3f6da632b4d..d8360efd1bf 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/number-field-filter-input-validation.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/number-field-filter-input-validation.integration-spec.ts @@ -1,8 +1,8 @@ -import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; -import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-successful-scenario.util'; -import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-successful-scenario.util'; -import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/args-validation/utils/destroy-many-objects-metadata'; -import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util'; +import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; +import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util'; +import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-successful-scenario.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; import { FieldMetadataType } from 'twenty-shared/types'; const FIELD_METADATA_TYPE = FieldMetadataType.NUMBER; @@ -11,7 +11,7 @@ const FIELD_METADATA_TYPE = FieldMetadataType.NUMBER; const successfulTestCases = successfulFilterInputByFieldMetadataType[FIELD_METADATA_TYPE]; -describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { +describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => { let objectMetadataId: string; let objectMetadataSingularName: string; let objectMetadataPluralName: string; @@ -33,7 +33,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ]); }); - // describe('Gql filterInput - failure', () => { + // describe('Gql filter input - failure', () => { // it.each( // failingTestCases.map((testCase) => ({ // ...testCase, @@ -53,7 +53,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { // }); // // TODO : Refacto-common - Uncomment this - // describe('Rest filterInput - failure', () => { + // describe('Rest filter input - failure', () => { // it.each( // failingTestCases.map((testCase) => ({ // ...testCase, @@ -71,7 +71,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { // ); // }); - describe('Gql filterInput - success', () => { + describe('Gql filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, @@ -90,7 +90,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Rest filterInput - success', () => { + describe('Rest filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/phones-field-filter-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/phones-field-filter-input-validation.integration-spec.ts similarity index 78% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/phones-field-filter-input-validation.integration-spec.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/phones-field-filter-input-validation.integration-spec.ts index 7fbd3a73b4c..be28593038e 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/phones-field-filter-input-validation.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/phones-field-filter-input-validation.integration-spec.ts @@ -1,15 +1,15 @@ -import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; -import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-successful-scenario.util'; -import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-successful-scenario.util'; -import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/args-validation/utils/destroy-many-objects-metadata'; -import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util'; +import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; +import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util'; +import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-successful-scenario.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; import { FieldMetadataType } from 'twenty-shared/types'; const FIELD_METADATA_TYPE = FieldMetadataType.PHONES; const successfulTestCases = successfulFilterInputByFieldMetadataType[FIELD_METADATA_TYPE]; -describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { +describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => { let objectMetadataId: string; let objectMetadataSingularName: string; let objectMetadataPluralName: string; @@ -31,7 +31,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ]); }); - describe('Gql filterInput - success', () => { + describe('Gql filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, @@ -50,7 +50,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Rest filterInput - success', () => { + describe('Rest filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/rating-field-filter-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/rating-field-filter-input-validation.integration-spec.ts similarity index 78% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/rating-field-filter-input-validation.integration-spec.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/rating-field-filter-input-validation.integration-spec.ts index 11747a12bea..502082b8ead 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/rating-field-filter-input-validation.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/rating-field-filter-input-validation.integration-spec.ts @@ -1,11 +1,11 @@ -import { failingFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant'; -import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; -import { testGqlFailingScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-failing-scenario.util'; -import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-successful-scenario.util'; -import { testRestFailingScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-failing-scenario.util'; -import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-successful-scenario.util'; -import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/args-validation/utils/destroy-many-objects-metadata'; -import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util'; +import { failingFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant'; +import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; +import { testGqlFailingScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-failing-scenario.util'; +import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util'; +import { testRestFailingScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-failing-scenario.util'; +import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-successful-scenario.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; import { FieldMetadataType } from 'twenty-shared/types'; const FIELD_METADATA_TYPE = FieldMetadataType.RATING; @@ -14,7 +14,7 @@ const failingTestCases = const successfulTestCases = successfulFilterInputByFieldMetadataType[FIELD_METADATA_TYPE]; -describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { +describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => { let objectMetadataId: string; let objectMetadataSingularName: string; let objectMetadataPluralName: string; @@ -36,7 +36,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ]); }); - describe('Gql filterInput - failure', () => { + describe('Gql filter input - failure', () => { it.each( failingTestCases.map((testCase) => ({ ...testCase, @@ -56,7 +56,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { }); // TODO : Refacto-common - Uncomment this - describe('Rest filterInput - failure', () => { + describe('Rest filter input - failure', () => { it.each( failingTestCases.map((testCase) => ({ ...testCase, @@ -74,7 +74,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Gql filterInput - success', () => { + describe('Gql filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, @@ -93,7 +93,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Rest filterInput - success', () => { + describe('Rest filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/raw-json-field-filter-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/raw-json-field-filter-input-validation.integration-spec.ts similarity index 82% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/raw-json-field-filter-input-validation.integration-spec.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/raw-json-field-filter-input-validation.integration-spec.ts index 959b513b46d..1891f0d38fe 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/raw-json-field-filter-input-validation.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/raw-json-field-filter-input-validation.integration-spec.ts @@ -1,8 +1,8 @@ -import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; -import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-successful-scenario.util'; -import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-successful-scenario.util'; -import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/args-validation/utils/destroy-many-objects-metadata'; -import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util'; +import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; +import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util'; +import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-successful-scenario.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; import { FieldMetadataType } from 'twenty-shared/types'; const FIELD_METADATA_TYPE = FieldMetadataType.RAW_JSON; @@ -11,7 +11,7 @@ const FIELD_METADATA_TYPE = FieldMetadataType.RAW_JSON; const successfulTestCases = successfulFilterInputByFieldMetadataType[FIELD_METADATA_TYPE]; -describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { +describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => { let objectMetadataId: string; let objectMetadataSingularName: string; let objectMetadataPluralName: string; @@ -33,7 +33,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ]); }); - // describe('Gql filterInput - failure', () => { + // describe('Gql filter input - failure', () => { // it.each( // failingTestCases.map((testCase) => ({ // ...testCase, @@ -53,7 +53,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { // }); // // TODO : Refacto-common - Uncomment this - // describe('Rest filterInput - failure', () => { + // describe('Rest filter input - failure', () => { // it.each( // failingTestCases.map((testCase) => ({ // ...testCase, @@ -71,7 +71,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { // ); // }); - describe('Gql filterInput - success', () => { + describe('Gql filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, @@ -90,7 +90,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Rest filterInput - success', () => { + describe('Rest filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/relation-field-filter-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/relation-field-filter-input-validation.integration-spec.ts similarity index 78% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/relation-field-filter-input-validation.integration-spec.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/relation-field-filter-input-validation.integration-spec.ts index d6cc72e9968..a4dfb6ddd05 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/relation-field-filter-input-validation.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/relation-field-filter-input-validation.integration-spec.ts @@ -1,11 +1,11 @@ -import { failingFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant'; -import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; -import { testGqlFailingScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-failing-scenario.util'; -import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-successful-scenario.util'; -import { testRestFailingScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-failing-scenario.util'; -import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-successful-scenario.util'; -import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/args-validation/utils/destroy-many-objects-metadata'; -import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util'; +import { failingFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant'; +import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; +import { testGqlFailingScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-failing-scenario.util'; +import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util'; +import { testRestFailingScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-failing-scenario.util'; +import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-successful-scenario.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; import { FieldMetadataType } from 'twenty-shared/types'; const FIELD_METADATA_TYPE = FieldMetadataType.RELATION; @@ -14,7 +14,7 @@ const failingTestCases = const successfulTestCases = successfulFilterInputByFieldMetadataType[FIELD_METADATA_TYPE]; -describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { +describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => { let objectMetadataId: string; let objectMetadataSingularName: string; let objectMetadataPluralName: string; @@ -36,7 +36,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ]); }); - describe('Gql filterInput - failure', () => { + describe('Gql filter input - failure', () => { it.each( failingTestCases.map((testCase) => ({ ...testCase, @@ -56,7 +56,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { }); // TODO : Refacto-common - Uncomment this - describe('Rest filterInput - failure', () => { + describe('Rest filter input - failure', () => { it.each( failingTestCases.map((testCase) => ({ ...testCase, @@ -74,7 +74,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Gql filterInput - success', () => { + describe('Gql filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, @@ -93,7 +93,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Rest filterInput - success', () => { + describe('Rest filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/select-field-filter-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/select-field-filter-input-validation.integration-spec.ts similarity index 79% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/select-field-filter-input-validation.integration-spec.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/select-field-filter-input-validation.integration-spec.ts index 4b6bed57a32..78570e80839 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/select-field-filter-input-validation.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/select-field-filter-input-validation.integration-spec.ts @@ -1,10 +1,10 @@ -import { failingFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant'; -import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; -import { testGqlFailingScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-failing-scenario.util'; -import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-successful-scenario.util'; -import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-successful-scenario.util'; -import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/args-validation/utils/destroy-many-objects-metadata'; -import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util'; +import { failingFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant'; +import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; +import { testGqlFailingScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-failing-scenario.util'; +import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util'; +import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-successful-scenario.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; import { FieldMetadataType } from 'twenty-shared/types'; const FIELD_METADATA_TYPE = FieldMetadataType.SELECT; @@ -13,7 +13,7 @@ const failingTestCases = const successfulTestCases = successfulFilterInputByFieldMetadataType[FIELD_METADATA_TYPE]; -describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { +describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => { let objectMetadataId: string; let objectMetadataSingularName: string; let objectMetadataPluralName: string; @@ -35,7 +35,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ]); }); - describe('Gql filterInput - failure', () => { + describe('Gql filter input - failure', () => { it.each( failingTestCases.map((testCase) => ({ ...testCase, @@ -55,7 +55,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { }); // TODO : Refacto-common - Uncomment this - // describe('Rest filterInput - failure', () => { + // describe('Rest filter input - failure', () => { // it.each( // failingTestCases.map((testCase) => ({ // ...testCase, @@ -73,7 +73,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { // ); // }); - describe('Gql filterInput - success', () => { + describe('Gql filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, @@ -92,7 +92,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Rest filterInput - success', () => { + describe('Rest filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/text-field-filter-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/text-field-filter-input-validation.integration-spec.ts similarity index 77% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/text-field-filter-input-validation.integration-spec.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/text-field-filter-input-validation.integration-spec.ts index f9f8bd72efc..8be9af6372e 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/text-field-filter-input-validation.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/text-field-filter-input-validation.integration-spec.ts @@ -1,11 +1,11 @@ -import { failingFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant'; -import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; -import { testGqlFailingScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-failing-scenario.util'; -import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-successful-scenario.util'; -import { testRestFailingScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-failing-scenario.util'; -import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-successful-scenario.util'; -import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/args-validation/utils/destroy-many-objects-metadata'; -import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util'; +import { failingFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant'; +import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; +import { testGqlFailingScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-failing-scenario.util'; +import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util'; +import { testRestFailingScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-failing-scenario.util'; +import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-successful-scenario.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; import { FieldMetadataType } from 'twenty-shared/types'; const FIELD_METADATA_TYPE = FieldMetadataType.TEXT; @@ -14,7 +14,7 @@ const failingTestCases = const successfulTestCases = successfulFilterInputByFieldMetadataType[FIELD_METADATA_TYPE]; -describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { +describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => { let objectMetadataId: string; let objectMetadataSingularName: string; let objectMetadataPluralName: string; @@ -36,7 +36,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ]); }); - describe('Gql filterInput - failure', () => { + describe('Gql filter input - failure', () => { it.each( failingTestCases.map((testCase) => ({ ...testCase, @@ -55,8 +55,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - // TODO : Refacto-common - Uncomment this - describe('Rest filterInput - failure', () => { + describe('Rest filter input - failure', () => { it.each( failingTestCases.map((testCase) => ({ ...testCase, @@ -74,7 +73,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Gql filterInput - success', () => { + describe('Gql filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, @@ -93,7 +92,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Rest filterInput - success', () => { + describe('Rest filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-failing-scenario.util.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-failing-scenario.util.ts similarity index 100% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-failing-scenario.util.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-failing-scenario.util.ts diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-successful-scenario.util.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util.ts similarity index 92% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-successful-scenario.util.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util.ts index 016ecc59144..a5bfab78eb5 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-successful-scenario.util.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util.ts @@ -1,4 +1,4 @@ -import { TEST_OBJECT_GQL_FIELDS } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/test-object-gql-fields.constant'; +import { TEST_OBJECT_GQL_FIELDS } from 'test/integration/graphql/suites/inputs-validation/constants/test-object-gql-fields.constant'; import { findManyOperationFactory } from 'test/integration/graphql/utils/find-many-operation-factory.util'; import { makeGraphqlAPIRequestWithApiKey } from 'test/integration/graphql/utils/make-graphql-api-request-with-api-key.util'; diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-failing-scenario.util.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-failing-scenario.util.ts similarity index 100% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-failing-scenario.util.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-failing-scenario.util.ts diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-successful-scenario.util.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-successful-scenario.util.ts similarity index 100% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-successful-scenario.util.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-successful-scenario.util.ts diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/uuid-field-filter-input-validation.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/uuid-field-filter-input-validation.integration-spec.ts similarity index 78% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/uuid-field-filter-input-validation.integration-spec.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/uuid-field-filter-input-validation.integration-spec.ts index 8c012a467de..510f33fdacb 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/filter-validation/uuid-field-filter-input-validation.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/filter-validation/uuid-field-filter-input-validation.integration-spec.ts @@ -1,11 +1,11 @@ -import { failingFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant'; -import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; -import { testGqlFailingScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-failing-scenario.util'; -import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-gql-successful-scenario.util'; -import { testRestFailingScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-failing-scenario.util'; -import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/args-validation/filter-validation/utils/test-rest-successful-scenario.util'; -import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/args-validation/utils/destroy-many-objects-metadata'; -import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util'; +import { failingFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant'; +import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant'; +import { testGqlFailingScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-failing-scenario.util'; +import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util'; +import { testRestFailingScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-failing-scenario.util'; +import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-successful-scenario.util'; +import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata'; +import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util'; import { FieldMetadataType } from 'twenty-shared/types'; const FIELD_METADATA_TYPE = FieldMetadataType.UUID; @@ -14,7 +14,7 @@ const failingTestCases = const successfulTestCases = successfulFilterInputByFieldMetadataType[FIELD_METADATA_TYPE]; -describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { +describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => { let objectMetadataId: string; let objectMetadataSingularName: string; let objectMetadataPluralName: string; @@ -36,7 +36,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ]); }); - describe('Gql filterInput - failure', () => { + describe('Gql filter input - failure', () => { it.each( failingTestCases.map((testCase) => ({ ...testCase, @@ -56,7 +56,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { }); // TODO : Refacto-common - Uncomment this - describe('Rest filterInput - failure', () => { + describe('Rest filter input - failure', () => { it.each( failingTestCases.map((testCase) => ({ ...testCase, @@ -74,7 +74,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Gql filterInput - success', () => { + describe('Gql filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, @@ -93,7 +93,7 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => { ); }); - describe('Rest filterInput - success', () => { + describe('Rest filter input - success', () => { it.each( successfulTestCases.map((testCase) => ({ ...testCase, diff --git a/packages/twenty-server/test/integration/graphql/suites/inputs-validation/types/field-metadata-type-to-test.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/types/field-metadata-type-to-test.ts new file mode 100644 index 00000000000..a9270aedd91 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/types/field-metadata-type-to-test.ts @@ -0,0 +1,27 @@ +import { type FieldMetadataType } from 'twenty-shared/types'; + +type FieldMetadataTypesNotTestedForFilterInputValidation = + | 'TS_VECTOR' + | 'RICH_TEXT' + | 'POSITION' + | 'ACTOR' + | 'MORPH_RELATION' + | 'NUMERIC' + | 'RICH_TEXT_V2'; + +type FieldMetadataTypesNotTestedForCreateInputValidation = + | 'TS_VECTOR' + | 'ACTOR' + | 'POSITION' + | 'MORPH_RELATION' + | 'NUMERIC'; + +export type FieldMetadataTypesToTestForCreateInputValidation = Exclude< + FieldMetadataType, + FieldMetadataTypesNotTestedForCreateInputValidation +>; + +export type FieldMetadataTypesToTestForFilterInputValidation = Exclude< + FieldMetadataType, + FieldMetadataTypesNotTestedForFilterInputValidation +>; diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/utils/destroy-many-objects-metadata.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata.ts similarity index 100% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/utils/destroy-many-objects-metadata.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata.ts diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/utils/get-field-metadata-creation-inputs.util.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/utils/get-field-metadata-creation-inputs.util.ts similarity index 85% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/utils/get-field-metadata-creation-inputs.util.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/utils/get-field-metadata-creation-inputs.util.ts index 148c05f5ab1..f927c32ac33 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/utils/get-field-metadata-creation-inputs.util.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/utils/get-field-metadata-creation-inputs.util.ts @@ -1,4 +1,7 @@ -import { type FieldMetadataTypeToTest } from 'test/integration/graphql/suites/args-validation/types/field-metadata-type-to-test'; +import { + type FieldMetadataTypesToTestForCreateInputValidation, + type FieldMetadataTypesToTestForFilterInputValidation, +} from 'test/integration/graphql/suites/inputs-validation/types/field-metadata-type-to-test'; import { FieldMetadataType, RelationType, @@ -21,10 +24,24 @@ export const getFieldMetadataCreationInputs = ( targetObjectMetadataId: string, ) => { const fieldInputsMap: { - [K in FieldMetadataTypeToTest]: - | FieldMetadataCreationInput - | FieldMetadataCreationInput[]; + [K in Exclude< + | FieldMetadataTypesToTestForCreateInputValidation + | FieldMetadataTypesToTestForFilterInputValidation, + 'ACTOR' + >]: FieldMetadataCreationInput | FieldMetadataCreationInput[]; } = { + [FieldMetadataType.RICH_TEXT]: { + name: 'richTextField', + label: 'richTextField', + type: FieldMetadataType.RICH_TEXT, + objectMetadataId, + }, + [FieldMetadataType.RICH_TEXT_V2]: { + name: 'richTextV2Field', + label: 'richTextV2Field', + type: FieldMetadataType.RICH_TEXT_V2, + objectMetadataId, + }, [FieldMetadataType.TEXT]: { name: 'textField', label: 'textField', diff --git a/packages/twenty-server/test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util.ts b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util.ts similarity index 85% rename from packages/twenty-server/test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util.ts rename to packages/twenty-server/test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util.ts index 5392f9de1ba..a85ffbdb74b 100644 --- a/packages/twenty-server/test/integration/graphql/suites/args-validation/utils/setup-test-objects-with-all-field-types.util.ts +++ b/packages/twenty-server/test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util.ts @@ -1,24 +1,26 @@ import { randomUUID } from 'crypto'; -import { TEST_OBJECT_GQL_FIELDS } from 'test/integration/graphql/suites/args-validation/filter-validation/constants/test-object-gql-fields.constant'; -import { getFieldMetadataCreationInputs } from 'test/integration/graphql/suites/args-validation/utils/get-field-metadata-creation-inputs.util'; +import { getFieldMetadataCreationInputs } from 'test/integration/graphql/suites/inputs-validation/utils/get-field-metadata-creation-inputs.util'; import { createManyOperationFactory } from 'test/integration/graphql/utils/create-many-operation-factory.util'; import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.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'; -const TEST_OBJECT_METADATA_NAME_SINGULAR = 'apiFilterValidationTestObject'; -const TEST_OBJECT_METADATA_NAME_PLURAL = 'apiFilterValidationTestObjects'; +const TEST_OBJECT_METADATA_NAME_SINGULAR = 'apiInputValidationTestObject'; +const TEST_OBJECT_METADATA_NAME_PLURAL = 'apiInputValidationTestObjects'; const TEST_TARGET_OBJECT_METADATA_NAME_SINGULAR = - 'apiFilterValidationTargetTestObject'; + 'apiInputValidationTargetTestObject'; const TEST_TARGET_OBJECT_METADATA_NAME_PLURAL = - 'apiFilterValidationTargetTestObjects'; + 'apiInputValidationTargetTestObjects'; export const TEST_TARGET_OBJECT_RECORD_ID = '20202020-a21e-4ec2-873b-de4264d89025'; export const TEST_UUID_FIELD_VALUE = '20202020-b21e-4ec2-873b-de4264d89025'; +export const TEST_TARGET_OBJECT_RECORD_ID_FIELD_VALUE = + '20202020-b21e-4ec2-873b-de4264d89021'; + export const setupTestObjectsWithAllFieldTypes = async () => { const createdObjectMetadata = await createOneObjectMetadata({ input: { @@ -71,7 +73,7 @@ export const setupTestObjectsWithAllFieldTypes = async () => { createManyOperationFactory({ objectMetadataSingularName: TEST_OBJECT_METADATA_NAME_SINGULAR, objectMetadataPluralName: TEST_OBJECT_METADATA_NAME_PLURAL, - gqlFields: TEST_OBJECT_GQL_FIELDS, + gqlFields: `id`, data: [ { id: randomUUID(), @@ -139,6 +141,19 @@ export const setupTestObjectsWithAllFieldTypes = async () => { }), ); + await makeGraphqlAPIRequest( + createManyOperationFactory({ + objectMetadataSingularName: TEST_TARGET_OBJECT_METADATA_NAME_SINGULAR, + objectMetadataPluralName: TEST_TARGET_OBJECT_METADATA_NAME_PLURAL, + gqlFields: `id`, + data: [ + { + id: TEST_TARGET_OBJECT_RECORD_ID_FIELD_VALUE, + }, + ], + }), + ); + return { objectMetadataId, targetObjectMetadataId,