@@ -16,8 +16,9 @@ limitations under the License.
16
16
17
17
import "fake-indexeddb/auto" ;
18
18
import "jest-localstorage-mock" ;
19
+ import { IDBFactory } from "fake-indexeddb" ;
19
20
20
- import { IndexedDBStore , IStateEventWithRoomId , MemoryStore } from "../../../src" ;
21
+ import { IndexedDBStore , IStateEventWithRoomId , MemoryStore , User , UserEvent } from "../../../src" ;
21
22
import { emitPromise } from "../../test-utils/test-utils" ;
22
23
import { LocalIndexedDBStoreBackend } from "../../../src/store/indexeddb-local-backend" ;
23
24
import { defer } from "../../../src/utils" ;
@@ -76,6 +77,62 @@ describe("IndexedDBStore", () => {
76
77
expect ( await store . getOutOfBandMembers ( roomId ) ) . toHaveLength ( 2 ) ;
77
78
} ) ;
78
79
80
+ it ( "Should load presence events on startup" , async ( ) => {
81
+ // 1. Create idb database
82
+ const indexedDB = new IDBFactory ( ) ;
83
+ const setupDefer = defer < Event > ( ) ;
84
+ const req = indexedDB . open ( "matrix-js-sdk:db3" , 1 ) ;
85
+ let db : IDBDatabase ;
86
+ req . onupgradeneeded = ( ) => {
87
+ db = req . result ;
88
+ db . createObjectStore ( "users" , { keyPath : [ "userId" ] } ) ;
89
+ db . createObjectStore ( "accountData" , { keyPath : [ "type" ] } ) ;
90
+ db . createObjectStore ( "sync" , { keyPath : [ "clobber" ] } ) ;
91
+ } ;
92
+ req . onsuccess = setupDefer . resolve ;
93
+ await setupDefer . promise ;
94
+
95
+ // 2. Fill in user presence data
96
+ const writeDefer = defer < Event > ( ) ;
97
+ const transaction = db ! . transaction ( [ "users" ] , "readwrite" ) ;
98
+ const objectStore = transaction . objectStore ( "users" ) ;
99
+ const request = objectStore . put ( {
100
+ userId : "@alice:matrix.org" ,
101
+ event : {
102
+ content : {
103
+ presence : "online" ,
104
+ } ,
105
+ sender : "@alice:matrix.org" ,
106
+ type : "m.presence" ,
107
+ } ,
108
+ } ) ;
109
+ request . onsuccess = writeDefer . resolve ;
110
+ await writeDefer . promise ;
111
+
112
+ // 3. Close database
113
+ req . result . close ( ) ;
114
+
115
+ // 2. Check if the code loads presence events
116
+ const store = new IndexedDBStore ( {
117
+ indexedDB : indexedDB ,
118
+ dbName : "db3" ,
119
+ localStorage,
120
+ } ) ;
121
+ let userCreated = false ;
122
+ let presenceEventEmitted = false ;
123
+ store . setUserCreator ( ( id : string ) => {
124
+ userCreated = true ;
125
+ const user = new User ( id ) ;
126
+ user . on ( UserEvent . Presence , ( ) => {
127
+ presenceEventEmitted = true ;
128
+ } ) ;
129
+ return user ;
130
+ } ) ;
131
+ await store . startup ( ) ;
132
+ expect ( userCreated ) . toBe ( true ) ;
133
+ expect ( presenceEventEmitted ) . toBe ( true ) ;
134
+ } ) ;
135
+
79
136
it ( "should use MemoryStore methods for pending events if no localStorage" , async ( ) => {
80
137
jest . spyOn ( MemoryStore . prototype , "setPendingEvents" ) ;
81
138
jest . spyOn ( MemoryStore . prototype , "getPendingEvents" ) ;
0 commit comments