@@ -4,9 +4,83 @@ import { setupTest } from 'codecrafters-frontend/tests/helpers';
44module ( 'Unit | Service | local-storage' , function ( hooks ) {
55 setupTest ( hooks ) ;
66
7- // TODO: Replace this with your real tests.
8- test ( 'it exists' , function ( assert ) {
9- let service = this . owner . lookup ( 'service:local-storage' ) ;
10- assert . ok ( service ) ;
7+ test ( 'getItem / setItem / removeItem use prefixed keys' , function ( assert ) {
8+ const service = this . owner . lookup ( 'service:local-storage' ) ;
9+
10+ service . setItem ( 'foo' , 'bar' ) ;
11+
12+ assert . strictEqual ( window . localStorage . getItem ( 'cc-frontend:foo' ) , 'bar' , 'raw storage has prefixed key' ) ;
13+ assert . strictEqual ( service . getItem ( 'foo' ) , 'bar' , 'service returns stored value' ) ;
14+
15+ service . removeItem ( 'foo' ) ;
16+ assert . strictEqual ( service . getItem ( 'foo' ) , null , 'value removed via service' ) ;
17+ assert . strictEqual ( window . localStorage . getItem ( 'cc-frontend:foo' ) , null , 'raw storage entry removed' ) ;
18+ } ) ;
19+
20+ test ( 'length and key return prefixed keys only' , function ( assert ) {
21+ const service = this . owner . lookup ( 'service:local-storage' ) ;
22+
23+ // add two prefixed keys and one non-prefixed
24+ service . setItem ( 'one' , '1' ) ;
25+ service . setItem ( 'two' , '2' ) ;
26+ window . localStorage . setItem ( 'three' , '3' ) ;
27+
28+ assert . strictEqual ( service . length , 2 , 'service.length counts only prefixed keys' ) ;
29+
30+ const keys = [ ] ;
31+
32+ for ( let i = 0 ; i < service . length ; i ++ ) {
33+ keys . push ( service . key ( i ) ) ;
34+ }
35+
36+ // keys should be unprefixed
37+ assert . ok ( keys . includes ( 'one' ) , 'contains one' ) ;
38+ assert . ok ( keys . includes ( 'two' ) , 'contains two' ) ;
39+ assert . notOk ( keys . includes ( 'three' ) , 'does not include non-prefixed key' ) ;
40+ } ) ;
41+
42+ test ( 'clear removes only prefixed keys and leaves others intact' , function ( assert ) {
43+ const service = this . owner . lookup ( 'service:local-storage' ) ;
44+
45+ service . setItem ( 'temp' , 'x' ) ;
46+ window . localStorage . setItem ( 'other:keep' , 'y' ) ;
47+
48+ // eslint-disable-next-line ember/no-array-prototype-extensions
49+ service . clear ( ) ;
50+
51+ // prefixed keys removed
52+ assert . strictEqual ( service . getItem ( 'existing' ) , null , 'existing prefixed removed' ) ;
53+ assert . strictEqual ( service . getItem ( 'temp' ) , null , 'temp prefixed removed' ) ;
54+
55+ // non-prefixed untouched
56+ assert . strictEqual ( window . localStorage . getItem ( 'other:keep' ) , 'y' , 'non-prefixed key remains' ) ;
57+ } ) ;
58+
59+ test ( 'clearLegacyKeys removes legacy keys from raw localStorage' , function ( assert ) {
60+ const initial = {
61+ 'cc-frontend:existing' : 'yes' ,
62+ 'external:keep' : 'stay' ,
63+ // legacy keys that clearLegacyKeys should remove
64+ 'current_user_cache_v1:user_id' : '1' ,
65+ 'current_user_cache_v1:username' : 'u' ,
66+ 'preferred-language-leaderboard-v1' : 'en' ,
67+ 'leaderboard-team-selection-v1' : 'team' ,
68+ session_token_v1 : 'token' ,
69+ } ;
70+
71+ for ( const key of Object . keys ( initial ) ) {
72+ window . localStorage . setItem ( key , initial [ key ] ) ;
73+ }
74+
75+ const service = this . owner . lookup ( 'service:local-storage' ) ;
76+ service . clearLegacyKeys ( ) ;
77+
78+ assert . strictEqual ( window . localStorage . getItem ( 'cc-frontend:existing' ) , 'yes' , 'cc-frontend:existing is preserved' ) ;
79+ assert . strictEqual ( window . localStorage . getItem ( 'external:keep' ) , 'stay' , 'external:keep is preserved' ) ;
80+ assert . strictEqual ( window . localStorage . getItem ( 'current_user_cache_v1:user_id' ) , null , 'legacy user_id removed' ) ;
81+ assert . strictEqual ( window . localStorage . getItem ( 'current_user_cache_v1:username' ) , null , 'legacy username removed' ) ;
82+ assert . strictEqual ( window . localStorage . getItem ( 'preferred-language-leaderboard-v1' ) , null , 'legacy preferred-language removed' ) ;
83+ assert . strictEqual ( window . localStorage . getItem ( 'leaderboard-team-selection-v1' ) , null , 'legacy leaderboard-team-selection removed' ) ;
84+ assert . strictEqual ( window . localStorage . getItem ( 'session_token_v1' ) , null , 'legacy session_token removed' ) ;
1185 } ) ;
1286} ) ;
0 commit comments