5
5
namespace Jenssegers\Mongodb\Tests\Query;
6
6
7
7
use DateTimeImmutable;
8
+ use Illuminate\Tests\Database\DatabaseQueryBuilderTest;
8
9
use Jenssegers\Mongodb\Connection;
9
10
use Jenssegers\Mongodb\Query\Builder;
10
11
use Jenssegers\Mongodb\Query\Processor;
@@ -63,6 +64,66 @@ public static function provideQueryBuilderToMql(): iterable
63
64
fn (Builder $builder) => $builder->limit(10)->offset(5)->select('foo', 'bar'),
64
65
];
65
66
67
+ /** @see DatabaseQueryBuilderTest::testOrderBys() */
68
+ yield 'orderBy multiple columns' => [
69
+ ['find' => [[], ['sort' => ['email' => 1, 'age' => -1]]]],
70
+ fn (Builder $builder) => $builder
71
+ ->orderBy('email')
72
+ ->orderBy('age', 'desc'),
73
+ ];
74
+
75
+ yield 'orders = null' => [
76
+ ['find' => [[], []]],
77
+ function (Builder $builder) {
78
+ $builder->orders = null;
79
+
80
+ return $builder;
81
+ },
82
+ ];
83
+
84
+ yield 'orders = []' => [
85
+ ['find' => [[], []]],
86
+ function (Builder $builder) {
87
+ $builder->orders = [];
88
+
89
+ return $builder;
90
+ },
91
+ ];
92
+
93
+ yield 'multiple orders with direction' => [
94
+ ['find' => [[], ['sort' => ['email' => -1, 'age' => 1]]]],
95
+ fn (Builder $builder) => $builder
96
+ ->orderBy('email', -1)
97
+ ->orderBy('age', 1),
98
+ ];
99
+
100
+ yield 'orderByDesc' => [
101
+ ['find' => [[], ['sort' => ['email' => -1]]]],
102
+ fn (Builder $builder) => $builder->orderByDesc('email'),
103
+ ];
104
+
105
+ /** @see DatabaseQueryBuilderTest::testReorder() */
106
+ yield 'reorder reset' => [
107
+ ['find' => [[], []]],
108
+ fn (Builder $builder) => $builder->orderBy('name')->reorder(),
109
+ ];
110
+
111
+ yield 'reorder column' => [
112
+ ['find' => [[], ['sort' => ['name' => -1]]]],
113
+ fn (Builder $builder) => $builder->orderBy('name')->reorder('name', 'desc'),
114
+ ];
115
+
116
+ /** @link https://www.mongodb.com/docs/manual/reference/method/cursor.sort/#text-score-metadata-sort */
117
+ yield 'orderBy array meta' => [
118
+ ['find' => [
119
+ ['$text' => ['$search' => 'operating']],
120
+ ['sort' => ['score' => ['$meta' => 'textScore']]],
121
+ ]],
122
+ fn (Builder $builder) => $builder
123
+ ->where('$text', ['$search' => 'operating'])
124
+ ->orderBy('score', ['$meta' => 'textScore']),
125
+ ];
126
+
66
127
yield 'distinct' => [
67
128
['distinct' => ['foo', [], []]],
68
129
fn (Builder $builder) => $builder->distinct('foo'),
@@ -74,6 +135,27 @@ public static function provideQueryBuilderToMql(): iterable
74
135
];
75
136
}
76
137
138
+ /**
139
+ * @dataProvider provideExceptions
140
+ */
141
+ public function testException($class, $message, \Closure $build): void
142
+ {
143
+ $builder = self::getBuilder();
144
+
145
+ $this->expectException($class);
146
+ $this->expectExceptionMessage($message);
147
+ $build($builder);
148
+ }
149
+
150
+ public static function provideExceptions(): iterable
151
+ {
152
+ yield 'orderBy invalid direction' => [
153
+ \InvalidArgumentException::class,
154
+ 'Order direction must be "asc" or "desc"',
155
+ fn (Builder $builder) => $builder->orderBy('_id', 'dasc'),
156
+ ];
157
+ }
158
+
77
159
private static function getBuilder(): Builder
78
160
{
79
161
$connection = m::mock(Connection::class);
0 commit comments