@@ -93,19 +93,21 @@ pub async fn get_key(
9393 } )
9494 . await ?;
9595
96- // Count how many are in use
97- charger_key_ids. iter ( ) . filter ( |key_id| keys_in_use_cache. contains ( * key_id) ) . count ( )
96+ charger_key_ids
97+ . into_iter ( )
98+ . filter ( |key_id| keys_in_use_cache. contains ( key_id) )
99+ . collect :: < Vec < _ > > ( )
98100 } ;
99101
100- if keys_in_use_count >= 5 {
102+ if keys_in_use_count. len ( ) >= 5 {
101103 return Err ( Error :: AllKeysInUse . into ( ) ) ;
102104 }
103105
104106 let mut conn = get_connection ( & state) ?;
105107 let key: Option < WgKey > = web_block_unpacked ( move || {
106108 match WgKey :: belonging_to ( & user)
107109 . filter ( charger_id. eq ( & cid) )
108- . filter ( in_use . eq ( false ) )
110+ . filter ( id . ne_all ( keys_in_use_count ) )
109111 . select ( WgKey :: as_select ( ) )
110112 . get_result ( & mut conn)
111113 {
@@ -134,15 +136,16 @@ pub async fn get_key(
134136
135137#[ cfg( test) ]
136138mod tests {
137- use std:: str:: FromStr ;
138-
139139 use super :: * ;
140140 use actix_web:: { cookie:: Cookie , test, App } ;
141- use db_connector:: test_connection_pool;
142141 use rand:: TryRngCore ;
143142 use rand_core:: OsRng ;
144143
145- use crate :: { middleware:: jwt:: JwtMiddleware , routes:: user:: tests:: TestUser , tests:: configure} ;
144+ use crate :: {
145+ middleware:: jwt:: JwtMiddleware ,
146+ routes:: user:: tests:: TestUser ,
147+ tests:: { configure, get_charger_key_ids, mark_keys_as_in_use} ,
148+ } ;
146149
147150 #[ actix_web:: test]
148151 async fn test_get_key ( ) {
@@ -168,26 +171,23 @@ mod tests {
168171 }
169172
170173 #[ actix_web:: test]
171- async fn test_get_key_none_left ( ) {
172- use db_connector :: schema :: wg_keys :: dsl :: * ;
174+ async fn test_get_key_all_keys_in_use ( ) {
175+ use std :: str :: FromStr ;
173176
174177 let ( mut user, _) = TestUser :: random ( ) . await ;
175178 user. login ( ) . await ;
176179
177180 let charger_uid = OsRng . try_next_u32 ( ) . unwrap ( ) as i32 ;
178181 let charger = user. add_charger ( charger_uid) . await ;
179182
180- let pool = test_connection_pool ( ) ;
181- let mut conn = pool. get ( ) . unwrap ( ) ;
183+ let state = crate :: tests:: create_test_state ( None ) ;
184+ let charger_uuid = uuid:: Uuid :: from_str ( & charger. uuid ) . unwrap ( ) ;
185+ let key_ids = get_charger_key_ids ( & state, charger_uuid) . await ;
182186
183- diesel:: update ( wg_keys)
184- . filter ( charger_id. eq ( uuid:: Uuid :: from_str ( & charger. uuid ) . unwrap ( ) ) )
185- . set ( in_use. eq ( true ) )
186- . execute ( & mut conn)
187- . unwrap ( ) ;
187+ mark_keys_as_in_use ( & state, key_ids) . await ;
188188
189189 let app = App :: new ( )
190- . configure ( configure )
190+ . app_data ( state )
191191 . wrap ( JwtMiddleware )
192192 . service ( get_key) ;
193193 let app = test:: init_service ( app) . await ;
@@ -197,6 +197,7 @@ mod tests {
197197 . cookie ( Cookie :: new ( "access_token" , user. get_access_token ( ) ) )
198198 . to_request ( ) ;
199199
200+ // Should fail with 404 since all keys are in use
200201 let resp = test:: call_service ( & app, req) . await ;
201202 assert ! ( resp. status( ) . is_client_error( ) ) ;
202203 assert_eq ! ( resp. status( ) . as_u16( ) , 404 ) ;
0 commit comments