Skip to content

Commit

Permalink
test: add tests for bulk upserts with surrogate keys
Browse files Browse the repository at this point in the history
  • Loading branch information
laurenceisla committed Nov 14, 2024
1 parent ce82668 commit 7d5e415
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 0 deletions.
50 changes: 50 additions & 0 deletions test/spec/Feature/Query/UpsertSpec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,32 @@ spec =
, matchHeaders = ["Preference-Applied" <:> "resolution=merge-duplicates, return=representation", matchContentTypeJson]
}

it "INSERTs and UPDATEs rows with SERIAL surrogate primary keys using Prefer: missing=default" $
request methodPost "/surr_serial_upsert?columns=id,name" [("Prefer", "return=representation"), ("Prefer", "resolution=merge-duplicates"), ("Prefer", "missing=default")]
[json| [
{ "id": 1, "name": "updated value" },
{ "name": "new value" }
]|] `shouldRespondWith` [json| [
{ "id": 1, "name": "updated value" },
{ "id": 3, "name": "new value" }
]|]
{ matchStatus = 201
, matchHeaders = ["Preference-Applied" <:> "resolution=merge-duplicates, missing=default, return=representation", matchContentTypeJson]
}

it "INSERTs and UPDATEs rows with GENERATED BY DEFAULT surrogate primary keys using Prefer: missing=default" $
request methodPost "/surr_gen_default_upsert?columns=id,name" [("Prefer", "return=representation"), ("Prefer", "resolution=merge-duplicates"), ("Prefer", "missing=default")]
[json| [
{ "id": 1, "name": "updated value" },
{ "name": "new value" }
]|] `shouldRespondWith` [json| [
{ "id": 1, "name": "updated value" },
{ "id": 3, "name": "new value" }
]|]
{ matchStatus = 201
, matchHeaders = ["Preference-Applied" <:> "resolution=merge-duplicates, missing=default, return=representation", matchContentTypeJson]
}

it "succeeds if the table has only PK cols and no other cols" $
request methodPost "/only_pk" [("Prefer", "return=representation"), ("Prefer", "resolution=merge-duplicates")]
[json|[ { "id": 1 }, { "id": 2 }, { "id": 4} ]|]
Expand Down Expand Up @@ -192,6 +218,30 @@ spec =
, matchHeaders = ["Preference-Applied" <:> "resolution=ignore-duplicates, return=representation"]
}

it "INSERTs and UPDATEs rows with SERIAL surrogate primary keys using Prefer: missing=default" $
request methodPost "/surr_serial_upsert?columns=id,name" [("Prefer", "return=representation"), ("Prefer", "resolution=ignore-duplicates"), ("Prefer", "missing=default")]
[json| [
{ "id": 1, "name": "updated value" },
{ "name": "new value" }
]|] `shouldRespondWith` [json| [
{ "id": 5, "name": "new value" }
]|]
{ matchStatus = 201
, matchHeaders = ["Preference-Applied" <:> "resolution=ignore-duplicates, missing=default, return=representation", matchContentTypeJson]
}

it "INSERTs and UPDATEs rows with GENERATED BY DEFAULT surrogate primary keys using Prefer: missing=default" $
request methodPost "/surr_gen_default_upsert?columns=id,name" [("Prefer", "return=representation"), ("Prefer", "resolution=ignore-duplicates"), ("Prefer", "missing=default")]
[json| [
{ "id": 1, "name": "updated value" },
{ "name": "new value" }
]|] `shouldRespondWith` [json| [
{ "id": 5, "name": "new value" }
]|]
{ matchStatus = 201
, matchHeaders = ["Preference-Applied" <:> "resolution=ignore-duplicates, missing=default, return=representation", matchContentTypeJson]
}

it "succeeds if the table has only PK cols and no other cols" $
request methodPost "/only_pk" [("Prefer", "return=representation"), ("Prefer", "resolution=ignore-duplicates")]
[json|[ { "id": 1 }, { "id": 2 }, { "id": 3} ]|]
Expand Down
6 changes: 6 additions & 0 deletions test/spec/fixtures/data.sql
Original file line number Diff line number Diff line change
Expand Up @@ -924,3 +924,9 @@ INSERT INTO process_supervisor VALUES (4, 1);
INSERT INTO process_supervisor VALUES (4, 2);
INSERT INTO process_supervisor VALUES (5, 3);
INSERT INTO process_supervisor VALUES (6, 3);

TRUNCATE TABLE surr_serial_upsert CASCADE;
INSERT INTO surr_serial_upsert(name) VALUES ('value');

TRUNCATE TABLE surr_gen_default_upsert CASCADE;
INSERT INTO surr_gen_default_upsert(name) VALUES ('value');
2 changes: 2 additions & 0 deletions test/spec/fixtures/privileges.sql
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ GRANT USAGE ON SEQUENCE
, items3_id_seq
, callcounter_count
, leak_id_seq
, surr_serial_upsert_id_seq
, surr_gen_default_upsert_id_seq
TO postgrest_test_anonymous;

GRANT USAGE ON SEQUENCE channels_id_seq TO postgrest_test_anonymous;
Expand Down
10 changes: 10 additions & 0 deletions test/spec/fixtures/schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -3782,3 +3782,13 @@ create table process_supervisor (
supervisor_id int references supervisors(id),
primary key (process_id, supervisor_id)
);

create table surr_serial_upsert (
id serial primary key,
name text
);

create table surr_gen_default_upsert (
id int generated by default as identity primary key,
name text
);

0 comments on commit 7d5e415

Please sign in to comment.