The core infrastructure backend (API, database, Docker, etc).
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

168 lines
4.1 KiB

using Bit.Admin.Billing.Models;
using Bit.Core.Billing.Enums;
namespace Admin.Test.Billing.Models;
public class SubscriptionDiscountViewModelTests
{
[Fact]
public void DiscountDisplay_WithPercentOff_ReturnsFormattedPercent()
{
var model = new SubscriptionDiscountViewModel
{
PercentOff = 25m
};
Assert.Equal("25% off", model.DiscountDisplay);
}
[Fact]
public void DiscountDisplay_WithDecimalPercentOff_ReturnsFormattedPercentWithDecimals()
{
var model = new SubscriptionDiscountViewModel
{
PercentOff = 33.5m
};
Assert.Equal("33.5% off", model.DiscountDisplay);
}
[Fact]
public void DiscountDisplay_WithWholeNumberPercentOff_ReturnsFormattedPercentWithoutDecimals()
{
var model = new SubscriptionDiscountViewModel
{
PercentOff = 50.00m
};
Assert.Equal("50% off", model.DiscountDisplay);
}
[Fact]
public void DiscountDisplay_WithAmountOff_ReturnsFormattedDollar()
{
var model = new SubscriptionDiscountViewModel
{
AmountOff = 1000
};
Assert.Equal("$10 off", model.DiscountDisplay);
}
[Fact]
public void DiscountDisplay_WithZeroAmountOff_ReturnsZero()
{
var model = new SubscriptionDiscountViewModel
{
AmountOff = 0
};
Assert.Equal("$0 off", model.DiscountDisplay);
}
[Fact]
public void IsRestrictedToNewUsersOnly_WithMatchingAudienceType_ReturnsTrue()
{
var model = new SubscriptionDiscountViewModel
{
AudienceType = DiscountAudienceType.UserHasNoPreviousSubscriptions
};
Assert.True(model.IsRestrictedToNewUsersOnly);
}
[Fact]
public void IsRestrictedToNewUsersOnly_WithAllUsersAudienceType_ReturnsFalse()
{
var model = new SubscriptionDiscountViewModel
{
AudienceType = DiscountAudienceType.AllUsers
};
Assert.False(model.IsRestrictedToNewUsersOnly);
}
[Fact]
public void IsAvailableToAllUsers_WithAllUsersAudienceType_ReturnsTrue()
{
var model = new SubscriptionDiscountViewModel
{
AudienceType = DiscountAudienceType.AllUsers
};
Assert.True(model.IsAvailableToAllUsers);
}
[Fact]
public void IsAvailableToAllUsers_WithRestrictedAudienceType_ReturnsFalse()
{
var model = new SubscriptionDiscountViewModel
{
AudienceType = DiscountAudienceType.UserHasNoPreviousSubscriptions
};
Assert.False(model.IsAvailableToAllUsers);
}
[Fact]
public void IsActive_WhenWithinDateRange_ReturnsTrue()
{
var model = new SubscriptionDiscountViewModel
{
StartDate = DateTime.UtcNow.AddDays(-1),
EndDate = DateTime.UtcNow.AddDays(1)
};
Assert.True(model.IsActive);
}
[Fact]
public void IsActive_WhenBeforeStartDate_ReturnsFalse()
{
var model = new SubscriptionDiscountViewModel
{
StartDate = DateTime.UtcNow.AddDays(1),
EndDate = DateTime.UtcNow.AddDays(2)
};
Assert.False(model.IsActive);
}
[Fact]
public void IsActive_WhenAfterEndDate_ReturnsFalse()
{
var model = new SubscriptionDiscountViewModel
{
StartDate = DateTime.UtcNow.AddDays(-2),
EndDate = DateTime.UtcNow.AddDays(-1)
};
Assert.False(model.IsActive);
}
[Fact]
public void IsActive_WhenExactlyOnStartDate_ReturnsTrue()
{
var now = DateTime.UtcNow;
var model = new SubscriptionDiscountViewModel
{
StartDate = now,
EndDate = now.AddDays(1)
};
Assert.True(model.IsActive);
}
[Fact]
public void IsActive_WhenCurrentTimeIsOnEndDate_ReturnsTrue()
{
var now = DateTime.UtcNow;
var model = new SubscriptionDiscountViewModel
{
StartDate = now.AddDays(-1),
EndDate = now.AddSeconds(1)
};
Assert.True(model.IsActive);
}
}