aboutsummaryrefslogtreecommitdiff
path: root/BackEnd/Timeline.Tests/Services/ServiceTestBase.cs
blob: 7153e99bde5baf5ab3c3a6cfe5232515c5a6cdf4 (plain)
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
using Microsoft.Extensions.Logging.Abstractions;
using System.Threading.Tasks;
using Timeline.Entities;
using Timeline.Services.Timeline;
using Timeline.Services.User;
using Timeline.Tests.Helpers;
using Xunit;
using Xunit.Abstractions;

namespace Timeline.Tests.Services
{
    public abstract class ServiceTestBase : IAsyncLifetime
    {
        protected TestDatabase TestDatabase { get; }
        protected DatabaseContext Database { get; private set; } = default!;

        private readonly ITestOutputHelper? _testOutputHelper;

        protected TestClock Clock { get; } = new TestClock();
        protected UserService UserService { get; private set; } = default!;
        protected TimelineService TimelineService { get; private set; } = default!;

        protected long UserId { get; private set; }
        protected long AdminId { get; private set; }

        protected ServiceTestBase(ITestOutputHelper? testOutputHelper = null)
        {
            _testOutputHelper = testOutputHelper;
            TestDatabase = new TestDatabase();
        }

        public async Task InitializeAsync()
        {
            await TestDatabase.InitializeAsync();
            Database = TestDatabase.CreateContext(_testOutputHelper);

            UserService = new UserService(NullLogger<UserService>.Instance, Database, new PasswordService(), Clock);
            TimelineService = new TimelineService(NullLoggerFactory.Instance, Database, UserService, Clock);

            UserId = await UserService.GetUserIdByUsernameAsync("user");
            AdminId = await UserService.GetUserIdByUsernameAsync("admin");

            await OnInitializeAsync();
            OnInitialize();
        }

        public async Task DisposeAsync()
        {
            OnDispose();
            await OnDisposeAsync();
            await Database.DisposeAsync();
            await TestDatabase.DisposeAsync();
        }


        protected virtual void OnInitialize() { }
        protected virtual void OnDispose() { }


        protected virtual Task OnInitializeAsync()
        {
            return Task.CompletedTask;
        }

        protected virtual Task OnDisposeAsync()
        {
            return Task.CompletedTask;
        }
    }
}