From 3ef99c287e0f5e932887f1df4fe1e305c80a2113 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 8 Nov 2022 10:40:19 +0100 Subject: [PATCH] :recycle: Refactor tests directory structure --- .circleci/config.yml | 12 +++++----- backend/dev/user.clj | 2 +- ..._handling.clj => bounce_handling_test.clj} | 4 ++-- ...ail_sending.clj => email_sending_test.clj} | 4 ++-- .../{test_helpers.clj => helpers.clj} | 4 ++-- .../{test_rpc_file.clj => rpc_file_test.clj} | 6 ++--- .../{test_rpc_font.clj => rpc_font_test.clj} | 8 +++---- ...management.clj => rpc_management_test.clj} | 6 ++--- ...{test_rpc_media.clj => rpc_media_test.clj} | 8 +++---- ...t_rpc_profile.clj => rpc_profile_test.clj} | 6 ++--- ...t_rpc_project.clj => rpc_project_test.clj} | 4 ++-- .../{test_rpc_team.clj => rpc_team_test.clj} | 4 ++-- ...est_rpc_viewer.clj => rpc_viewer_test.clj} | 4 ++-- .../{test_storage.clj => storage_test.clj} | 12 +++++----- ...etry_task.clj => tasks_telemetry_test.clj} | 4 ++-- .../backend_tests/test_files/template.penpot | Bin 0 -> 8815 bytes ...ects_map.clj => util_objects_map_test.clj} | 4 ++-- ...nter_map.clj => util_pointer_map_test.clj} | 4 ++-- common/shadow-cljs.edn | 2 +- .../{test_data.cljc => data_test.cljc} | 2 +- ...geom_shapes.cljc => geom_shapes_test.cljc} | 2 +- .../{test_geom.cljc => geom_test.cljc} | 2 +- .../{test_helpers => helpers}/components.cljc | 2 +- .../{test_helpers => helpers}/files.cljc | 2 +- ...s_helpers.cljc => pages_helpers_test.cljc} | 2 +- ...ations.cljc => pages_migrations_test.cljc} | 2 +- .../{test_pages.cljc => pages_test.cljc} | 2 +- .../test/common_tests/setup.cljs | 4 ++-- common/test/common_tests/test_setup.cljc | 10 -------- .../{test_text.cljc => text_test.cljc} | 2 +- ...t_types_file.cljc => types_file_test.cljc} | 6 ++--- ...ljc => types_shape_interactions_test.cljc} | 2 +- .../{test_types.cljc => types_test.cljc} | 2 +- .../{test_uuid.cljc => uuid_test.cljc} | 2 +- frontend/shadow-cljs.edn | 2 +- .../helpers}/events.cljs | 14 +++++++---- .../helpers}/libraries.cljs | 16 +++++++++---- .../helpers}/pages.cljs | 20 ++++++++++------ .../helpers_shapes_test.cljs} | 14 +++++++---- frontend/test/frontend_tests/setup.cljs | 22 ++++++++++++++++++ .../state_components_sync_test.cljs} | 16 +++++++++---- .../state_components_test.cljs} | 8 +++---- .../util_range_tree_test.cljs} | 14 +++++++---- .../util_simple_math_test.cljs} | 8 ++++++- .../util_snap_data_test.cljs} | 10 ++++---- 45 files changed, 170 insertions(+), 116 deletions(-) rename backend/test/backend_tests/{test_bounce_handling.clj => bounce_handling_test.clj} (99%) rename backend/test/backend_tests/{test_email_sending.clj => email_sending_test.clj} (90%) rename backend/test/backend_tests/{test_helpers.clj => helpers.clj} (99%) rename backend/test/backend_tests/{test_rpc_file.clj => rpc_file_test.clj} (99%) rename backend/test/backend_tests/{test_rpc_font.clj => rpc_font_test.clj} (92%) rename backend/test/backend_tests/{test_rpc_management.clj => rpc_management_test.clj} (99%) rename backend/test/backend_tests/{test_rpc_media.clj => rpc_media_test.clj} (96%) rename backend/test/backend_tests/{test_rpc_profile.clj => rpc_profile_test.clj} (99%) rename backend/test/backend_tests/{test_rpc_project.clj => rpc_project_test.clj} (99%) rename backend/test/backend_tests/{test_rpc_team.clj => rpc_team_test.clj} (99%) rename backend/test/backend_tests/{test_rpc_viewer.clj => rpc_viewer_test.clj} (98%) rename backend/test/backend_tests/{test_storage.clj => storage_test.clj} (97%) rename backend/test/backend_tests/{test_telemetry_task.clj => tasks_telemetry_test.clj} (96%) create mode 100644 backend/test/backend_tests/test_files/template.penpot rename backend/test/backend_tests/{test_util_objects_map.clj => util_objects_map_test.clj} (98%) rename backend/test/backend_tests/{test_util_pointer_map.clj => util_pointer_map_test.clj} (98%) rename common/test/common_tests/{test_data.cljc => data_test.cljc} (98%) rename common/test/common_tests/{test_geom_shapes.cljc => geom_shapes_test.cljc} (99%) rename common/test/common_tests/{test_geom.cljc => geom_test.cljc} (99%) rename common/test/common_tests/{test_helpers => helpers}/components.cljc (99%) rename common/test/common_tests/{test_helpers => helpers}/files.cljc (99%) rename common/test/common_tests/{test_pages_helpers.cljc => pages_helpers_test.cljc} (97%) rename common/test/common_tests/{test_pages_migrations.cljc => pages_migrations_test.cljc} (98%) rename common/test/common_tests/{test_pages.cljc => pages_test.cljc} (99%) rename frontend/test/app/init_test.cljs => common/test/common_tests/setup.cljs (73%) delete mode 100644 common/test/common_tests/test_setup.cljc rename common/test/common_tests/{test_text.cljc => text_test.cljc} (97%) rename common/test/common_tests/{test_types_file.cljc => types_file_test.cljc} (98%) rename common/test/common_tests/{test_types_shape_interactions.cljc => types_shape_interactions_test.cljc} (99%) rename common/test/common_tests/{test_types.cljc => types_test.cljc} (98%) rename common/test/common_tests/{test_uuid.cljc => uuid_test.cljc} (96%) rename frontend/test/{app/test_helpers => frontend_tests/helpers}/events.cljs (87%) rename frontend/test/{app/test_helpers => frontend_tests/helpers}/libraries.cljs (93%) rename frontend/test/{app/test_helpers => frontend_tests/helpers}/pages.cljs (93%) rename frontend/test/{app/shapes_test.cljs => frontend_tests/helpers_shapes_test.cljs} (77%) create mode 100644 frontend/test/frontend_tests/setup.cljs rename frontend/test/{app/components_sync_test.cljs => frontend_tests/state_components_sync_test.cljs} (99%) rename frontend/test/{app/components_basic_test.cljs => frontend_tests/state_components_test.cljs} (99%) rename frontend/test/{app/util/range_tree_test.cljs => frontend_tests/util_range_tree_test.cljs} (95%) rename frontend/test/{app/util/simple_math_test.cljs => frontend_tests/util_simple_math_test.cljs} (91%) rename frontend/test/{app/util/snap_data_test.cljs => frontend_tests/util_snap_data_test.cljs} (99%) diff --git a/.circleci/config.yml b/.circleci/config.yml index f044e17803..4d219ba911 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -62,19 +62,19 @@ jobs: name: common tests command: | yarn install - yarn run compile-test - node target/test.js - clojure -X:dev:test :patterns '["common-tests.test-.*"]' + yarn test + clojure -X:dev:test :patterns '["common-tests.*-test"]' environment: PATH: /usr/local/nodejs/bin/:/usr/local/bin:/bin:/usr/bin JVM_OPTS: -Xmx4g + NODE_OPTIONS: --max-old-space-size=4096 - run: name: backend test working_directory: "./backend" command: | - clojure -X:dev:test :patterns '["app-tests.test-.*"]' + clojure -X:dev:test :patterns '["backend-tests.*-test"]' environment: PENPOT_TEST_DATABASE_URI: "postgresql://localhost/penpot_test" @@ -88,11 +88,11 @@ jobs: working_directory: "./frontend" command: | yarn install - clojure -M:dev:shadow-cljs compile test - node target/tests.js + yarn test environment: PATH: /usr/local/nodejs/bin/:/usr/local/bin:/bin:/usr/bin + NODE_OPTIONS: --max-old-space-size=4096 - save_cache: paths: diff --git a/backend/dev/user.clj b/backend/dev/user.clj index a0cff02752..dce35764b6 100644 --- a/backend/dev/user.clj +++ b/backend/dev/user.clj @@ -63,7 +63,7 @@ ;; --- Development Stuff (defn- run-tests - ([] (run-tests #"^backend-tests.test-.*$")) + ([] (run-tests #"^backend-tests.*-test$")) ([o] (repl/refresh) (cond diff --git a/backend/test/backend_tests/test_bounce_handling.clj b/backend/test/backend_tests/bounce_handling_test.clj similarity index 99% rename from backend/test/backend_tests/test_bounce_handling.clj rename to backend/test/backend_tests/bounce_handling_test.clj index a85616ffed..2938ecc9f1 100644 --- a/backend/test/backend_tests/test_bounce_handling.clj +++ b/backend/test/backend_tests/bounce_handling_test.clj @@ -4,9 +4,9 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns backend-tests.test-bounce-handling +(ns backend-tests.bounce-handling-test (:require - [backend-tests.test-helpers :as th] + [backend-tests.helpers :as th] [app.db :as db] [app.emails :as emails] [app.http.awsns :as awsns] diff --git a/backend/test/backend_tests/test_email_sending.clj b/backend/test/backend_tests/email_sending_test.clj similarity index 90% rename from backend/test/backend_tests/test_email_sending.clj rename to backend/test/backend_tests/email_sending_test.clj index 685d657791..49802dd9e7 100644 --- a/backend/test/backend_tests/test_email_sending.clj +++ b/backend/test/backend_tests/email_sending_test.clj @@ -4,9 +4,9 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns backend-tests.test-email-sending +(ns backend-tests.email-sending-test (:require - [backend-tests.test-helpers :as th] + [backend-tests.helpers :as th] [app.db :as db] [app.emails :as emails] [clojure.test :as t] diff --git a/backend/test/backend_tests/test_helpers.clj b/backend/test/backend_tests/helpers.clj similarity index 99% rename from backend/test/backend_tests/test_helpers.clj rename to backend/test/backend_tests/helpers.clj index 01948bcb99..75b3a3eb8f 100644 --- a/backend/test/backend_tests/test_helpers.clj +++ b/backend/test/backend_tests/helpers.clj @@ -4,7 +4,7 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns backend-tests.test-helpers +(ns backend-tests.helpers (:require [app.common.data :as d] [app.common.flags :as flags] @@ -65,7 +65,7 @@ :name "test" :file-uri "test" :thumbnail-uri "test" - :path (-> "app_tests/test_files/template.penpot" io/resource fs/path)}] + :path (-> "backend_tests/test_files/template.penpot" io/resource fs/path)}] system (-> (merge main/system-config main/worker-config) (assoc-in [:app.redis/redis :uri] (:redis-uri config)) (assoc-in [:app.db/pool :uri] (:database-uri config)) diff --git a/backend/test/backend_tests/test_rpc_file.clj b/backend/test/backend_tests/rpc_file_test.clj similarity index 99% rename from backend/test/backend_tests/test_rpc_file.clj rename to backend/test/backend_tests/rpc_file_test.clj index 15fc74fc81..6f7562b542 100644 --- a/backend/test/backend_tests/test_rpc_file.clj +++ b/backend/test/backend_tests/rpc_file_test.clj @@ -4,9 +4,9 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns backend-tests.test-rpc-file +(ns backend-tests.rpc-file-test (:require - [backend-tests.test-helpers :as th] + [backend-tests.helpers :as th] [app.common.uuid :as uuid] [app.db :as db] [app.db.sql :as sql] @@ -124,7 +124,7 @@ (t/deftest file-gc-task (letfn [(create-file-media-object [{:keys [profile-id file-id]}] (let [mfile {:filename "sample.jpg" - :path (th/tempfile "app_tests/test_files/sample.jpg") + :path (th/tempfile "backend_tests/test_files/sample.jpg") :mtype "image/jpeg" :size 312043} params {::th/type :upload-file-media-object diff --git a/backend/test/backend_tests/test_rpc_font.clj b/backend/test/backend_tests/rpc_font_test.clj similarity index 92% rename from backend/test/backend_tests/test_rpc_font.clj rename to backend/test/backend_tests/rpc_font_test.clj index f6c6c75d27..6116b8d8aa 100644 --- a/backend/test/backend_tests/test_rpc_font.clj +++ b/backend/test/backend_tests/rpc_font_test.clj @@ -4,9 +4,9 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns backend-tests.test-rpc-font +(ns backend-tests.rpc-font-test (:require - [backend-tests.test-helpers :as th] + [backend-tests.helpers :as th] [app.common.uuid :as uuid] [app.db :as db] [app.http :as http] @@ -24,7 +24,7 @@ proj-id (:default-project-id prof) font-id (uuid/custom 10 1) - ttfdata (-> (io/resource "app_tests/test_files/font-1.ttf") + ttfdata (-> (io/resource "backend_tests/test_files/font-1.ttf") io/input-stream io/read-as-bytes) @@ -59,7 +59,7 @@ proj-id (:default-project-id prof) font-id (uuid/custom 10 1) - data (-> (io/resource "app_tests/test_files/font-1.woff") + data (-> (io/resource "backend_tests/test_files/font-1.woff") io/input-stream io/read-as-bytes) diff --git a/backend/test/backend_tests/test_rpc_management.clj b/backend/test/backend_tests/rpc_management_test.clj similarity index 99% rename from backend/test/backend_tests/test_rpc_management.clj rename to backend/test/backend_tests/rpc_management_test.clj index 9c68bd94c2..c1f03838d9 100644 --- a/backend/test/backend_tests/test_rpc_management.clj +++ b/backend/test/backend_tests/rpc_management_test.clj @@ -4,10 +4,10 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns backend-tests.test-rpc-management +(ns backend-tests.rpc-management-test (:require - [backend-tests.test-storage :refer [configure-storage-backend]] - [backend-tests.test-helpers :as th] + [backend-tests.storage-test :refer [configure-storage-backend]] + [backend-tests.helpers :as th] [app.common.uuid :as uuid] [app.db :as db] [app.http :as http] diff --git a/backend/test/backend_tests/test_rpc_media.clj b/backend/test/backend_tests/rpc_media_test.clj similarity index 96% rename from backend/test/backend_tests/test_rpc_media.clj rename to backend/test/backend_tests/rpc_media_test.clj index dbe3fe68ec..5fb6f99051 100644 --- a/backend/test/backend_tests/test_rpc_media.clj +++ b/backend/test/backend_tests/rpc_media_test.clj @@ -4,9 +4,9 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns backend-tests.test-rpc-media +(ns backend-tests.rpc-media-test (:require - [backend-tests.test-helpers :as th] + [backend-tests.helpers :as th] [app.common.uuid :as uuid] [app.db :as db] [app.storage :as sto] @@ -60,7 +60,7 @@ :project-id (:default-project-id prof) :is-shared false}) mfile {:filename "sample.jpg" - :path (th/tempfile "app_tests/test_files/sample.jpg") + :path (th/tempfile "backend_tests/test_files/sample.jpg") :mtype "image/jpeg" :size 312043} @@ -99,7 +99,7 @@ :project-id (:default-project-id prof) :is-shared false}) mfile {:filename "sample.jpg" - :path (th/tempfile "app_tests/test_files/sample.jpg") + :path (th/tempfile "backend_tests/test_files/sample.jpg") :mtype "image/jpeg" :size 312043} diff --git a/backend/test/backend_tests/test_rpc_profile.clj b/backend/test/backend_tests/rpc_profile_test.clj similarity index 99% rename from backend/test/backend_tests/test_rpc_profile.clj rename to backend/test/backend_tests/rpc_profile_test.clj index 8e89029925..1c97a904b5 100644 --- a/backend/test/backend_tests/test_rpc_profile.clj +++ b/backend/test/backend_tests/rpc_profile_test.clj @@ -4,9 +4,9 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns backend-tests.test-rpc-profile +(ns backend-tests.rpc-profile-test (:require - [backend-tests.test-helpers :as th] + [backend-tests.helpers :as th] [app.common.uuid :as uuid] [app.config :as cf] [app.db :as db] @@ -110,7 +110,7 @@ :profile-id (:id profile) :file {:filename "sample.jpg" :size 123123 - :path (th/tempfile "app_tests/test_files/sample.jpg") + :path (th/tempfile "backend_tests/test_files/sample.jpg") :mtype "image/jpeg"}} out (th/mutation! data)] diff --git a/backend/test/backend_tests/test_rpc_project.clj b/backend/test/backend_tests/rpc_project_test.clj similarity index 99% rename from backend/test/backend_tests/test_rpc_project.clj rename to backend/test/backend_tests/rpc_project_test.clj index a8e4286d80..24c745a836 100644 --- a/backend/test/backend_tests/test_rpc_project.clj +++ b/backend/test/backend_tests/rpc_project_test.clj @@ -4,9 +4,9 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns backend-tests.test-rpc-project +(ns backend-tests.rpc-project-test (:require - [backend-tests.test-helpers :as th] + [backend-tests.helpers :as th] [app.common.uuid :as uuid] [app.db :as db] [app.http :as http] diff --git a/backend/test/backend_tests/test_rpc_team.clj b/backend/test/backend_tests/rpc_team_test.clj similarity index 99% rename from backend/test/backend_tests/test_rpc_team.clj rename to backend/test/backend_tests/rpc_team_test.clj index 23dedbe88f..302f80dc50 100644 --- a/backend/test/backend_tests/test_rpc_team.clj +++ b/backend/test/backend_tests/rpc_team_test.clj @@ -4,9 +4,9 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns backend-tests.test-rpc-team +(ns backend-tests.rpc-team-test (:require - [backend-tests.test-helpers :as th] + [backend-tests.helpers :as th] [app.common.uuid :as uuid] [app.db :as db] [app.http :as http] diff --git a/backend/test/backend_tests/test_rpc_viewer.clj b/backend/test/backend_tests/rpc_viewer_test.clj similarity index 98% rename from backend/test/backend_tests/test_rpc_viewer.clj rename to backend/test/backend_tests/rpc_viewer_test.clj index e09ba7846f..baaa416edb 100644 --- a/backend/test/backend_tests/test_rpc_viewer.clj +++ b/backend/test/backend_tests/rpc_viewer_test.clj @@ -4,9 +4,9 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns backend-tests.test-rpc-viewer +(ns backend-tests.rpc-viewer-test (:require - [backend-tests.test-helpers :as th] + [backend-tests.helpers :as th] [app.common.uuid :as uuid] [app.db :as db] [clojure.test :as t] diff --git a/backend/test/backend_tests/test_storage.clj b/backend/test/backend_tests/storage_test.clj similarity index 97% rename from backend/test/backend_tests/test_storage.clj rename to backend/test/backend_tests/storage_test.clj index af5cd7f621..b47e98b096 100644 --- a/backend/test/backend_tests/test_storage.clj +++ b/backend/test/backend_tests/storage_test.clj @@ -4,9 +4,9 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns backend-tests.test-storage +(ns backend-tests.storage-test (:require - [backend-tests.test-helpers :as th] + [backend-tests.helpers :as th] [app.common.exceptions :as ex] [app.common.uuid :as uuid] [app.db :as db] @@ -126,7 +126,7 @@ :is-shared false}) mfile {:filename "sample.jpg" - :path (th/tempfile "app_tests/test_files/sample.jpg") + :path (th/tempfile "backend_tests/test_files/sample.jpg") :mtype "image/jpeg" :size 312043} @@ -196,12 +196,12 @@ :project-id proj-id :is-shared false}) - ttfdata (-> (io/resource "app_tests/test_files/font-1.ttf") + ttfdata (-> (io/resource "backend_tests/test_files/font-1.ttf") io/input-stream io/read-as-bytes) mfile {:filename "sample.jpg" - :path (th/tempfile "app_tests/test_files/sample.jpg") + :path (th/tempfile "backend_tests/test_files/sample.jpg") :mtype "image/jpeg" :size 312043} @@ -267,7 +267,7 @@ :project-id (:default-project-id prof) :is-shared false}) mfile {:filename "sample.jpg" - :path (th/tempfile "app_tests/test_files/sample.jpg") + :path (th/tempfile "backend_tests/test_files/sample.jpg") :mtype "image/jpeg" :size 312043} diff --git a/backend/test/backend_tests/test_telemetry_task.clj b/backend/test/backend_tests/tasks_telemetry_test.clj similarity index 96% rename from backend/test/backend_tests/test_telemetry_task.clj rename to backend/test/backend_tests/tasks_telemetry_test.clj index f1b177467b..7ff727b8bc 100644 --- a/backend/test/backend_tests/test_telemetry_task.clj +++ b/backend/test/backend_tests/tasks_telemetry_test.clj @@ -4,9 +4,9 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns backend-tests.test-telemetry-task +(ns backend-tests.tasks-telemetry-test (:require - [backend-tests.test-helpers :as th] + [backend-tests.helpers :as th] [app.db :as db] [app.emails :as emails] [app.util.time :as dt] diff --git a/backend/test/backend_tests/test_files/template.penpot b/backend/test/backend_tests/test_files/template.penpot new file mode 100644 index 0000000000000000000000000000000000000000..e0c81bb83ef474a9e190d2f99a335e58422ae9e0 GIT binary patch literal 8815 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