mirror of
https://github.com/bitwarden/server
synced 2025-12-15 07:43:54 +00:00
* [PM-25088] add feature flag for new premium subscription flow * [PM-25088] refactor premium endpoint * forgot the punctuation change in the test * [PM-25088] - pr feedback * [PM-25088] - pr feedback round two
200 lines
5.7 KiB
C#
200 lines
5.7 KiB
C#
using System.Security.Claims;
|
|
using Bit.Core.Billing.Models.Business;
|
|
using Bit.Core.Billing.Premium.Commands;
|
|
using Bit.Core.Billing.Services;
|
|
using Bit.Core.Entities;
|
|
using Bit.Core.Platform.Push;
|
|
using Bit.Core.Services;
|
|
using Microsoft.Extensions.Logging;
|
|
using NSubstitute;
|
|
using Xunit;
|
|
|
|
namespace Bit.Core.Test.Billing.Premium.Commands;
|
|
|
|
public class CreatePremiumSelfHostedSubscriptionCommandTests
|
|
{
|
|
private readonly ILicensingService _licensingService = Substitute.For<ILicensingService>();
|
|
private readonly IUserService _userService = Substitute.For<IUserService>();
|
|
private readonly IPushNotificationService _pushNotificationService = Substitute.For<IPushNotificationService>();
|
|
private readonly CreatePremiumSelfHostedSubscriptionCommand _command;
|
|
|
|
public CreatePremiumSelfHostedSubscriptionCommandTests()
|
|
{
|
|
_command = new CreatePremiumSelfHostedSubscriptionCommand(
|
|
_licensingService,
|
|
_userService,
|
|
_pushNotificationService,
|
|
Substitute.For<ILogger<CreatePremiumSelfHostedSubscriptionCommand>>());
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Run_UserAlreadyPremium_ReturnsBadRequest()
|
|
{
|
|
// Arrange
|
|
var user = new User
|
|
{
|
|
Id = Guid.NewGuid(),
|
|
Premium = true
|
|
};
|
|
|
|
var license = new UserLicense
|
|
{
|
|
LicenseKey = "test_key",
|
|
Expires = DateTime.UtcNow.AddYears(1)
|
|
};
|
|
|
|
// Act
|
|
var result = await _command.Run(user, license);
|
|
|
|
// Assert
|
|
Assert.True(result.IsT1);
|
|
var badRequest = result.AsT1;
|
|
Assert.Equal("Already a premium user.", badRequest.Response);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Run_InvalidLicense_ReturnsBadRequest()
|
|
{
|
|
// Arrange
|
|
var user = new User
|
|
{
|
|
Id = Guid.NewGuid(),
|
|
Premium = false
|
|
};
|
|
|
|
var license = new UserLicense
|
|
{
|
|
LicenseKey = "invalid_key",
|
|
Expires = DateTime.UtcNow.AddYears(1)
|
|
};
|
|
|
|
_licensingService.VerifyLicense(license).Returns(false);
|
|
|
|
// Act
|
|
var result = await _command.Run(user, license);
|
|
|
|
// Assert
|
|
Assert.True(result.IsT1);
|
|
var badRequest = result.AsT1;
|
|
Assert.Equal("Invalid license.", badRequest.Response);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Run_LicenseCannotBeUsed_EmailNotVerified_ReturnsBadRequest()
|
|
{
|
|
// Arrange
|
|
var user = new User
|
|
{
|
|
Id = Guid.NewGuid(),
|
|
Premium = false,
|
|
Email = "test@example.com",
|
|
EmailVerified = false
|
|
};
|
|
|
|
var license = new UserLicense
|
|
{
|
|
LicenseKey = "test_key",
|
|
Expires = DateTime.UtcNow.AddYears(1),
|
|
Token = "valid_token"
|
|
};
|
|
|
|
var claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity(new[]
|
|
{
|
|
new Claim("Email", "test@example.com")
|
|
}));
|
|
|
|
_licensingService.VerifyLicense(license).Returns(true);
|
|
_licensingService.GetClaimsPrincipalFromLicense(license).Returns(claimsPrincipal);
|
|
|
|
// Act
|
|
var result = await _command.Run(user, license);
|
|
|
|
// Assert
|
|
Assert.True(result.IsT1);
|
|
var badRequest = result.AsT1;
|
|
Assert.Contains("The user's email is not verified.", badRequest.Response);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Run_LicenseCannotBeUsed_EmailMismatch_ReturnsBadRequest()
|
|
{
|
|
// Arrange
|
|
var user = new User
|
|
{
|
|
Id = Guid.NewGuid(),
|
|
Premium = false,
|
|
Email = "user@example.com",
|
|
EmailVerified = true
|
|
};
|
|
|
|
var license = new UserLicense
|
|
{
|
|
LicenseKey = "test_key",
|
|
Expires = DateTime.UtcNow.AddYears(1),
|
|
Token = "valid_token"
|
|
};
|
|
|
|
var claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity(new[]
|
|
{
|
|
new Claim("Email", "license@example.com")
|
|
}));
|
|
|
|
_licensingService.VerifyLicense(license).Returns(true);
|
|
_licensingService.GetClaimsPrincipalFromLicense(license).Returns(claimsPrincipal);
|
|
|
|
// Act
|
|
var result = await _command.Run(user, license);
|
|
|
|
// Assert
|
|
Assert.True(result.IsT1);
|
|
var badRequest = result.AsT1;
|
|
Assert.Contains("The user's email does not match the license email.", badRequest.Response);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Run_ValidRequest_Success()
|
|
{
|
|
// Arrange
|
|
var userId = Guid.NewGuid();
|
|
var user = new User
|
|
{
|
|
Id = userId,
|
|
Premium = false,
|
|
Email = "test@example.com",
|
|
EmailVerified = true
|
|
};
|
|
|
|
var license = new UserLicense
|
|
{
|
|
LicenseKey = "test_key_12345",
|
|
Expires = DateTime.UtcNow.AddYears(1),
|
|
Token = "valid_token"
|
|
};
|
|
|
|
var claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity(new[]
|
|
{
|
|
new Claim("Email", "test@example.com")
|
|
}));
|
|
|
|
_licensingService.VerifyLicense(license).Returns(true);
|
|
_licensingService.GetClaimsPrincipalFromLicense(license).Returns(claimsPrincipal);
|
|
|
|
// Act
|
|
var result = await _command.Run(user, license);
|
|
|
|
// Assert
|
|
Assert.True(result.IsT0);
|
|
|
|
// Verify user was updated correctly
|
|
Assert.True(user.Premium);
|
|
Assert.NotNull(user.LicenseKey);
|
|
Assert.Equal(license.LicenseKey, user.LicenseKey);
|
|
Assert.NotEqual(default, user.RevisionDate);
|
|
|
|
// Verify services were called
|
|
await _licensingService.Received(1).WriteUserLicenseAsync(user, license);
|
|
await _userService.Received(1).SaveUserAsync(user);
|
|
await _pushNotificationService.Received(1).PushSyncVaultAsync(user.Id);
|
|
}
|
|
}
|