From 046eb2c5ffd78ec913430e225943a8e33f502b6d Mon Sep 17 00:00:00 2001 From: Nathan_akin <85641756+akintewe@users.noreply.github.com> Date: Thu, 23 Jan 2025 22:52:20 +0100 Subject: [PATCH 1/6] Backend] Implement Karate tests for apartment_images table --- docker-compose-test.yml | 2 + .../default/1_create_apartment_images/up.sql | 10 + migrations/default/1_create_apartments/up.sql | 12 + .../default/2_create_apartment_images/up.sql | 8 + migrations/default/3_insert_test_data/up.sql | 2 + .../apartments/apartment_images.feature | 225 ++++++++++++++++++ .../tables/public_apartment_images.yaml | 32 +++ .../databases/default/tables/tables.yaml | 51 ++++ .../default/tables/track_tables.yaml | 9 + 9 files changed, 351 insertions(+) create mode 100644 migrations/default/1_create_apartment_images/up.sql create mode 100644 migrations/default/1_create_apartments/up.sql create mode 100644 migrations/default/2_create_apartment_images/up.sql create mode 100644 migrations/default/3_insert_test_data/up.sql create mode 100644 tests/karate/features/apartments/apartment_images.feature create mode 100644 tests/metadata/databases/default/tables/public_apartment_images.yaml create mode 100644 tests/metadata/databases/default/tables/tables.yaml create mode 100644 tests/metadata/databases/default/tables/track_tables.yaml diff --git a/docker-compose-test.yml b/docker-compose-test.yml index 922ac38..fe04351 100644 --- a/docker-compose-test.yml +++ b/docker-compose-test.yml @@ -13,6 +13,8 @@ services: interval: 5s timeout: 5s retries: 5 + volumes: + - ./migrations:/docker-entrypoint-initdb.d/migrations graphql-engine-test: image: hasura/graphql-engine:latest diff --git a/migrations/default/1_create_apartment_images/up.sql b/migrations/default/1_create_apartment_images/up.sql new file mode 100644 index 0000000..2e58d15 --- /dev/null +++ b/migrations/default/1_create_apartment_images/up.sql @@ -0,0 +1,10 @@ +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; + +CREATE TABLE apartment_images ( + id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), + apartment_id UUID NOT NULL REFERENCES apartments(id) ON DELETE CASCADE, + image_url TEXT NOT NULL, + uploaded_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP +); + +CREATE INDEX idx_apartment_images_apartment_id ON apartment_images(apartment_id); \ No newline at end of file diff --git a/migrations/default/1_create_apartments/up.sql b/migrations/default/1_create_apartments/up.sql new file mode 100644 index 0000000..a6a7463 --- /dev/null +++ b/migrations/default/1_create_apartments/up.sql @@ -0,0 +1,12 @@ +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; + +CREATE TABLE apartments ( + id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), + name TEXT NOT NULL, + description TEXT, + created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP +); + +-- Insert a test apartment +INSERT INTO apartments (id, name, description) VALUES +('11111111-1111-1111-1111-111111111111', 'Modern Loft in Heredia', 'A beautiful modern loft'); \ No newline at end of file diff --git a/migrations/default/2_create_apartment_images/up.sql b/migrations/default/2_create_apartment_images/up.sql new file mode 100644 index 0000000..0333758 --- /dev/null +++ b/migrations/default/2_create_apartment_images/up.sql @@ -0,0 +1,8 @@ +CREATE TABLE apartment_images ( + id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), + apartment_id UUID NOT NULL REFERENCES apartments(id) ON DELETE CASCADE, + image_url TEXT NOT NULL, + uploaded_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP +); + +CREATE INDEX idx_apartment_images_apartment_id ON apartment_images(apartment_id); \ No newline at end of file diff --git a/migrations/default/3_insert_test_data/up.sql b/migrations/default/3_insert_test_data/up.sql new file mode 100644 index 0000000..1c2e373 --- /dev/null +++ b/migrations/default/3_insert_test_data/up.sql @@ -0,0 +1,2 @@ +INSERT INTO apartment_images (id, apartment_id, image_url) VALUES +('11111111-1111-1111-1111-111111111111', '11111111-1111-1111-1111-111111111111', 'https://example.com/test-image.jpg'); \ No newline at end of file diff --git a/tests/karate/features/apartments/apartment_images.feature b/tests/karate/features/apartments/apartment_images.feature new file mode 100644 index 0000000..be8a00e --- /dev/null +++ b/tests/karate/features/apartments/apartment_images.feature @@ -0,0 +1,225 @@ +Feature: Apartment Images Management + +Background: + * url baseUrl + * print '=== Loading feature file ===' + * print 'URL set to:', baseUrl + * header x-hasura-admin-secret = adminSecret + +Scenario: Check GraphQL endpoint health + Given path '/' + And request { query: "query { __typename }" } + When method POST + Then status 200 + And match response == { data: { __typename: 'query_root' } } + +Scenario: Check apartment_images schema + Given path '/' + And request + """ + { + "query": "query { __type(name: \"apartment_images\") { name fields { name type { name kind } } } }" + } + """ + When method POST + Then status 200 + And match response.errors == '#notpresent' + * print 'Schema:', response.data.__type + +Scenario: Create new apartment image + Given path '/' + And request + """ + { + "query": "mutation($apartment_id: uuid!, $image_url: String!) { insert_apartment_images_one(object: { apartment_id: $apartment_id, image_url: $image_url }) { id } }", + "variables": { + "apartment_id": "11111111-1111-1111-1111-111111111111", + "image_url": "https://example.com/test-image.jpg" + } + } + """ + When method POST + Then status 200 + And match response.errors == '#notpresent' + * def created_id = response.data.insert_apartment_images_one.id + +Scenario: Verify apartment_images schema exists + Given path '/' + And request + """ + { + "query": "query { + __type(name: \"apartment_images\") { + name + fields { + name + type { + name + kind + } + } + } + }" + } + """ + When method POST + Then status 200 + And match response.data.__type != null + * print 'Schema:', response.data.__type + +Scenario: Verify mutations are available + Given path '/' + And request + """ + { + "query": "query { + __schema { + mutationType { + fields { + name + } + } + } + }" + } + """ + When method POST + Then status 200 + And match response.data.__schema.mutationType != null + * print 'Available mutations:', response.data.__schema.mutationType.fields + +Scenario: Verify query permissions + Given path '/' + And request + """ + { + "query": "query { + __schema { + queryType { + fields { + name + description + } + } + } + }" + } + """ + When method POST + Then status 200 + And match response.data.__schema.queryType != null + * print 'Available queries:', response.data.__schema.queryType.fields + +Scenario: Verify apartment_images table exists + Given path '/' + And request + """ + { + "query": "query { + __type(name: \"apartment_images\") { + name + fields { + name + type { + name + kind + } + } + } + }" + } + """ + When method POST + Then status 200 + And match response.errors == '#notpresent' + * print 'Schema:', response.data.__type + +Scenario: Query apartment image by ID + Given path '/' + And request + """ + { + "query": "query GetApartmentImage($id: uuid!) { + apartment_images_by_pk(id: $id) { + id + image_url + apartment_id + uploaded_at + } + }", + "variables": { + "id": "11111111-1111-1111-1111-111111111111" + } + } + """ + When method POST + Then status 200 + And match response.errors == '#notpresent' + And match response.data.apartment_images_by_pk != null + +Scenario: Update apartment image + Given path '/' + And request + """ + { + "query": "mutation UpdateApartmentImage($id: uuid!, $image_url: String!) { + update_apartment_images_by_pk( + pk_columns: {id: $id}, + _set: {image_url: $image_url} + ) { + id + image_url + uploaded_at + } + }", + "variables": { + "id": "11111111-1111-1111-1111-111111111111", + "image_url": "https://example.com/updated-image.jpg" + } + } + """ + When method POST + Then status 200 + And match response.errors == '#notpresent' + And match response.data.update_apartment_images_by_pk.image_url == 'https://example.com/updated-image.jpg' + +Scenario: List apartment images + Given path '/' + And request + """ + { + "query": "query ListApartmentImages { + apartment_images(limit: 10, order_by: {uploaded_at: desc}) { + id + image_url + apartment_id + uploaded_at + } + }" + } + """ + When method POST + Then status 200 + And match response.errors == '#notpresent' + And match response.data.apartment_images != null + And match response.data.apartment_images == '#[_ > 0]' + +Scenario: Delete apartment image + Given path '/' + And request + """ + { + "query": "mutation DeleteApartmentImage($id: uuid!) { + delete_apartment_images_by_pk(id: $id) { + id + } + }", + "variables": { + "id": "11111111-1111-1111-1111-111111111111" + } + } + """ + When method POST + Then status 200 + And match response.errors == '#notpresent' + And match response.data.delete_apartment_images_by_pk != null \ No newline at end of file diff --git a/tests/metadata/databases/default/tables/public_apartment_images.yaml b/tests/metadata/databases/default/tables/public_apartment_images.yaml new file mode 100644 index 0000000..75742f7 --- /dev/null +++ b/tests/metadata/databases/default/tables/public_apartment_images.yaml @@ -0,0 +1,32 @@ +table: + name: apartment_images + schema: public + +object_relationships: + - name: apartment + using: + foreign_key_constraint_on: apartment_id + +select_permissions: + - role: admin + permission: + columns: '*' + filter: {} + +insert_permissions: + - role: admin + permission: + check: {} + columns: '*' + +update_permissions: + - role: admin + permission: + columns: '*' + filter: {} + check: {} + +delete_permissions: + - role: admin + permission: + filter: {} \ No newline at end of file diff --git a/tests/metadata/databases/default/tables/tables.yaml b/tests/metadata/databases/default/tables/tables.yaml new file mode 100644 index 0000000..e6ba25f --- /dev/null +++ b/tests/metadata/databases/default/tables/tables.yaml @@ -0,0 +1,51 @@ +- table: + schema: public + name: apartments + select_permissions: + - role: admin + permission: + columns: '*' + filter: {} + insert_permissions: + - role: admin + permission: + check: {} + columns: '*' + update_permissions: + - role: admin + permission: + columns: '*' + filter: {} + check: {} + delete_permissions: + - role: admin + permission: + filter: {} + +- table: + schema: public + name: apartment_images + object_relationships: + - name: apartment + using: + foreign_key_constraint_on: apartment_id + select_permissions: + - role: admin + permission: + columns: '*' + filter: {} + insert_permissions: + - role: admin + permission: + check: {} + columns: '*' + update_permissions: + - role: admin + permission: + columns: '*' + filter: {} + check: {} + delete_permissions: + - role: admin + permission: + filter: {} \ No newline at end of file diff --git a/tests/metadata/databases/default/tables/track_tables.yaml b/tests/metadata/databases/default/tables/track_tables.yaml new file mode 100644 index 0000000..a417d8d --- /dev/null +++ b/tests/metadata/databases/default/tables/track_tables.yaml @@ -0,0 +1,9 @@ +- table: + name: apartments + schema: public + source: default + +- table: + name: apartment_images + schema: public + source: default \ No newline at end of file From aa484d0537741e6c7e286a701bc3711e60e42df2 Mon Sep 17 00:00:00 2001 From: Nathan_akin <85641756+akintewe@users.noreply.github.com> Date: Thu, 23 Jan 2025 22:58:48 +0100 Subject: [PATCH 2/6] feat(migrations): add test data for apartment_images --- migrations/default/1_create_apartments/up.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/migrations/default/1_create_apartments/up.sql b/migrations/default/1_create_apartments/up.sql index a6a7463..40e537d 100644 --- a/migrations/default/1_create_apartments/up.sql +++ b/migrations/default/1_create_apartments/up.sql @@ -7,6 +7,6 @@ CREATE TABLE apartments ( created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); --- Insert a test apartment + INSERT INTO apartments (id, name, description) VALUES ('11111111-1111-1111-1111-111111111111', 'Modern Loft in Heredia', 'A beautiful modern loft'); \ No newline at end of file From d6d475600ac68a928d6276d033d96ea005393a75 Mon Sep 17 00:00:00 2001 From: Nathan_akin <85641756+akintewe@users.noreply.github.com> Date: Sun, 26 Jan 2025 18:03:29 +0100 Subject: [PATCH 3/6] made modification and removed duplicate migration --- migrations/default/1_create_apartment_images/up.sql | 10 ---------- .../features/apartments/apartment_images.feature | 4 ++-- 2 files changed, 2 insertions(+), 12 deletions(-) delete mode 100644 migrations/default/1_create_apartment_images/up.sql diff --git a/migrations/default/1_create_apartment_images/up.sql b/migrations/default/1_create_apartment_images/up.sql deleted file mode 100644 index 2e58d15..0000000 --- a/migrations/default/1_create_apartment_images/up.sql +++ /dev/null @@ -1,10 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; - -CREATE TABLE apartment_images ( - id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), - apartment_id UUID NOT NULL REFERENCES apartments(id) ON DELETE CASCADE, - image_url TEXT NOT NULL, - uploaded_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP -); - -CREATE INDEX idx_apartment_images_apartment_id ON apartment_images(apartment_id); \ No newline at end of file diff --git a/tests/karate/features/apartments/apartment_images.feature b/tests/karate/features/apartments/apartment_images.feature index be8a00e..c9cf453 100644 --- a/tests/karate/features/apartments/apartment_images.feature +++ b/tests/karate/features/apartments/apartment_images.feature @@ -39,7 +39,7 @@ Scenario: Create new apartment image } """ When method POST - Then status 200 + Then status 201 And match response.errors == '#notpresent' * def created_id = response.data.insert_apartment_images_one.id @@ -220,6 +220,6 @@ Scenario: Delete apartment image } """ When method POST - Then status 200 + Then status 204 And match response.errors == '#notpresent' And match response.data.delete_apartment_images_by_pk != null \ No newline at end of file From 538a8d1432d1d03aff56218162e7a1ee1f227078 Mon Sep 17 00:00:00 2001 From: Nathan_akin <85641756+akintewe@users.noreply.github.com> Date: Mon, 27 Jan 2025 22:44:42 +0100 Subject: [PATCH 4/6] made changes --- migrations/default/1_create_apartments/up.sql | 12 ------------ migrations/default/2_create_apartment_images/up.sql | 8 -------- .../safetrust/1734473134981_test_data/down.sql | 2 ++ .../1734473134981_test_data}/up.sql | 3 +++ 4 files changed, 5 insertions(+), 20 deletions(-) delete mode 100644 migrations/default/1_create_apartments/up.sql delete mode 100644 migrations/default/2_create_apartment_images/up.sql create mode 100644 migrations/safetrust/1734473134981_test_data/down.sql rename migrations/{default/3_insert_test_data => safetrust/1734473134981_test_data}/up.sql (55%) diff --git a/migrations/default/1_create_apartments/up.sql b/migrations/default/1_create_apartments/up.sql deleted file mode 100644 index 40e537d..0000000 --- a/migrations/default/1_create_apartments/up.sql +++ /dev/null @@ -1,12 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; - -CREATE TABLE apartments ( - id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), - name TEXT NOT NULL, - description TEXT, - created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP -); - - -INSERT INTO apartments (id, name, description) VALUES -('11111111-1111-1111-1111-111111111111', 'Modern Loft in Heredia', 'A beautiful modern loft'); \ No newline at end of file diff --git a/migrations/default/2_create_apartment_images/up.sql b/migrations/default/2_create_apartment_images/up.sql deleted file mode 100644 index 0333758..0000000 --- a/migrations/default/2_create_apartment_images/up.sql +++ /dev/null @@ -1,8 +0,0 @@ -CREATE TABLE apartment_images ( - id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), - apartment_id UUID NOT NULL REFERENCES apartments(id) ON DELETE CASCADE, - image_url TEXT NOT NULL, - uploaded_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP -); - -CREATE INDEX idx_apartment_images_apartment_id ON apartment_images(apartment_id); \ No newline at end of file diff --git a/migrations/safetrust/1734473134981_test_data/down.sql b/migrations/safetrust/1734473134981_test_data/down.sql new file mode 100644 index 0000000..1d23d56 --- /dev/null +++ b/migrations/safetrust/1734473134981_test_data/down.sql @@ -0,0 +1,2 @@ +DELETE FROM apartment_images WHERE id = '11111111-1111-1111-1111-111111111111'; +DELETE FROM apartments WHERE id = '11111111-1111-1111-1111-111111111111'; \ No newline at end of file diff --git a/migrations/default/3_insert_test_data/up.sql b/migrations/safetrust/1734473134981_test_data/up.sql similarity index 55% rename from migrations/default/3_insert_test_data/up.sql rename to migrations/safetrust/1734473134981_test_data/up.sql index 1c2e373..a4c8565 100644 --- a/migrations/default/3_insert_test_data/up.sql +++ b/migrations/safetrust/1734473134981_test_data/up.sql @@ -1,2 +1,5 @@ +INSERT INTO apartments (id, name, description) VALUES +('11111111-1111-1111-1111-111111111111', 'Modern Loft in Heredia', 'A beautiful modern loft'); + INSERT INTO apartment_images (id, apartment_id, image_url) VALUES ('11111111-1111-1111-1111-111111111111', '11111111-1111-1111-1111-111111111111', 'https://example.com/test-image.jpg'); \ No newline at end of file From b93a2deb285d8e60b9dc6ac41b321a5586164a70 Mon Sep 17 00:00:00 2001 From: Nathan_akin <85641756+akintewe@users.noreply.github.com> Date: Tue, 28 Jan 2025 18:57:13 +0100 Subject: [PATCH 5/6] removed migration --- migrations/safetrust/1734473134981_test_data/down.sql | 2 -- migrations/safetrust/1734473134981_test_data/up.sql | 5 ----- 2 files changed, 7 deletions(-) delete mode 100644 migrations/safetrust/1734473134981_test_data/down.sql delete mode 100644 migrations/safetrust/1734473134981_test_data/up.sql diff --git a/migrations/safetrust/1734473134981_test_data/down.sql b/migrations/safetrust/1734473134981_test_data/down.sql deleted file mode 100644 index 1d23d56..0000000 --- a/migrations/safetrust/1734473134981_test_data/down.sql +++ /dev/null @@ -1,2 +0,0 @@ -DELETE FROM apartment_images WHERE id = '11111111-1111-1111-1111-111111111111'; -DELETE FROM apartments WHERE id = '11111111-1111-1111-1111-111111111111'; \ No newline at end of file diff --git a/migrations/safetrust/1734473134981_test_data/up.sql b/migrations/safetrust/1734473134981_test_data/up.sql deleted file mode 100644 index a4c8565..0000000 --- a/migrations/safetrust/1734473134981_test_data/up.sql +++ /dev/null @@ -1,5 +0,0 @@ -INSERT INTO apartments (id, name, description) VALUES -('11111111-1111-1111-1111-111111111111', 'Modern Loft in Heredia', 'A beautiful modern loft'); - -INSERT INTO apartment_images (id, apartment_id, image_url) VALUES -('11111111-1111-1111-1111-111111111111', '11111111-1111-1111-1111-111111111111', 'https://example.com/test-image.jpg'); \ No newline at end of file From 279d5385f72c0232ac68466406bcabc7d8975f5e Mon Sep 17 00:00:00 2001 From: Nathan_akin <85641756+akintewe@users.noreply.github.com> Date: Fri, 31 Jan 2025 08:54:45 +0100 Subject: [PATCH 6/6] moved to correct location --- .../tables/metadata_apartment_images.yaml | 0 .../databases/default/tables/tables.yaml | 51 ------------------- .../default/tables/track_tables.yaml | 9 ---- 3 files changed, 60 deletions(-) rename tests/metadata/databases/default/tables/public_apartment_images.yaml => metadata/databases/safetrust/tables/metadata_apartment_images.yaml (100%) delete mode 100644 tests/metadata/databases/default/tables/tables.yaml delete mode 100644 tests/metadata/databases/default/tables/track_tables.yaml diff --git a/tests/metadata/databases/default/tables/public_apartment_images.yaml b/metadata/databases/safetrust/tables/metadata_apartment_images.yaml similarity index 100% rename from tests/metadata/databases/default/tables/public_apartment_images.yaml rename to metadata/databases/safetrust/tables/metadata_apartment_images.yaml diff --git a/tests/metadata/databases/default/tables/tables.yaml b/tests/metadata/databases/default/tables/tables.yaml deleted file mode 100644 index e6ba25f..0000000 --- a/tests/metadata/databases/default/tables/tables.yaml +++ /dev/null @@ -1,51 +0,0 @@ -- table: - schema: public - name: apartments - select_permissions: - - role: admin - permission: - columns: '*' - filter: {} - insert_permissions: - - role: admin - permission: - check: {} - columns: '*' - update_permissions: - - role: admin - permission: - columns: '*' - filter: {} - check: {} - delete_permissions: - - role: admin - permission: - filter: {} - -- table: - schema: public - name: apartment_images - object_relationships: - - name: apartment - using: - foreign_key_constraint_on: apartment_id - select_permissions: - - role: admin - permission: - columns: '*' - filter: {} - insert_permissions: - - role: admin - permission: - check: {} - columns: '*' - update_permissions: - - role: admin - permission: - columns: '*' - filter: {} - check: {} - delete_permissions: - - role: admin - permission: - filter: {} \ No newline at end of file diff --git a/tests/metadata/databases/default/tables/track_tables.yaml b/tests/metadata/databases/default/tables/track_tables.yaml deleted file mode 100644 index a417d8d..0000000 --- a/tests/metadata/databases/default/tables/track_tables.yaml +++ /dev/null @@ -1,9 +0,0 @@ -- table: - name: apartments - schema: public - source: default - -- table: - name: apartment_images - schema: public - source: default \ No newline at end of file