@@ -14,12 +14,17 @@ it("should open in-memory database", () => {
1414 const query = db . prepare ( "select 'Hello world' as message;" ) ;
1515
1616 //then
17- assert . deepEqual ( query . get ( ) , { message : "Hello world" } ) ;
17+ assert . deepEqual ( { ... query . get ( ) } , { message : "Hello world" } ) ;
1818
1919 //when & then
2020 const results = query . all ( ) ;
2121 assert . deepEqual ( Array . isArray ( results ) , true ) ;
22- assert . deepEqual ( results , [ { message : "Hello world" } ] ) ;
22+ assert . deepEqual (
23+ results . map ( ( r ) => {
24+ return { ...r } ;
25+ } ) ,
26+ [ { message : "Hello world" } ]
27+ ) ;
2328
2429 //when & then
2530 db . close ( ) ;
@@ -62,19 +67,73 @@ it("should create file-based database", () => {
6267 const results = db . prepare ( "select * from test order by id;" ) . all ( ) ;
6368
6469 //then
65- assert . deepEqual ( results , [
66- {
67- id : 1 ,
68- name : "test1" ,
69- } ,
70- {
71- id : 2 ,
72- name : "test2" ,
73- } ,
74- ] ) ;
70+ assert . deepEqual (
71+ results . map ( ( r ) => {
72+ return { ...r } ;
73+ } ) ,
74+ [
75+ {
76+ id : 1 ,
77+ name : "test1" ,
78+ } ,
79+ {
80+ id : 2 ,
81+ name : "test2" ,
82+ } ,
83+ ]
84+ ) ;
7585
7686 //cleanup
7787 db . close ( ) ;
7888 fs . unlinkSync ( file ) ;
7989 fs . rmdirSync ( tmpDir ) ;
8090} ) ;
91+
92+ it ( "should rollback failed transaction" , ( ) => {
93+ //when
94+ const db = new Database ( ":memory:" ) ;
95+ const changesQuery = db . prepare ( "SELECT changes() AS changes;" ) ;
96+ const lastInsertRowIdQuery = db . prepare ( "SELECT last_insert_rowid() AS id;" ) ;
97+ db . prepare (
98+ `
99+ create table test(
100+ id integer primary key,
101+ name text not null
102+ );
103+ `
104+ ) . run ( ) ;
105+ assert . deepEqual ( changesQuery . get ( ) . changes , 0 ) ;
106+ assert . deepEqual ( lastInsertRowIdQuery . get ( ) . id , 0 ) ;
107+
108+ const error = Error ( "test error" ) ;
109+ const txFn = db . transaction ( ( name ) => {
110+ const insert = db . prepare ( "insert into test (name) values (?);" ) ;
111+ insert . run ( name ) ;
112+ throw error ;
113+ } ) ;
114+ let caughtError = null ;
115+
116+ //when
117+ try {
118+ txFn ( "test1" ) ;
119+ } catch ( err ) {
120+ caughtError = err ;
121+ }
122+
123+ //then
124+ assert . deepEqual ( caughtError === error , true ) ;
125+ assert . deepEqual ( changesQuery . get ( ) . changes , 1 ) ;
126+ assert . deepEqual ( lastInsertRowIdQuery . get ( ) . id , 1 ) ;
127+
128+ //when & then
129+ const query = db . prepare ( "select id, name from test;" ) ;
130+ assert . deepEqual (
131+ query . all ( ) . map ( ( r ) => {
132+ return { ...r } ;
133+ } ) ,
134+ [ ]
135+ ) ;
136+
137+ //cleanup
138+ db . close ( ) ;
139+ } ) ;
0 commit comments