Skip to content

Commit 3f61c29

Browse files
Add Some New Tests.
1 parent c0ddbf5 commit 3f61c29

File tree

3 files changed

+126
-52
lines changed

3 files changed

+126
-52
lines changed

src/SwiftLink.Application/Behaviors/SubscriberAuthorizationBehavior.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ public async Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TRe
2020
if (_user.Token is null)
2121
throw new SubscriberUnAuthorizedException();
2222

23-
var result = await _dbContext.Set<Subscriber>().FirstOrDefaultAsync(x => x.Token == _user.Token
24-
&& x.IsActive, cancellationToken) ?? throw new SubscriberUnAuthorizedException();
23+
var result = await _dbContext.Set<Subscriber>()
24+
.FirstOrDefaultAsync(x => x.Token == _user.Token
25+
&& x.IsActive, cancellationToken)
26+
?? throw new SubscriberUnAuthorizedException();
2527

2628
_sharedContext.Set(nameof(result.Id), result.Id);
2729
_sharedContext.Set(nameof(result.Name), result.Name);

tests/SwiftLink.Application.UnitTests/UseCases/Links/Commands/GenerateShortCode/GenerateShortCodeCommandHandlerTests.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ namespace SwiftLink.Application.UnitTests.UseCases.Links.Commands.GenerateShortC
1515
public class GenerateShortCodeCommandHandlerTests
1616
{
1717
private readonly IApplicationDbContext _dbContextMock;
18-
private readonly ICacheProvider _cacheProviderMock;
1918
private readonly IShortCodeGenerator _codeGeneratorMock;
2019
private readonly IOptions<AppSettings> _optionsMock;
2120
private readonly ISharedContext _sharedContextMock;
Lines changed: 122 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,163 @@
1-
using FluentAssertions;
1+
using System.Linq.Expressions;
2+
using Azure.Core;
3+
using FluentAssertions;
24
using MediatR;
35
using Microsoft.EntityFrameworkCore;
46
using NSubstitute;
7+
using NSubstitute.ReturnsExtensions;
58
using SwiftLink.Application.Common.Interfaces;
6-
using SwiftLink.Application.Notifications;
79
using SwiftLink.Application.UseCases.Links.Queries;
810
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;
1411
using Xunit;
1512

1613
namespace SwiftLink.Application.UnitTests.UseCases.Links.Queries;
1714

1815
public class VisitShortenLinkQueryHandlerTests
1916
{
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()
2224
{
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+
}
2735

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+
//}
3677

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>();
3785

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+
// };
4091

92+
// // Mocking DbContext
93+
// dbContextMock.Set<Link>().FirstOrDefaultAsync(Arg.Any<Expression<Func<Link, bool>>>(), Arg.Any<CancellationToken>())
94+
// .Returns(bannedLink);
4195

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" };
4398

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);
47101

48-
});
102+
// // Assert
103+
// result.IsSuccess.Should().Be(false);
104+
// // result.Error.Should().Be(LinkMessages.LinkIsBanned);
105+
//}
49106

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" };
52116

53117
// Act
54-
var result = await handler.Handle(query, CancellationToken.None);
118+
var result = await _handler.Handle(query, CancellationToken.None);
55119

56120
// Assert
57-
result.IsSuccess.Should().Be(true);
58-
result.Data.Should().Be(link.OriginalUrl);
59-
121+
result.IsSuccess.Should().Be(false);
60122
}
61123

62124
[Fact]
63-
public async Task Handle_LinkIsBanned_ReturnsFailure()
125+
public async Task Handle_LinkExpired_ReturnsFailure()
64126
{
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);
69135

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
71147
{
72-
ShortCode = "banned123",
73-
IsBanned = true
148+
ShortCode = "protected123",
149+
Password = "correctPassword" // Assuming some hashing in real scenario
74150
};
75151

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);
79154

80-
var handler = new VisitShortenLinkQueryHandler(dbContextMock, cacheProviderMock, mediatorMock);
81-
var query = new VisitShortenLinkQuery { ShortCode = "banned123" };
155+
var query = new VisitShortenLinkQuery { ShortCode = "protected123", Password = "wrongPassword" };
82156

83157
// Act
84-
var result = await handler.Handle(query, CancellationToken.None);
158+
var result = await _handler.Handle(query, CancellationToken.None);
85159

86160
// Assert
87161
result.IsSuccess.Should().Be(false);
88-
// result.Error.Should().Be(LinkMessages.LinkIsBanned);
89162
}
90163
}

0 commit comments

Comments
 (0)