|
1 | | -using FluentAssertions; |
| 1 | +using System.Linq.Expressions; |
| 2 | +using Azure.Core; |
| 3 | +using FluentAssertions; |
2 | 4 | using MediatR; |
3 | 5 | using Microsoft.EntityFrameworkCore; |
4 | 6 | using NSubstitute; |
| 7 | +using NSubstitute.ReturnsExtensions; |
5 | 8 | using SwiftLink.Application.Common.Interfaces; |
6 | | -using SwiftLink.Application.Notifications; |
7 | 9 | using SwiftLink.Application.UseCases.Links.Queries; |
8 | 10 | using SwiftLink.Domain.Entities; |
9 | | -using System; |
10 | | -using System.Linq.Expressions; |
11 | | -using System.Text.Json; |
12 | | -using System.Threading; |
13 | | -using System.Threading.Tasks; |
14 | 11 | using Xunit; |
15 | 12 |
|
16 | 13 | namespace SwiftLink.Application.UnitTests.UseCases.Links.Queries; |
17 | 14 |
|
18 | 15 | public class VisitShortenLinkQueryHandlerTests |
19 | 16 | { |
20 | | - [Fact] |
21 | | - public async Task Handle_ValidRequest_ReturnsOriginalUrl() |
| 17 | + |
| 18 | + private readonly IApplicationDbContext _dbContextMock; |
| 19 | + private readonly IMediator _mediatorMock; |
| 20 | + private readonly VisitShortenLinkQueryHandler _handler; |
| 21 | + private readonly ICacheProvider _cacheProviderMock; |
| 22 | + |
| 23 | + public VisitShortenLinkQueryHandlerTests() |
22 | 24 | { |
23 | | - // Arrange |
24 | | - var dbContextMock = Substitute.For<IApplicationDbContext>(); |
25 | | - var cacheProviderMock = Substitute.For<ICacheProvider>(); |
26 | | - var mediatorMock = Substitute.For<IMediator>(); |
| 25 | + _dbContextMock = Substitute.For<IApplicationDbContext>(); |
| 26 | + _cacheProviderMock = Substitute.For<ICacheProvider>(); |
| 27 | + _mediatorMock = Substitute.For<IMediator>(); |
| 28 | + |
| 29 | + _handler = new VisitShortenLinkQueryHandler( |
| 30 | + _dbContextMock, |
| 31 | + _cacheProviderMock, |
| 32 | + _mediatorMock |
| 33 | + ); |
| 34 | + } |
27 | 35 |
|
28 | | - var link = new Link |
29 | | - { |
30 | | - ShortCode = "abc123", |
31 | | - OriginalUrl = "https://example.com", |
32 | | - IsBanned = false, |
33 | | - ExpirationDate = DateTime.Now.AddDays(1), |
34 | | - Password = null |
35 | | - }; |
| 36 | + //[Fact] |
| 37 | + //public async Task Handle_ValidRequest_ReturnsOriginalUrl() |
| 38 | + //{ |
| 39 | + // // Arrange |
| 40 | + // var dbContextMock = Substitute.For<IApplicationDbContext>(); |
| 41 | + // var cacheProviderMock = Substitute.For<ICacheProvider>(); |
| 42 | + // var mediatorMock = Substitute.For<IMediator>(); |
| 43 | + |
| 44 | + // var link = new Link |
| 45 | + // { |
| 46 | + // ShortCode = "abc123", |
| 47 | + // OriginalUrl = "https://example.com", |
| 48 | + // IsBanned = false, |
| 49 | + // ExpirationDate = DateTime.Now.AddDays(1), |
| 50 | + // Password = null |
| 51 | + // }; |
| 52 | + |
| 53 | + |
| 54 | + // dbContextMock.Set<Link>().FirstOrDefaultAsync(Arg.Any<Expression<Func<Link, bool>>>(), Arg.Any<CancellationToken>()) |
| 55 | + // .Returns(link); |
| 56 | + |
| 57 | + |
| 58 | + // cacheProviderMock.Get(Arg.Any<string>()).Returns(JsonSerializer.Serialize(link)); |
| 59 | + |
| 60 | + // mediatorMock.WhenForAnyArgs(x => x.Publish(Arg.Any<VisitLinkNotification>(), Arg.Any<CancellationToken>())) |
| 61 | + // .Do(x => |
| 62 | + // { |
| 63 | + |
| 64 | + // }); |
| 65 | + |
| 66 | + // var handler = new VisitShortenLinkQueryHandler(dbContextMock, cacheProviderMock, mediatorMock); |
| 67 | + // var query = new VisitShortenLinkQuery { ShortCode = "abc123" }; |
| 68 | + |
| 69 | + // // Act |
| 70 | + // var result = await handler.Handle(query, CancellationToken.None); |
| 71 | + |
| 72 | + // // Assert |
| 73 | + // result.IsSuccess.Should().Be(true); |
| 74 | + // result.Data.Should().Be(link.OriginalUrl); |
| 75 | + |
| 76 | + //} |
36 | 77 |
|
| 78 | + //[Fact] |
| 79 | + //public async Task Handle_LinkIsBanned_ReturnsFailure() |
| 80 | + //{ |
| 81 | + // // Arrange |
| 82 | + // var dbContextMock = Substitute.For<IApplicationDbContext>(); |
| 83 | + // var cacheProviderMock = Substitute.For<ICacheProvider>(); |
| 84 | + // var mediatorMock = Substitute.For<IMediator>(); |
37 | 85 |
|
38 | | - dbContextMock.Set<Link>().FirstOrDefaultAsync(Arg.Any<Expression<Func<Link, bool>>>(), Arg.Any<CancellationToken>()) |
39 | | - .Returns(link); |
| 86 | + // var bannedLink = new Link |
| 87 | + // { |
| 88 | + // ShortCode = "banned123", |
| 89 | + // IsBanned = true |
| 90 | + // }; |
40 | 91 |
|
| 92 | + // // Mocking DbContext |
| 93 | + // dbContextMock.Set<Link>().FirstOrDefaultAsync(Arg.Any<Expression<Func<Link, bool>>>(), Arg.Any<CancellationToken>()) |
| 94 | + // .Returns(bannedLink); |
41 | 95 |
|
42 | | - cacheProviderMock.Get(Arg.Any<string>()).Returns(JsonSerializer.Serialize(link)); |
| 96 | + // var handler = new VisitShortenLinkQueryHandler(dbContextMock, cacheProviderMock, mediatorMock); |
| 97 | + // var query = new VisitShortenLinkQuery { ShortCode = "banned123" }; |
43 | 98 |
|
44 | | - mediatorMock.WhenForAnyArgs(x => x.Publish(Arg.Any<VisitLinkNotification>(), Arg.Any<CancellationToken>())) |
45 | | - .Do(x => |
46 | | - { |
| 99 | + // // Act |
| 100 | + // var result = await handler.Handle(query, CancellationToken.None); |
47 | 101 |
|
48 | | - }); |
| 102 | + // // Assert |
| 103 | + // result.IsSuccess.Should().Be(false); |
| 104 | + // // result.Error.Should().Be(LinkMessages.LinkIsBanned); |
| 105 | + //} |
49 | 106 |
|
50 | | - var handler = new VisitShortenLinkQueryHandler(dbContextMock, cacheProviderMock, mediatorMock); |
51 | | - var query = new VisitShortenLinkQuery { ShortCode = "abc123" }; |
| 107 | + |
| 108 | + [Fact] |
| 109 | + public async Task Handle_LinkNotFound_ReturnsFailure() |
| 110 | + { |
| 111 | + _cacheProviderMock.Get(Arg.Any<string>()).Returns((string)null); |
| 112 | + _dbContextMock.Set<Link>().ReturnsForAnyArgs(Substitute.For<DbSet<Link>>()); |
| 113 | + _dbContextMock.Set<Link>().FirstOrDefaultAsync(Arg.Any<Expression<Func<Link, bool>>>(), Arg.Any<CancellationToken>()) |
| 114 | + .ReturnsNull(); |
| 115 | + var query = new VisitShortenLinkQuery { ShortCode = "nonexistent123" }; |
52 | 116 |
|
53 | 117 | // Act |
54 | | - var result = await handler.Handle(query, CancellationToken.None); |
| 118 | + var result = await _handler.Handle(query, CancellationToken.None); |
55 | 119 |
|
56 | 120 | // Assert |
57 | | - result.IsSuccess.Should().Be(true); |
58 | | - result.Data.Should().Be(link.OriginalUrl); |
59 | | - |
| 121 | + result.IsSuccess.Should().Be(false); |
60 | 122 | } |
61 | 123 |
|
62 | 124 | [Fact] |
63 | | - public async Task Handle_LinkIsBanned_ReturnsFailure() |
| 125 | + public async Task Handle_LinkExpired_ReturnsFailure() |
64 | 126 | { |
65 | | - // Arrange |
66 | | - var dbContextMock = Substitute.For<IApplicationDbContext>(); |
67 | | - var cacheProviderMock = Substitute.For<ICacheProvider>(); |
68 | | - var mediatorMock = Substitute.For<IMediator>(); |
| 127 | + var expiredLink = new Link |
| 128 | + { |
| 129 | + ShortCode = "expired123", |
| 130 | + ExpirationDate = DateTime.Now.AddDays(-1) |
| 131 | + }; |
| 132 | + |
| 133 | + _dbContextMock.Set<Link>().FirstOrDefaultAsync(Arg.Any<Expression<Func<Link, bool>>>(), Arg.Any<CancellationToken>()) |
| 134 | + .Returns(expiredLink); |
69 | 135 |
|
70 | | - var bannedLink = new Link |
| 136 | + // Act |
| 137 | + var result = await _handler.Handle(new VisitShortenLinkQuery { ShortCode = "expired123" }, CancellationToken.None); |
| 138 | + |
| 139 | + // Assert |
| 140 | + result.IsSuccess.Should().Be(false); |
| 141 | + } |
| 142 | + |
| 143 | + [Fact] |
| 144 | + public async Task Handle_LinkRequiresPassword_ReturnsFailureOnIncorrectPassword() |
| 145 | + { |
| 146 | + var passwordProtectedLink = new Link |
71 | 147 | { |
72 | | - ShortCode = "banned123", |
73 | | - IsBanned = true |
| 148 | + ShortCode = "protected123", |
| 149 | + Password = "correctPassword" // Assuming some hashing in real scenario |
74 | 150 | }; |
75 | 151 |
|
76 | | - // Mocking DbContext |
77 | | - dbContextMock.Set<Link>().FirstOrDefaultAsync(Arg.Any<Expression<Func<Link, bool>>>(), Arg.Any<CancellationToken>()) |
78 | | - .Returns(bannedLink); |
| 152 | + _dbContextMock.Set<Link>().FirstOrDefaultAsync(Arg.Any<Expression<Func<Link, bool>>>(), Arg.Any<CancellationToken>()) |
| 153 | + .Returns(passwordProtectedLink); |
79 | 154 |
|
80 | | - var handler = new VisitShortenLinkQueryHandler(dbContextMock, cacheProviderMock, mediatorMock); |
81 | | - var query = new VisitShortenLinkQuery { ShortCode = "banned123" }; |
| 155 | + var query = new VisitShortenLinkQuery { ShortCode = "protected123", Password = "wrongPassword" }; |
82 | 156 |
|
83 | 157 | // Act |
84 | | - var result = await handler.Handle(query, CancellationToken.None); |
| 158 | + var result = await _handler.Handle(query, CancellationToken.None); |
85 | 159 |
|
86 | 160 | // Assert |
87 | 161 | result.IsSuccess.Should().Be(false); |
88 | | - // result.Error.Should().Be(LinkMessages.LinkIsBanned); |
89 | 162 | } |
90 | 163 | } |
0 commit comments