Skip to content

Commit 6db0353

Browse files
authored
Merge pull request #26 from linkdotnet/feature/ravendb-integration-tests
Added ravendb tests
2 parents 09427fe + cb838b5 commit 6db0353

File tree

5 files changed

+174
-5
lines changed

5 files changed

+174
-5
lines changed

.github/workflows/codeql.yml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,6 @@ jobs:
2222
dotnet-version: 6.0.x
2323
include-prerelease: true
2424

25-
- run: git checkout HEAD^2
26-
if: ${{ github.event_name == 'pull_request' }}
27-
2825
- name: Initialize CodeQL
2926
uses: github/codeql-action/init@v1
3027

.github/workflows/dotnet.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
- name: Build
2424
run: dotnet build --no-restore
2525
- name: Test
26-
run: dotnet test --no-build --verbosity normal /p:CollectCoverage=true /p:CoverletOutputFormat=opencover
26+
run: dotnet test --collect:"XPlat Code Coverage" --no-build --verbosity normal /p:CollectCoverage=true /p:CoverletOutputFormat=opencover
2727
- name: Codecov
2828
uses: codecov/codecov-action@v2
2929
with:
Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
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+
}

LinkDotNet.Blog.IntegrationTests/LinkDotNet.Blog.IntegrationTests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="6.0.0-preview.7.21378.4" />
1212
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
1313
<PackageReference Include="Moq" Version="4.16.1" />
14+
<PackageReference Include="RavenDB.TestDriver" Version="5.2.2" />
1415
<PackageReference Include="SonarAnalyzer.CSharp" Version="8.28.0.36354">
1516
<PrivateAssets>all</PrivateAssets>
1617
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

LinkDotNet.Infrastructure/Persistence/RavenDb/Repository.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public async Task<IPagedList<TEntity>> GetAllAsync(
3131
int page = 1,
3232
int pageSize = int.MaxValue)
3333
{
34-
using var session = documentStore.OpenAsyncSession();
34+
using var session = documentStore.OpenSession();
3535

3636
var query = session.Query<TEntity>();
3737
if (filter != null)

0 commit comments

Comments
 (0)