aboutsummaryrefslogtreecommitdiff
path: root/src/Data/DevHive.Data.Tests/FeedRepository.Tests.cs
blob: 5d66bfc3b4be8f0c5b95dff964d1e6693fffca69 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using DevHive.Data.Models;
using DevHive.Data.Repositories;
using Microsoft.EntityFrameworkCore;
using NUnit.Framework;

namespace DevHive.Data.Tests
{
	[TestFixture]
	public class FeedRepositoryTests
	{
		private const int PAGE_NUMBER = 1;
		private const int PAGE_SIZE = 10;

		private DevHiveContext _context;
		private FeedRepository _feedRepository;

		#region Setups
		[SetUp]
		public void Setup()
		{
			DbContextOptionsBuilder<DevHiveContext> optionsBuilder = new DbContextOptionsBuilder<DevHiveContext>()
				.UseInMemoryDatabase(databaseName: "DevHive_Test_Database");

			this._context = new DevHiveContext(optionsBuilder.Options);

			this._feedRepository = new FeedRepository(this._context);
		}

		[TearDown]
		public void TearDown()
		{
			this._context.Database.EnsureDeleted();
		}
		#endregion

		#region GetFriendsPosts
		[Test]
		public async Task GetFriendsPosts_ReturnsListOfPosts_WhenTheyExist()
		{
			User dummyUser = this.CreateDummyUser();
			dummyUser.Posts = await this.CreateDummyPosts(dummyUser);
			List<User> friendsList = new()
			{
				dummyUser
			};

			DateTime dateTime = DateTime.Now;

			List<Post> resultList = await this._feedRepository.GetFriendsPosts(friendsList, dateTime, PAGE_NUMBER, PAGE_SIZE);

			Assert.GreaterOrEqual(resultList.Count, dummyUser.Posts.Count, "GetFriendsPosts does not return the posts corrtrectly");
		}

		[Test]
		public async Task GetFriendsPosts_ReturnsEmptyList_WhenNoSuitablePostsExist()
		{
			User dummyUser = this.CreateDummyUser();
			List<User> friendsList = new()
			{
				dummyUser
			};

			DateTime dateTime = DateTime.Now;

			List<Post> resultList = await this._feedRepository.GetFriendsPosts(friendsList, dateTime, PAGE_NUMBER, PAGE_SIZE);

			Assert.LessOrEqual(resultList.Count, 0, "GetFriendsPosts does not return all correct posts");
		}
		#endregion

		#region GetUsersPosts
		[Test]
		public async Task GetUsersPosts_ReturnsAllPostsOfTheUser_IfAnyExist()
		{
			User dummyUser = this.CreateDummyUser();
			HashSet<Post> posts = await this.CreateDummyPosts(dummyUser);

			DateTime dateTime = DateTime.Now;

			List<Post> resultList = await this._feedRepository.GetUsersPosts(dummyUser, dateTime, PAGE_NUMBER, PAGE_SIZE);

			Assert.GreaterOrEqual(resultList.Count, posts.Count, "GetUsersPosts does not return the posts corrtrectly");
		}

		[Test]
		public async Task GetUsersPosts_ReturnsEmptyList_WhenNoSuitablePostsExist()
		{
			User dummyUser = this.CreateDummyUser();

			DateTime dateTime = DateTime.Now;

			List<Post> resultList = await this._feedRepository.GetUsersPosts(dummyUser, dateTime, PAGE_NUMBER, PAGE_SIZE);

			Assert.LessOrEqual(resultList.Count, 0, "GetUsersPosts does not return empty list when no suitable posts exist");
		}
		#endregion

		#region HelperMethods
		private User CreateDummyUser()
		{
			HashSet<Role> roles = new()
			{
				new Role()
				{
					Id = Guid.NewGuid(),
					Name = Role.DefaultRole
				},
			};

			return new()
			{
				Id = Guid.NewGuid(),
				UserName = "pioneer10",
				FirstName = "Spas",
				LastName = "Spasov",
				Email = "abv@abv.bg",
				Roles = roles
			};
		}

		private async Task<HashSet<Post>> CreateDummyPosts(User user)
		{
			HashSet<Post> posts = new HashSet<Post>
			{
				new Post { Creator = user, TimeCreated = DateTime.Now },
				new Post{ Creator = user, TimeCreated = DateTime.Now },
				new Post{ Creator = user, TimeCreated = DateTime.Now }
			};

			await this._context.Posts.AddRangeAsync(posts);
			await this._context.SaveChangesAsync();

			return posts;
		}
		#endregion
	}
}