22
33use com \mongodb \{Collection , Document , ObjectId , Options };
44use lang \IllegalStateException ;
5- use test \{Assert , Expect , Test };
5+ use test \{Assert , Expect , Test , Values };
66use util \{Date , Dates };
77use web \session \{ISession , InMongoDB , SessionInvalid };
88
@@ -34,6 +34,7 @@ public function open_session() {
3434 $ collection = $ this ->collection ([new Document ([
3535 '_id ' => $ id ,
3636 '_created ' => Date::now (),
37+ 'values ' => [],
3738 ])]);
3839
3940 $ sessions = new InMongoDB ($ collection );
@@ -49,6 +50,7 @@ public function open_expired_session() {
4950 $ collection = $ this ->collection ([new Document ([
5051 '_id ' => $ id ,
5152 '_created ' => Dates::subtract (Date::now (), 3601 ),
53+ 'values ' => [],
5254 ])]);
5355
5456 $ sessions = (new InMongoDB ($ collection ))->lasting (3600 );
@@ -71,6 +73,7 @@ public function open_old_session() {
7173
7274 Assert::instance (ISession::class, $ session );
7375 Assert::true ($ collection ->present ($ session ->id ()));
76+ Assert::equals ([], $ session ->keys ());
7477 }
7578
7679 #[Test]
@@ -79,7 +82,7 @@ public function value() {
7982 $ collection = $ this ->collection ([new Document ([
8083 '_id ' => $ id ,
8184 '_created ' => Date::now (),
82- 'user ' => 'test ' ,
85+ 'values ' => [ ' user ' => 'test ' ] ,
8386 ])]);
8487
8588 $ sessions = new InMongoDB ($ collection );
@@ -88,12 +91,44 @@ public function value() {
8891 Assert::equals ('test ' , $ session ->value ('user ' ));
8992 }
9093
94+ #[Test]
95+ public function values_migrated_from_old_session_layout () {
96+ $ id = ObjectId::create ();
97+ $ collection = $ this ->collection ([new Document ([
98+ '_id ' => $ id ,
99+ '_created ' => Date::now (),
100+ 'user ' => 'test ' ,
101+ '%host ' => 'example.com ' ,
102+ ])]);
103+
104+ $ sessions = new InMongoDB ($ collection );
105+ $ session = $ sessions ->open ($ id ->string ());
106+
107+ Assert::equals (['test ' , 'example.com ' ], [$ session ->value ('user ' ), $ session ->value ('%host ' )]);
108+ }
109+
110+ #[Test]
111+ public function keys () {
112+ $ id = ObjectId::create ();
113+ $ collection = $ this ->collection ([new Document ([
114+ '_id ' => $ id ,
115+ '_created ' => Date::now (),
116+ 'values ' => ['user ' => 'test ' ],
117+ ])]);
118+
119+ $ sessions = new InMongoDB ($ collection );
120+ $ session = $ sessions ->open ($ id ->string ());
121+
122+ Assert::equals (['user ' ], $ session ->keys ());
123+ }
124+
91125 #[Test]
92126 public function register () {
93127 $ id = ObjectId::create ();
94128 $ collection = $ this ->collection ([new Document ([
95129 '_id ' => $ id ,
96130 '_created ' => Date::now (),
131+ 'values ' => [],
97132 ])]);
98133
99134 $ sessions = new InMongoDB ($ collection );
@@ -109,7 +144,7 @@ public function remove() {
109144 $ collection = $ this ->collection ([new Document ([
110145 '_id ' => $ id ,
111146 '_created ' => Date::now (),
112- 'user ' => 'test ' ,
147+ 'values ' => [ ' user ' => 'test ' ] ,
113148 ])]);
114149
115150 $ sessions = new InMongoDB ($ collection );
@@ -125,6 +160,7 @@ public function invalid_session() {
125160 $ collection = $ this ->collection ([new Document ([
126161 '_id ' => $ id ,
127162 '_created ' => Date::now (),
163+ 'values ' => [],
128164 ])]);
129165
130166 $ sessions = new InMongoDB ($ collection );
@@ -147,6 +183,7 @@ public function gc_returns_number_of_expired_sessions() {
147183 $ collection = $ this ->collection ([new Document ([
148184 '_id ' => $ id ,
149185 '_created ' => Dates::subtract (Date::now (), $ duration + 1 ),
186+ 'values ' => [],
150187 ])]);
151188
152189 $ sessions = (new InMongoDB ($ collection ))->lasting ($ duration );
@@ -172,9 +209,25 @@ public function gc_is_a_noop_when_ttl_indexes_are_used() {
172209 $ collection = $ this ->collection ([new Document ([
173210 '_id ' => $ id ,
174211 '_created ' => Dates::subtract (Date::now (), $ duration + 1 ),
212+ 'values ' => [],
175213 ])]);
176214
177215 $ sessions = (new InMongoDB ($ collection , InMongoDB::USING_TTL ));
178216 Assert::equals (0 , $ sessions ->gc ());
179217 }
218+
219+ #[Test, Values([['user.name ' , 'user%2ename ' ], ['%user ' , '%25user ' ], ['%5fuser ' , '%255fuser ' ]])]
220+ public function special_characters_are_escaped ($ key , $ stored ) {
221+ $ id = ObjectId::create ();
222+ $ collection = $ this ->collection ([new Document ([
223+ '_id ' => $ id ,
224+ '_created ' => Date::now (),
225+ 'values ' => [$ stored => 'test ' ],
226+ ])]);
227+
228+ $ sessions = new InMongoDB ($ collection );
229+ $ session = $ sessions ->open ($ id ->string ());
230+
231+ Assert::equals ('test ' , $ session ->value ($ key ));
232+ }
180233}
0 commit comments