From 48b925ca2807df67acc715c5dd4768ba390c8e8b Mon Sep 17 00:00:00 2001 From: PhilippReisigl Date: Fri, 17 Jul 2026 11:58:08 +0200 Subject: [PATCH 1/4] add initial test --- tests/ContainsManyTest.php | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/tests/ContainsManyTest.php b/tests/ContainsManyTest.php index 40fd90b5e..283f514ab 100644 --- a/tests/ContainsManyTest.php +++ b/tests/ContainsManyTest.php @@ -321,7 +321,7 @@ private function createInvoiceEntityWithLogger(&$log): Invoice return $line; }; - \Closure::bind(static fn () => $invoice->getField($invoice->fieldName()->lines)->getReference()->model = $createTheirModelFx, null, Reference::class)(); + \Closure::bind(static fn() => $invoice->getField($invoice->fieldName()->lines)->getReference()->model = $createTheirModelFx, null, Reference::class)(); $invoiceEntity = $invoice->loadBy($invoice->fieldName()->ref_no, 'A1'); @@ -476,4 +476,39 @@ public function testUnmanagedDataModificationException(): void $this->expectExceptionMessageIs('Contained model data cannot be modified directly'); $i->set($i->fieldName()->lines, [0]); } + + public function testSortOrder(): void + { + $i = new Invoice($this->db); + $i = $i->loadBy($i->fieldName()->ref_no, 'A1'); + $l = $i->lines; + + $l->insert([ + $l->fieldName()->id => 1, + $l->fieldName()->price => 10, + $l->fieldName()->qty => 2, + ]); + $l->insert([ + $l->fieldName()->id => 2, + $l->fieldName()->price => 15, + $l->fieldName()->qty => 5, + ]); + $l->insert([ + $l->fieldName()->id => 3, + $l->fieldName()->price => 5, + $l->fieldName()->qty => 6, + ]); + $l->insert([ + $l->fieldName()->id => 4, + $l->fieldName()->price => 15, + $l->fieldName()->qty => 3, + ]); + + $expectedSorOrder = [3, 1, 4, 3]; + $ids = []; + foreach ($l->lines->setOrder(['price' => 'ASC', 'qty' => 'ASC']) as $line) { + $ids[] = $line->id; + } + self::assertSame($expectedSorOrder, $ids); + } } From 8d25ad655831eb37d6b0007d4f8817338addeccc Mon Sep 17 00:00:00 2001 From: PhilippReisigl Date: Fri, 17 Jul 2026 12:00:59 +0200 Subject: [PATCH 2/4] fix --- tests/ContainsManyTest.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/ContainsManyTest.php b/tests/ContainsManyTest.php index 283f514ab..0992b5461 100644 --- a/tests/ContainsManyTest.php +++ b/tests/ContainsManyTest.php @@ -485,30 +485,34 @@ public function testSortOrder(): void $l->insert([ $l->fieldName()->id => 1, + $l->fieldName()->vat_rate_id => 1, $l->fieldName()->price => 10, $l->fieldName()->qty => 2, ]); $l->insert([ $l->fieldName()->id => 2, + $l->fieldName()->vat_rate_id => 1, $l->fieldName()->price => 15, $l->fieldName()->qty => 5, ]); $l->insert([ $l->fieldName()->id => 3, + $l->fieldName()->vat_rate_id => 1, $l->fieldName()->price => 5, $l->fieldName()->qty => 6, ]); $l->insert([ $l->fieldName()->id => 4, + $l->fieldName()->vat_rate_id => 1, $l->fieldName()->price => 15, $l->fieldName()->qty => 3, ]); - $expectedSorOrder = [3, 1, 4, 3]; + $expectedSortOrder = [3, 1, 4, 3]; $ids = []; foreach ($l->lines->setOrder(['price' => 'ASC', 'qty' => 'ASC']) as $line) { $ids[] = $line->id; } - self::assertSame($expectedSorOrder, $ids); + self::assertSame($expectedSortOrder, $ids); } } From 4a142ed1c20950c801c5d5ee8b737cbc095dec78 Mon Sep 17 00:00:00 2001 From: PhilippReisigl Date: Fri, 17 Jul 2026 12:04:15 +0200 Subject: [PATCH 3/4] add failing test to demonstrate problem --- tests/ContainsManyTest.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/ContainsManyTest.php b/tests/ContainsManyTest.php index 0992b5461..96bb869a4 100644 --- a/tests/ContainsManyTest.php +++ b/tests/ContainsManyTest.php @@ -507,10 +507,16 @@ public function testSortOrder(): void $l->fieldName()->price => 15, $l->fieldName()->qty => 3, ]); + $l->insert([ + $l->fieldName()->id => 5, + $l->fieldName()->vat_rate_id => 1, + $l->fieldName()->price => 9, + $l->fieldName()->qty => 2, + ]); - $expectedSortOrder = [3, 1, 4, 3]; + $expectedSortOrder = [5, 3, 1, 4, 3]; $ids = []; - foreach ($l->lines->setOrder(['price' => 'ASC', 'qty' => 'ASC']) as $line) { + foreach ($i->lines->setOrder(['price' => 'ASC', 'qty' => 'ASC']) as $line) { $ids[] = $line->id; } self::assertSame($expectedSortOrder, $ids); From 857156e0b70383a8622293e26cf3d5349bf58197 Mon Sep 17 00:00:00 2001 From: PhilippReisigl Date: Fri, 17 Jul 2026 12:14:05 +0200 Subject: [PATCH 4/4] make CS happy --- tests/ContainsManyTest.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/ContainsManyTest.php b/tests/ContainsManyTest.php index 96bb869a4..357b4ab8a 100644 --- a/tests/ContainsManyTest.php +++ b/tests/ContainsManyTest.php @@ -321,8 +321,7 @@ private function createInvoiceEntityWithLogger(&$log): Invoice return $line; }; - \Closure::bind(static fn() => $invoice->getField($invoice->fieldName()->lines)->getReference()->model = $createTheirModelFx, null, Reference::class)(); - + \Closure::bind(static fn () => $invoice->getField($invoice->fieldName()->lines)->getReference()->model = $createTheirModelFx, null, Reference::class)(); $invoiceEntity = $invoice->loadBy($invoice->fieldName()->ref_no, 'A1'); $invoice->getField($invoice->fieldName()->lines)