1
+ using System . Linq ;
2
+ using System . Threading . Tasks ;
3
+ using FluentAssertions ;
4
+ using LinkDotNet . Blog . TestUtilities ;
5
+ using LinkDotNet . Domain ;
6
+ using LinkDotNet . Infrastructure . Persistence ;
7
+ using LinkDotNet . Infrastructure . Persistence . RavenDb ;
8
+ using Raven . Client . Documents ;
9
+ using Raven . TestDriver ;
10
+ using Xunit ;
11
+
12
+ namespace LinkDotNet . Blog . IntegrationTests . Infrastructure . Persistence . RavenDb
13
+ {
14
+ public sealed class BlogPostRepositoryTests : RavenTestDriver
15
+ {
16
+ private static bool serverRunning ;
17
+ private readonly IDocumentStore store ;
18
+ private readonly IRepository < BlogPost > sut ;
19
+
20
+ public BlogPostRepositoryTests ( )
21
+ {
22
+ StartServerIfNotRunning ( ) ;
23
+ store = GetDocumentStore ( ) ;
24
+ sut = new Repository < BlogPost > ( store ) ;
25
+ }
26
+
27
+ [ Fact ]
28
+ public async Task ShouldLoadBlogPost ( )
29
+ {
30
+ var blogPost = BlogPost . Create ( "Title" , "Subtitle" , "Content" , "url" , true , tags : new [ ] { "Tag 1" , "Tag 2" } ) ;
31
+ await SaveBlogPostAsync ( blogPost ) ;
32
+
33
+ var blogPostFromRepo = await sut . GetByIdAsync ( blogPost . Id ) ;
34
+
35
+ blogPostFromRepo . Should ( ) . NotBeNull ( ) ;
36
+ blogPostFromRepo . Title . Should ( ) . Be ( "Title" ) ;
37
+ blogPostFromRepo . ShortDescription . Should ( ) . Be ( "Subtitle" ) ;
38
+ blogPostFromRepo . Content . Should ( ) . Be ( "Content" ) ;
39
+ blogPostFromRepo . PreviewImageUrl . Should ( ) . Be ( "url" ) ;
40
+ blogPostFromRepo . IsPublished . Should ( ) . BeTrue ( ) ;
41
+ blogPostFromRepo . Tags . Should ( ) . HaveCount ( 2 ) ;
42
+ var tagContent = blogPostFromRepo . Tags . Select ( t => t . Content ) . ToList ( ) ;
43
+ tagContent . Should ( ) . Contain ( new [ ] { "Tag 1" , "Tag 2" } ) ;
44
+ }
45
+
46
+ [ Fact ]
47
+ public async Task ShouldFilterAndOrder ( )
48
+ {
49
+ var olderPost = new BlogPostBuilder ( ) . Build ( ) ;
50
+ var newerPost = new BlogPostBuilder ( ) . Build ( ) ;
51
+ var filteredOutPost = new BlogPostBuilder ( ) . WithTitle ( "FilterOut" ) . Build ( ) ;
52
+ await SaveBlogPostAsync ( olderPost , newerPost , filteredOutPost ) ;
53
+ await sut . StoreAsync ( olderPost ) ;
54
+ await sut . StoreAsync ( newerPost ) ;
55
+ await sut . StoreAsync ( filteredOutPost ) ;
56
+
57
+ var blogPosts = await sut . GetAllAsync (
58
+ bp => bp . Title != "FilterOut" ,
59
+ bp => bp . UpdatedDate ,
60
+ false ) ;
61
+
62
+ var retrievedPosts = blogPosts . ToList ( ) ;
63
+ retrievedPosts . Any ( b => b . Id == filteredOutPost . Id ) . Should ( ) . BeFalse ( ) ;
64
+ retrievedPosts [ 0 ] . Id . Should ( ) . Be ( olderPost . Id ) ;
65
+ retrievedPosts [ 1 ] . Id . Should ( ) . Be ( newerPost . Id ) ;
66
+ }
67
+
68
+ [ Fact ]
69
+ public async Task ShouldSaveBlogPost ( )
70
+ {
71
+ var blogPost = BlogPost . Create ( "Title" , "Subtitle" , "Content" , "url" , true , tags : new [ ] { "Tag 1" , "Tag 2" } ) ;
72
+
73
+ await sut . StoreAsync ( blogPost ) ;
74
+
75
+ var blogPostFromContext = await GetBlogPostByIdAsync ( blogPost . Id ) ;
76
+ blogPostFromContext . Should ( ) . NotBeNull ( ) ;
77
+ blogPostFromContext . Title . Should ( ) . Be ( "Title" ) ;
78
+ blogPostFromContext . ShortDescription . Should ( ) . Be ( "Subtitle" ) ;
79
+ blogPostFromContext . Content . Should ( ) . Be ( "Content" ) ;
80
+ blogPostFromContext . IsPublished . Should ( ) . BeTrue ( ) ;
81
+ blogPostFromContext . PreviewImageUrl . Should ( ) . Be ( "url" ) ;
82
+ blogPostFromContext . Tags . Should ( ) . HaveCount ( 2 ) ;
83
+ var tagContent = blogPostFromContext . Tags . Select ( t => t . Content ) . ToList ( ) ;
84
+ tagContent . Should ( ) . Contain ( new [ ] { "Tag 1" , "Tag 2" } ) ;
85
+ }
86
+
87
+ [ Fact ]
88
+ public async Task ShouldGetAllBlogPosts ( )
89
+ {
90
+ var blogPost = BlogPost . Create ( "Title" , "Subtitle" , "Content" , "url" , true , tags : new [ ] { "Tag 1" , "Tag 2" } ) ;
91
+ await SaveBlogPostAsync ( blogPost ) ;
92
+
93
+ var blogPostsFromRepo = ( await sut . GetAllAsync ( ) ) . ToList ( ) ;
94
+
95
+ blogPostsFromRepo . Should ( ) . NotBeNull ( ) ;
96
+ blogPostsFromRepo . Should ( ) . HaveCount ( 1 ) ;
97
+ var blogPostFromRepo = blogPostsFromRepo . Single ( ) ;
98
+ blogPostFromRepo . Title . Should ( ) . Be ( "Title" ) ;
99
+ blogPostFromRepo . ShortDescription . Should ( ) . Be ( "Subtitle" ) ;
100
+ blogPostFromRepo . Content . Should ( ) . Be ( "Content" ) ;
101
+ blogPostFromRepo . PreviewImageUrl . Should ( ) . Be ( "url" ) ;
102
+ blogPostFromRepo . IsPublished . Should ( ) . BeTrue ( ) ;
103
+ blogPostFromRepo . Tags . Should ( ) . HaveCount ( 2 ) ;
104
+ var tagContent = blogPostFromRepo . Tags . Select ( t => t . Content ) . ToList ( ) ;
105
+ tagContent . Should ( ) . Contain ( new [ ] { "Tag 1" , "Tag 2" } ) ;
106
+ }
107
+
108
+ [ Fact ]
109
+ public async Task ShouldBeUpdateable ( )
110
+ {
111
+ var blogPost = new BlogPostBuilder ( ) . Build ( ) ;
112
+ await SaveBlogPostAsync ( blogPost ) ;
113
+ var blogPostFromDb = await sut . GetByIdAsync ( blogPost . Id ) ;
114
+ var updater = new BlogPostBuilder ( ) . WithTitle ( "New Title" ) . Build ( ) ;
115
+ blogPostFromDb . Update ( updater ) ;
116
+
117
+ await sut . StoreAsync ( blogPostFromDb ) ;
118
+
119
+ var blogPostAfterSave = await GetBlogPostByIdAsync ( blogPost . Id ) ;
120
+ blogPostAfterSave . Title . Should ( ) . Be ( "New Title" ) ;
121
+ }
122
+
123
+ [ Fact ]
124
+ public async Task ShouldDelete ( )
125
+ {
126
+ var blogPost = new BlogPostBuilder ( ) . Build ( ) ;
127
+ await SaveBlogPostAsync ( blogPost ) ;
128
+
129
+ await sut . DeleteAsync ( blogPost . Id ) ;
130
+
131
+ using var session = store . OpenAsyncSession ( ) ;
132
+ ( await session . Query < BlogPost > ( ) . AnyAsync ( b => b . Id == blogPost . Id ) ) . Should ( ) . BeFalse ( ) ;
133
+ }
134
+
135
+ public override void Dispose ( )
136
+ {
137
+ base . Dispose ( ) ;
138
+ store . Dispose ( ) ;
139
+ }
140
+
141
+ private static void StartServerIfNotRunning ( )
142
+ {
143
+ if ( ! serverRunning )
144
+ {
145
+ serverRunning = true ;
146
+ ConfigureServer ( new TestServerOptions
147
+ {
148
+ DataDirectory = "./RavenDbTest/" ,
149
+ FrameworkVersion = "6.0.0-preview.7.21378.6" ,
150
+ } ) ;
151
+ }
152
+ }
153
+
154
+ private async Task SaveBlogPostAsync ( params BlogPost [ ] blogPosts )
155
+ {
156
+ using var session = store . OpenAsyncSession ( ) ;
157
+ foreach ( var blogPost in blogPosts )
158
+ {
159
+ await session . StoreAsync ( blogPost ) ;
160
+ }
161
+
162
+ await session . SaveChangesAsync ( ) ;
163
+ }
164
+
165
+ private async Task < BlogPost > GetBlogPostByIdAsync ( string id )
166
+ {
167
+ using var session = store . OpenAsyncSession ( ) ;
168
+ return await session . Query < BlogPost > ( ) . SingleOrDefaultAsync ( s => s . Id == id ) ;
169
+ }
170
+ }
171
+ }
0 commit comments