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.
150 lines
4.5 KiB
150 lines
4.5 KiB
using System.ComponentModel.DataAnnotations; |
|
using Bit.Api.Auth.Models.Request; |
|
using Bit.Core.Auth.Entities; |
|
using Bit.Core.Auth.Enums; |
|
using Xunit; |
|
|
|
namespace Bit.Api.Test.Auth.Models.Request; |
|
|
|
public class EmergencyAccessInviteRequestModelTests |
|
{ |
|
[Theory] |
|
[InlineData(0)] |
|
[InlineData(-1)] |
|
[InlineData(-100)] |
|
public void Validate_WaitTimeDays_BelowMinimum_Invalid(int waitTimeDays) |
|
{ |
|
var model = new EmergencyAccessInviteRequestModel |
|
{ |
|
Email = "test@example.com", |
|
Type = EmergencyAccessType.View, |
|
WaitTimeDays = waitTimeDays, |
|
}; |
|
var result = Validate(model); |
|
Assert.Contains(result, r => r.MemberNames.Contains("WaitTimeDays")); |
|
} |
|
|
|
[Theory] |
|
[InlineData(1)] |
|
[InlineData(7)] |
|
[InlineData(90)] |
|
[InlineData(short.MaxValue)] |
|
public void Validate_WaitTimeDays_ValidRange_Valid(int waitTimeDays) |
|
{ |
|
var model = new EmergencyAccessInviteRequestModel |
|
{ |
|
Email = "test@example.com", |
|
Type = EmergencyAccessType.View, |
|
WaitTimeDays = waitTimeDays, |
|
}; |
|
var result = Validate(model); |
|
Assert.DoesNotContain(result, r => r.MemberNames.Contains("WaitTimeDays")); |
|
} |
|
|
|
private static List<ValidationResult> Validate(EmergencyAccessInviteRequestModel model) |
|
{ |
|
var results = new List<ValidationResult>(); |
|
Validator.TryValidateObject(model, new ValidationContext(model), results, true); |
|
return results; |
|
} |
|
} |
|
|
|
public class EmergencyAccessUpdateRequestModelTests |
|
{ |
|
[Theory] |
|
[InlineData(0)] |
|
[InlineData(-1)] |
|
[InlineData(-100)] |
|
public void Validate_WaitTimeDays_BelowMinimum_Invalid(int waitTimeDays) |
|
{ |
|
var model = new EmergencyAccessUpdateRequestModel |
|
{ |
|
Type = EmergencyAccessType.View, |
|
WaitTimeDays = waitTimeDays, |
|
}; |
|
var result = Validate(model); |
|
Assert.Contains(result, r => r.MemberNames.Contains("WaitTimeDays")); |
|
} |
|
|
|
[Theory] |
|
[InlineData(1)] |
|
[InlineData(7)] |
|
[InlineData(90)] |
|
[InlineData(short.MaxValue)] |
|
public void Validate_WaitTimeDays_ValidRange_Valid(int waitTimeDays) |
|
{ |
|
var model = new EmergencyAccessUpdateRequestModel |
|
{ |
|
Type = EmergencyAccessType.View, |
|
WaitTimeDays = waitTimeDays, |
|
}; |
|
var result = Validate(model); |
|
Assert.DoesNotContain(result, r => r.MemberNames.Contains("WaitTimeDays")); |
|
} |
|
|
|
[Fact] |
|
public void ToEmergencyAccess_BothKeysPresent_UpdatesKey() |
|
{ |
|
var model = new EmergencyAccessUpdateRequestModel |
|
{ |
|
Type = EmergencyAccessType.Takeover, |
|
WaitTimeDays = 7, |
|
KeyEncrypted = "new-encrypted-key", |
|
}; |
|
var existing = new EmergencyAccess { KeyEncrypted = "old-encrypted-key" }; |
|
|
|
var result = model.ToEmergencyAccess(existing); |
|
|
|
Assert.Equal("new-encrypted-key", result.KeyEncrypted); |
|
} |
|
|
|
[Theory] |
|
[InlineData(null, "new-encrypted-key")] |
|
[InlineData("", "new-encrypted-key")] |
|
[InlineData(" ", "new-encrypted-key")] |
|
[InlineData("old-encrypted-key", null)] |
|
[InlineData("old-encrypted-key", "")] |
|
[InlineData("old-encrypted-key", " ")] |
|
public void ToEmergencyAccess_EitherKeyMissingOrWhitespace_DoesNotUpdateKey( |
|
string? existingKey, string? newKey) |
|
{ |
|
var model = new EmergencyAccessUpdateRequestModel |
|
{ |
|
Type = EmergencyAccessType.Takeover, |
|
WaitTimeDays = 7, |
|
KeyEncrypted = newKey, |
|
}; |
|
var existing = new EmergencyAccess { KeyEncrypted = existingKey }; |
|
|
|
var result = model.ToEmergencyAccess(existing); |
|
|
|
Assert.Equal(existingKey, result.KeyEncrypted); |
|
} |
|
|
|
[Fact] |
|
public void ToEmergencyAccess_AlwaysUpdatesTypeAndWaitTimeDays() |
|
{ |
|
var model = new EmergencyAccessUpdateRequestModel |
|
{ |
|
Type = EmergencyAccessType.Takeover, |
|
WaitTimeDays = 14, |
|
}; |
|
var existing = new EmergencyAccess |
|
{ |
|
Type = EmergencyAccessType.View, |
|
WaitTimeDays = 7, |
|
}; |
|
|
|
var result = model.ToEmergencyAccess(existing); |
|
|
|
Assert.Equal(EmergencyAccessType.Takeover, result.Type); |
|
Assert.Equal(14, result.WaitTimeDays); |
|
} |
|
|
|
private static List<ValidationResult> Validate(EmergencyAccessUpdateRequestModel model) |
|
{ |
|
var results = new List<ValidationResult>(); |
|
Validator.TryValidateObject(model, new ValidationContext(model), results, true); |
|
return results; |
|
} |
|
}
|
|
|