From 4b8581e3efd73be79b3b954234bc8ea73f2f991a Mon Sep 17 00:00:00 2001 From: Rijul Poudel Date: Fri, 10 Jul 2026 13:33:10 -0500 Subject: [PATCH 01/17] [test]: [test]: Backend unit test for Equal operator basic in QueryOps --- specifyweb/backend/stored_queries/tests/test_query_ops.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/specifyweb/backend/stored_queries/tests/test_query_ops.py b/specifyweb/backend/stored_queries/tests/test_query_ops.py index 3a06561386d..e4381af5f43 100644 --- a/specifyweb/backend/stored_queries/tests/test_query_ops.py +++ b/specifyweb/backend/stored_queries/tests/test_query_ops.py @@ -22,4 +22,7 @@ def test_op_like_underscore_wildcard(self): self.assert_op_sql(self.ops.op_like, "202_", '"catalogNumber" LIKE \'202_\'') def test_op_like_no_wildcard(self): - self.assert_op_sql(self.ops.op_like, "exact", '"catalogNumber" LIKE \'exact\'') \ No newline at end of file + self.assert_op_sql(self.ops.op_like, "exact", '"catalogNumber" LIKE \'exact\'') + + def test_op_equals_basic(self): + self.assert_op_sql(self.ops.op_equals, "test-value", '"catalogNumber" = \'test-value\'') \ No newline at end of file From fcaddb3530400406d03cfdf17e5a25ddab3110cc Mon Sep 17 00:00:00 2001 From: Rijul Poudel Date: Fri, 10 Jul 2026 13:36:08 -0500 Subject: [PATCH 02/17] [test]: [test]: Backend unit test for Equal operator with empty string --- specifyweb/backend/stored_queries/tests/test_query_ops.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/specifyweb/backend/stored_queries/tests/test_query_ops.py b/specifyweb/backend/stored_queries/tests/test_query_ops.py index e4381af5f43..cb456362822 100644 --- a/specifyweb/backend/stored_queries/tests/test_query_ops.py +++ b/specifyweb/backend/stored_queries/tests/test_query_ops.py @@ -25,4 +25,7 @@ def test_op_like_no_wildcard(self): self.assert_op_sql(self.ops.op_like, "exact", '"catalogNumber" LIKE \'exact\'') def test_op_equals_basic(self): - self.assert_op_sql(self.ops.op_equals, "test-value", '"catalogNumber" = \'test-value\'') \ No newline at end of file + self.assert_op_sql(self.ops.op_equals, "test-value", '"catalogNumber" = \'test-value\'') + + def test_op_equals_empty_string(self): + self.assert_op_sql(self.ops.op_equals, "", '"catalogNumber" = \'\'') From 0453cb3d002382afb44e9ae50c9692531d75af54 Mon Sep 17 00:00:00 2001 From: Rijul Poudel Date: Fri, 10 Jul 2026 13:36:59 -0500 Subject: [PATCH 03/17] [test]: [test]: Backend unit test for Equal operator with numbers as string --- specifyweb/backend/stored_queries/tests/test_query_ops.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/specifyweb/backend/stored_queries/tests/test_query_ops.py b/specifyweb/backend/stored_queries/tests/test_query_ops.py index cb456362822..bb4a0144a50 100644 --- a/specifyweb/backend/stored_queries/tests/test_query_ops.py +++ b/specifyweb/backend/stored_queries/tests/test_query_ops.py @@ -28,4 +28,7 @@ def test_op_equals_basic(self): self.assert_op_sql(self.ops.op_equals, "test-value", '"catalogNumber" = \'test-value\'') def test_op_equals_empty_string(self): - self.assert_op_sql(self.ops.op_equals, "", '"catalogNumber" = \'\'') + self.assert_op_sql(self.ops.op_equals, "", '"catalogNumber" = \'\'') # for empty strings + + def test_op_equals_number_string(self): + self.assert_op_sql(self.ops.op_equals, "123", '"catalogNumber" = \'123\'') # for numbers as string From a8c918fbe2144e8728c0a52207f8ff8f54e33c05 Mon Sep 17 00:00:00 2001 From: Rijul Poudel Date: Fri, 10 Jul 2026 13:48:54 -0500 Subject: [PATCH 04/17] [test]: [test]: Backend unit test for greater than operator(basic) --- specifyweb/backend/stored_queries/tests/test_query_ops.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/specifyweb/backend/stored_queries/tests/test_query_ops.py b/specifyweb/backend/stored_queries/tests/test_query_ops.py index bb4a0144a50..ce70903cd3a 100644 --- a/specifyweb/backend/stored_queries/tests/test_query_ops.py +++ b/specifyweb/backend/stored_queries/tests/test_query_ops.py @@ -32,3 +32,6 @@ def test_op_equals_empty_string(self): def test_op_equals_number_string(self): self.assert_op_sql(self.ops.op_equals, "123", '"catalogNumber" = \'123\'') # for numbers as string + + def test_op_greaterthan_basic(self): + self.assert_op_sql(self.ops.op_greaterthan, "100", '"catalogNumber" > \'100\'') From 4371dd1c63fe1e98b6dbe248b7cfb1de1d947d79 Mon Sep 17 00:00:00 2001 From: Rijul Poudel Date: Fri, 10 Jul 2026 13:49:20 -0500 Subject: [PATCH 05/17] [test]: [test]: Backend unit test for less than operator(basic) --- specifyweb/backend/stored_queries/tests/test_query_ops.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/specifyweb/backend/stored_queries/tests/test_query_ops.py b/specifyweb/backend/stored_queries/tests/test_query_ops.py index ce70903cd3a..147327e0187 100644 --- a/specifyweb/backend/stored_queries/tests/test_query_ops.py +++ b/specifyweb/backend/stored_queries/tests/test_query_ops.py @@ -35,3 +35,6 @@ def test_op_equals_number_string(self): def test_op_greaterthan_basic(self): self.assert_op_sql(self.ops.op_greaterthan, "100", '"catalogNumber" > \'100\'') + + def test_op_lessthan_basic(self): + self.assert_op_sql(self.ops.op_lessthan, "100", '"catalogNumber" < \'100\'') From 038f50c575950740a33a752f88ac99499380a99b Mon Sep 17 00:00:00 2001 From: Rijul Poudel Date: Fri, 10 Jul 2026 13:49:59 -0500 Subject: [PATCH 06/17] [test]: [test]: Backend unit test for greater than equals operator(basic) --- specifyweb/backend/stored_queries/tests/test_query_ops.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/specifyweb/backend/stored_queries/tests/test_query_ops.py b/specifyweb/backend/stored_queries/tests/test_query_ops.py index 147327e0187..91e8d070781 100644 --- a/specifyweb/backend/stored_queries/tests/test_query_ops.py +++ b/specifyweb/backend/stored_queries/tests/test_query_ops.py @@ -38,3 +38,6 @@ def test_op_greaterthan_basic(self): def test_op_lessthan_basic(self): self.assert_op_sql(self.ops.op_lessthan, "100", '"catalogNumber" < \'100\'') + + def test_op_greaterthanequals_basic(self): + self.assert_op_sql(self.ops.op_greaterthanequals, "100", '"catalogNumber" >= \'100\'') From ee7b386a6df1595456043741185d14751b407862 Mon Sep 17 00:00:00 2001 From: Rijul Poudel Date: Fri, 10 Jul 2026 13:50:23 -0500 Subject: [PATCH 07/17] [test]: [test]: Backend unit test for less than equals operator(basic) --- specifyweb/backend/stored_queries/tests/test_query_ops.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/specifyweb/backend/stored_queries/tests/test_query_ops.py b/specifyweb/backend/stored_queries/tests/test_query_ops.py index 91e8d070781..8d406eccdad 100644 --- a/specifyweb/backend/stored_queries/tests/test_query_ops.py +++ b/specifyweb/backend/stored_queries/tests/test_query_ops.py @@ -41,3 +41,6 @@ def test_op_lessthan_basic(self): def test_op_greaterthanequals_basic(self): self.assert_op_sql(self.ops.op_greaterthanequals, "100", '"catalogNumber" >= \'100\'') + + def test_op_lessthanequals_basic(self): + self.assert_op_sql(self.ops.op_lessthanequals, "100", '"catalogNumber" <= \'100\'') \ No newline at end of file From b543fda79e3858e7e57f7370bd082aa08e1bc951 Mon Sep 17 00:00:00 2001 From: Rijul Poudel Date: Fri, 10 Jul 2026 13:56:07 -0500 Subject: [PATCH 08/17] [test]: [test]: Backend unit test for between operator(basic) --- specifyweb/backend/stored_queries/tests/test_query_ops.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/specifyweb/backend/stored_queries/tests/test_query_ops.py b/specifyweb/backend/stored_queries/tests/test_query_ops.py index 8d406eccdad..d3086e8323f 100644 --- a/specifyweb/backend/stored_queries/tests/test_query_ops.py +++ b/specifyweb/backend/stored_queries/tests/test_query_ops.py @@ -43,4 +43,7 @@ def test_op_greaterthanequals_basic(self): self.assert_op_sql(self.ops.op_greaterthanequals, "100", '"catalogNumber" >= \'100\'') def test_op_lessthanequals_basic(self): - self.assert_op_sql(self.ops.op_lessthanequals, "100", '"catalogNumber" <= \'100\'') \ No newline at end of file + self.assert_op_sql(self.ops.op_lessthanequals, "100", '"catalogNumber" <= \'100\'') + + def test_op_between_basic(self): + self.assert_op_sql(self.ops.op_between, "10,20", '"catalogNumber" BETWEEN \'10\' AND \'20\'') From 2b47258c7292a4b0185735a839a3bdcc283b4d69 Mon Sep 17 00:00:00 2001 From: Rijul Poudel Date: Fri, 10 Jul 2026 13:56:36 -0500 Subject: [PATCH 09/17] [test]: [test]: Backend unit test for contains operator(basic) --- specifyweb/backend/stored_queries/tests/test_query_ops.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/specifyweb/backend/stored_queries/tests/test_query_ops.py b/specifyweb/backend/stored_queries/tests/test_query_ops.py index d3086e8323f..ade91e04b08 100644 --- a/specifyweb/backend/stored_queries/tests/test_query_ops.py +++ b/specifyweb/backend/stored_queries/tests/test_query_ops.py @@ -47,3 +47,8 @@ def test_op_lessthanequals_basic(self): def test_op_between_basic(self): self.assert_op_sql(self.ops.op_between, "10,20", '"catalogNumber" BETWEEN \'10\' AND \'20\'') + + def test_op_contains_basic(self): + self.assert_op_sql(self.ops.op_contains, "test", '"catalogNumber" LIKE \'%\' || \'test\' || \'%\'') + + \ No newline at end of file From 25086b47581c9fb0cee0989893e2f080978ff577 Mon Sep 17 00:00:00 2001 From: Rijul Poudel Date: Fri, 10 Jul 2026 13:57:26 -0500 Subject: [PATCH 10/17] [test]: [test]: Backend unit test for in operator(basic) --- specifyweb/backend/stored_queries/tests/test_query_ops.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/specifyweb/backend/stored_queries/tests/test_query_ops.py b/specifyweb/backend/stored_queries/tests/test_query_ops.py index ade91e04b08..f9c242b404f 100644 --- a/specifyweb/backend/stored_queries/tests/test_query_ops.py +++ b/specifyweb/backend/stored_queries/tests/test_query_ops.py @@ -51,4 +51,5 @@ def test_op_between_basic(self): def test_op_contains_basic(self): self.assert_op_sql(self.ops.op_contains, "test", '"catalogNumber" LIKE \'%\' || \'test\' || \'%\'') - \ No newline at end of file + def test_op_in_basic(self): + self.assert_op_sql(self.ops.op_in, "a,b", '"catalogNumber" IN (\'a\', \'b\')') From 22b27ff100e89e00330b1cf2d67c3d9255454280 Mon Sep 17 00:00:00 2001 From: Rijul Poudel Date: Fri, 10 Jul 2026 13:58:05 -0500 Subject: [PATCH 11/17] [test]: [test]: Backend unit test for startswith operator(basic) --- specifyweb/backend/stored_queries/tests/test_query_ops.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/specifyweb/backend/stored_queries/tests/test_query_ops.py b/specifyweb/backend/stored_queries/tests/test_query_ops.py index f9c242b404f..3d65657017b 100644 --- a/specifyweb/backend/stored_queries/tests/test_query_ops.py +++ b/specifyweb/backend/stored_queries/tests/test_query_ops.py @@ -53,3 +53,8 @@ def test_op_contains_basic(self): def test_op_in_basic(self): self.assert_op_sql(self.ops.op_in, "a,b", '"catalogNumber" IN (\'a\', \'b\')') + + def test_op_startswith_basic(self): + self.assert_op_sql(self.ops.op_startswith, "test", '"catalogNumber" LIKE \'test%\'') + + \ No newline at end of file From 5c1e522264657d3b39e5cf31b3b6ea4701994947 Mon Sep 17 00:00:00 2001 From: Rijul Poudel Date: Fri, 10 Jul 2026 13:58:31 -0500 Subject: [PATCH 12/17] [test]: [test]: Backend unit test for endswith operator(basic) --- specifyweb/backend/stored_queries/tests/test_query_ops.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/specifyweb/backend/stored_queries/tests/test_query_ops.py b/specifyweb/backend/stored_queries/tests/test_query_ops.py index 3d65657017b..9b5e2187a7b 100644 --- a/specifyweb/backend/stored_queries/tests/test_query_ops.py +++ b/specifyweb/backend/stored_queries/tests/test_query_ops.py @@ -57,4 +57,7 @@ def test_op_in_basic(self): def test_op_startswith_basic(self): self.assert_op_sql(self.ops.op_startswith, "test", '"catalogNumber" LIKE \'test%\'') + def test_op_endswith_basic(self): + self.assert_op_sql(self.ops.op_endswith, "test", '"catalogNumber" LIKE \'%test\'') + \ No newline at end of file From 62160e031cca7268e6393b87b90c78e5787bfe41 Mon Sep 17 00:00:00 2001 From: Rijul Poudel Date: Fri, 10 Jul 2026 13:58:55 -0500 Subject: [PATCH 13/17] [test]: [test]: Backend unit test for empty operator(basic) --- specifyweb/backend/stored_queries/tests/test_query_ops.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/specifyweb/backend/stored_queries/tests/test_query_ops.py b/specifyweb/backend/stored_queries/tests/test_query_ops.py index 9b5e2187a7b..470f2b009c3 100644 --- a/specifyweb/backend/stored_queries/tests/test_query_ops.py +++ b/specifyweb/backend/stored_queries/tests/test_query_ops.py @@ -60,4 +60,7 @@ def test_op_startswith_basic(self): def test_op_endswith_basic(self): self.assert_op_sql(self.ops.op_endswith, "test", '"catalogNumber" LIKE \'%test\'') + def test_op_empty_basic(self): + self.assert_op_sql(self.ops.op_empty, "", '"catalogNumber" IS NULL') + \ No newline at end of file From 923bc4ef143c2047a243cc1b83cb823f41dc17ac Mon Sep 17 00:00:00 2001 From: Rijul Poudel Date: Fri, 10 Jul 2026 13:59:21 -0500 Subject: [PATCH 14/17] [test]: [test]: Backend unit test for true operator(basic) --- specifyweb/backend/stored_queries/tests/test_query_ops.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/specifyweb/backend/stored_queries/tests/test_query_ops.py b/specifyweb/backend/stored_queries/tests/test_query_ops.py index 470f2b009c3..ed4f8e2fa3d 100644 --- a/specifyweb/backend/stored_queries/tests/test_query_ops.py +++ b/specifyweb/backend/stored_queries/tests/test_query_ops.py @@ -63,4 +63,7 @@ def test_op_endswith_basic(self): def test_op_empty_basic(self): self.assert_op_sql(self.ops.op_empty, "", '"catalogNumber" IS NULL') + def test_op_true_basic(self): + self.assert_op_sql(self.ops.op_true, "", '"catalogNumber" = true') + \ No newline at end of file From 1958e044ff0dff6d369107bd1671ceb2a7139f13 Mon Sep 17 00:00:00 2001 From: Rijul Poudel Date: Fri, 10 Jul 2026 13:59:52 -0500 Subject: [PATCH 15/17] [test]: [test]: Backend unit test for false operator(basic) --- specifyweb/backend/stored_queries/tests/test_query_ops.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/specifyweb/backend/stored_queries/tests/test_query_ops.py b/specifyweb/backend/stored_queries/tests/test_query_ops.py index ed4f8e2fa3d..473635f3521 100644 --- a/specifyweb/backend/stored_queries/tests/test_query_ops.py +++ b/specifyweb/backend/stored_queries/tests/test_query_ops.py @@ -66,4 +66,8 @@ def test_op_empty_basic(self): def test_op_true_basic(self): self.assert_op_sql(self.ops.op_true, "", '"catalogNumber" = true') + def test_op_false_basic(self): + self.assert_op_sql(self.ops.op_false, "", '"catalogNumber" = false') + + \ No newline at end of file From aa607ccfb182122bb1edc28062c9cd71ab053b1e Mon Sep 17 00:00:00 2001 From: Rijul Poudel Date: Fri, 10 Jul 2026 14:00:24 -0500 Subject: [PATCH 16/17] [test]: [test]: Backend unit test for trueornull operator(basic) --- specifyweb/backend/stored_queries/tests/test_query_ops.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/specifyweb/backend/stored_queries/tests/test_query_ops.py b/specifyweb/backend/stored_queries/tests/test_query_ops.py index 473635f3521..24bdbc5243a 100644 --- a/specifyweb/backend/stored_queries/tests/test_query_ops.py +++ b/specifyweb/backend/stored_queries/tests/test_query_ops.py @@ -69,5 +69,8 @@ def test_op_true_basic(self): def test_op_false_basic(self): self.assert_op_sql(self.ops.op_false, "", '"catalogNumber" = false') + def test_op_trueornull_basic(self): + self.assert_op_sql(self.ops.op_trueornull, "", '"catalogNumber" = true OR "catalogNumber" IS NULL') + \ No newline at end of file From 778e8b14ac855d3c19e8ad5193887a6b3a6ac6ec Mon Sep 17 00:00:00 2001 From: Rijul Poudel Date: Fri, 10 Jul 2026 14:00:43 -0500 Subject: [PATCH 17/17] [test]: [test]: Backend unit test for falseornull operator(basic) --- specifyweb/backend/stored_queries/tests/test_query_ops.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/specifyweb/backend/stored_queries/tests/test_query_ops.py b/specifyweb/backend/stored_queries/tests/test_query_ops.py index 24bdbc5243a..89908deaffc 100644 --- a/specifyweb/backend/stored_queries/tests/test_query_ops.py +++ b/specifyweb/backend/stored_queries/tests/test_query_ops.py @@ -72,5 +72,6 @@ def test_op_false_basic(self): def test_op_trueornull_basic(self): self.assert_op_sql(self.ops.op_trueornull, "", '"catalogNumber" = true OR "catalogNumber" IS NULL') - + def test_op_falseornull_basic(self): + self.assert_op_sql(self.ops.op_falseornull, "", '"catalogNumber" = false OR "catalogNumber" IS NULL') \ No newline at end of file