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