1+ using FluentAssertions ;
2+
3+ using LiteDB . Engine ;
4+
5+ using System . IO ;
6+
7+ using Xunit ;
8+
9+ namespace LiteDB . Tests . Database ;
10+
11+ public class DocumentUpgrade_Tests
12+ {
13+ [ Fact ]
14+ public void DocumentUpgrade_Test ( )
15+ {
16+ var ms = new MemoryStream ( ) ;
17+ using ( var db = new LiteDatabase ( ms ) )
18+ {
19+ var col = db . GetCollection ( "col" ) ;
20+
21+ col . Insert ( new BsonDocument { [ "version" ] = 1 , [ "_id" ] = 1 , [ "name" ] = "John" } ) ;
22+ }
23+
24+ ms . Position = 0 ;
25+
26+ using ( var db = new LiteDatabase ( ms ) )
27+ {
28+ var col = db . GetCollection ( "col" ) ;
29+
30+ col . Count ( ) . Should ( ) . Be ( 1 ) ;
31+
32+ var doc = col . FindById ( 1 ) ;
33+
34+ doc [ "version" ] . AsInt32 . Should ( ) . Be ( 1 ) ;
35+ doc [ "name" ] . AsString . Should ( ) . Be ( "John" ) ;
36+ doc [ "age" ] . AsInt32 . Should ( ) . Be ( 0 ) ;
37+ }
38+
39+ ms . Position = 0 ;
40+
41+ using var engine = new LiteEngine ( new EngineSettings
42+ {
43+ DataStream = ms ,
44+ ReadTransform = ( collectionName , val ) =>
45+ {
46+ if ( val is not BsonDocument doc )
47+ {
48+ return val ;
49+ }
50+
51+ if ( doc . TryGetValue ( "version" , out var version ) && version . AsInt32 == 1 )
52+ {
53+ doc [ "version" ] = 2 ;
54+ doc [ "age" ] = 30 ;
55+ }
56+
57+ return val ;
58+ }
59+ } ) ;
60+
61+ using ( var db = new LiteDatabase ( engine ) )
62+ {
63+ var col = db . GetCollection ( "col" ) ;
64+
65+ col . Count ( ) . Should ( ) . Be ( 1 ) ;
66+
67+ var doc = col . FindById ( 1 ) ;
68+
69+ doc [ "version" ] . AsInt32 . Should ( ) . Be ( 2 ) ;
70+ doc [ "name" ] . AsString . Should ( ) . Be ( "John" ) ;
71+ doc [ "age" ] . AsInt32 . Should ( ) . Be ( 30 ) ;
72+ }
73+ }
74+
75+ [ Fact ]
76+ public void DocumentUpgrade_BsonMapper_Test ( )
77+ {
78+ var ms = new MemoryStream ( ) ;
79+ using ( var db = new LiteDatabase ( ms ) )
80+ {
81+ var col = db . GetCollection ( "col" ) ;
82+
83+ col . Insert ( new BsonDocument { [ "version" ] = 1 , [ "_id" ] = 1 , [ "name" ] = "John" } ) ;
84+ }
85+
86+ ms . Position = 0 ;
87+
88+ using ( var db = new LiteDatabase ( ms ) )
89+ {
90+ var col = db . GetCollection ( "col" ) ;
91+
92+ col . Count ( ) . Should ( ) . Be ( 1 ) ;
93+
94+ var doc = col . FindById ( 1 ) ;
95+
96+ doc [ "version" ] . AsInt32 . Should ( ) . Be ( 1 ) ;
97+ doc [ "name" ] . AsString . Should ( ) . Be ( "John" ) ;
98+ doc [ "age" ] . AsInt32 . Should ( ) . Be ( 0 ) ;
99+ }
100+
101+ ms . Position = 0 ;
102+
103+ var mapper = new BsonMapper ( ) ;
104+ mapper . OnDeserialization = ( sender , type , val ) =>
105+ {
106+ if ( val is not BsonDocument doc )
107+ {
108+ return val ;
109+ }
110+
111+ if ( doc . TryGetValue ( "version" , out var version ) && version . AsInt32 == 1 )
112+ {
113+ doc [ "version" ] = 2 ;
114+ doc [ "age" ] = 30 ;
115+ }
116+
117+ return doc ;
118+ } ;
119+
120+ using ( var db = new LiteDatabase ( ms , mapper ) )
121+ {
122+ var col = db . GetCollection ( "col" ) ;
123+
124+ col . Count ( ) . Should ( ) . Be ( 1 ) ;
125+
126+ var doc = col . FindById ( 1 ) ;
127+
128+ doc [ "version" ] . AsInt32 . Should ( ) . Be ( 2 ) ;
129+ doc [ "name" ] . AsString . Should ( ) . Be ( "John" ) ;
130+ doc [ "age" ] . AsInt32 . Should ( ) . Be ( 30 ) ;
131+ }
132+ }
133+ }
0 commit comments