using Shouldly; namespace MyTelegram.Domain.Tests.UnitTests.Aggregates.AppCode; public class AppCodeAggregateTests : TestsFor { private readonly string _inValidPhoneCodeHash = "2"; private readonly int _maxFailedCount = 5; private readonly string _phoneNumber = "0"; private readonly string _validPhoneCodeHash = "1"; public AppCodeAggregateTests() { Fixture.Customize(c => c.FromFactory(() => AppCodeId.Create(_phoneNumber, _validPhoneCodeHash))); } [Fact] public void Cancel_AppCode_Success() { CreateAppCodeAggregate(); Sut.CancelCode(A(), _phoneNumber, _validPhoneCodeHash); Sut.UncommittedEvents.Single().AggregateEvent.ShouldBeOfType(); } //[Fact] //public void CheckSignInCode_Exceeded_Max_Failed_Count_Throws_Exception() //{ // CreateAppCodeAggregate(); // var aggregateEvent = new CheckSignInCodeCompletedEvent(A(), false, 1); // var aggregateEvents = Enumerable.Repeat(aggregateEvent, _maxFailedCount + 1); // var domainEvents = aggregateEvents.Select((p, // index) => ADomainEvent(p, Sut.Version + index + 1)) // .ToList(); // Sut.ApplyEvents(domainEvents); // var exception = Assert.Throws(() => Sut.CheckSignInCode(A(), _validPhoneCodeHash, A())); // exception.Message.ShouldBe(RpcErrors.RpcErrors400.PhoneCodeInvalid.Message); //} //[Fact] //public void CheckSignInCode_With_Canceled_Code_Throws_Exception() //{ // CreateAppCodeAggregate(); // var domainEvent = ADomainEvent(Sut.Version + 1); // Sut.ApplyEvents(new IDomainEvent[] { domainEvent }); // var exception = Assert.Throws(() => Sut.CheckSignInCode(A(), _validPhoneCodeHash, A())); // exception.Message.ShouldBe(RpcErrors.RpcErrors400.PhoneCodeExpired.Message); //} [Fact] public void CheckSignInCode_With_Correct_PhoneCode() { CreateAppCodeAggregate(); Sut.CheckSignInCode(A(), _validPhoneCodeHash, A()); Sut.UncommittedEvents.Single().AggregateEvent.ShouldBeOfType(); } //[Fact] //public void CheckSignInCode_With_Empty_PhoneCode_Throws_Exception() //{ // CreateAppCodeAggregate(expireMinutes: -5); // var exception = Assert.Throws(() => Sut.CheckSignInCode(A(), string.Empty, A())); // exception.Message.ShouldBe(RpcErrors.RpcErrors400.PhoneCodeEmpty.Message); //} //[Fact] //public void CheckSignInCode_With_Expire_PhoneCode_Throws_Exception() //{ // CreateAppCodeAggregate(expireMinutes: -5); // var exception = Assert.Throws(() => Sut.CheckSignInCode(A(), _validPhoneCodeHash, A())); // exception.Message.ShouldBe(RpcErrors.RpcErrors400.PhoneCodeExpired.Message); //} [Fact] public void CheckSignInCode_With_Invalid_PhoneCode() { CreateAppCodeAggregate(); Sut.CheckSignInCode(A(), _inValidPhoneCodeHash, A()); var checkSignUpCodeCompletedEvent = Sut.UncommittedEvents.Single().AggregateEvent.ShouldBeOfType(); checkSignUpCodeCompletedEvent.IsCodeValid.ShouldBeFalse(); } //[Fact] //public void CheckSignUpCode_Exceeded_Max_Failed_Count_Throws_Exception() //{ // CreateAppCodeAggregate(); // var aggregateEvent = new CheckSignUpCodeCompletedEvent(A(), false, 1, 0, "0", "0", null, Guid.Empty); // var aggregateEvents = Enumerable.Repeat(aggregateEvent, _maxFailedCount + 1); // var domainEvents = aggregateEvents.Select((p, // index) => ADomainEvent(p, Sut.Version + index + 1)) // .ToList(); // Sut.ApplyEvents(domainEvents); // var exception = Assert.Throws(() => Sut.CheckSignUpCode(A(), // 0, // _validPhoneCodeHash, // 0, // _phoneNumber, // "0", // null, // Guid.Empty)); // exception.Message.ShouldBe(RpcErrorMessages.PhoneCodeInvalid); //} //[Fact] //public void CheckSignUpCode_With_Canceled_Code_Throws_Exception() //{ // CreateAppCodeAggregate(); // var domainEvent = ADomainEvent(Sut.Version + 1); // Sut.ApplyEvents(new IDomainEvent[] { domainEvent }); // var exception = Assert.Throws(() => Sut.CheckSignUpCode(A(), // 0, // _validPhoneCodeHash, // 0, // _phoneNumber, // "0", // null, // Guid.Empty)); // exception.Message.ShouldBe(RpcErrorMessages.PhoneCodeExpired); //} [Fact] public void CheckSignUpCode_With_Correct_PhoneCode_For_New_User() { CreateAppCodeAggregate(); Sut.CheckSignUpCode( A(), 0, _validPhoneCodeHash, 0, _phoneNumber, "0", null); //Sut.UncommittedEvents.Single().AggregateEvent.ShouldBeOfType(); var uncommittedEvent = Sut.UncommittedEvents.Single().AggregateEvent.ShouldBeOfType(); uncommittedEvent.IsCodeValid.ShouldBeTrue(); } [Fact] public void CheckSignUpCode_With_Correct_PhoneCode_For_Old_User() { var oldUid = 1; CreateAppCodeAggregate(oldUid); Sut.CheckSignUpCode(A(), oldUid, _validPhoneCodeHash, 0, _phoneNumber, "0", null); var checkSignUpCodeCompletedEvent = Sut.UncommittedEvents.Single().AggregateEvent.ShouldBeOfType(); checkSignUpCodeCompletedEvent.IsCodeValid.ShouldBeTrue(); checkSignUpCodeCompletedEvent.UserId.ShouldBe(oldUid); checkSignUpCodeCompletedEvent.PhoneNumber.ShouldBe(_phoneNumber); } //[Fact] //public void CheckSignUpCode_With_Empty_PhoneCode_Throws_Exception() //{ // CreateAppCodeAggregate(expireMinutes: -5); // var exception = Assert.Throws(() => Sut.CheckSignUpCode(A(), // 0, // string.Empty, // 0, // _phoneNumber, // "0", // null, // Guid.Empty)); // exception.Message.ShouldBe(RpcErrorMessages.PhoneCodeEmpty); //} //[Fact] //public void CheckSignUpCode_With_Expire_PhoneCode_Throws_Exception() //{ // CreateAppCodeAggregate(expireMinutes: -5); // var exception = Assert.Throws(() => Sut.CheckSignUpCode(A(), // 0, // _validPhoneCodeHash, // 0, // _phoneNumber, // "0", // null, // Guid.Empty)); // exception.Message.ShouldBe(RpcErrorMessages.PhoneCodeExpired); //} //[Fact] //public void CheckSignUpCode_With_Invalid_PhoneCode() //{ // CreateAppCodeAggregate(); // Sut.CheckSignUpCode(A(), 0, _inValidPhoneCodeHash, 0, _phoneNumber, "0", null, Guid.Empty); // var checkSignUpCodeCompletedEvent = Sut.UncommittedEvents.Single().AggregateEvent.ShouldBeOfType(); // checkSignUpCodeCompletedEvent.IsCodeValid.ShouldBeFalse(); //} //[Fact] //public void CreateAppCode_Success() //{ // Sut.Create(A(), A(), A(), A(), A(), A(), A()); // Sut.UncommittedEvents.Single().AggregateEvent.ShouldBeOfType(); //} private void CreateAppCodeAggregate(long uid = 0, int expireMinutes = 5) { var aggregateId = A(); var appCodeCreatedEvent = new AppCodeCreatedEvent(A(), uid, _phoneNumber, "0", DateTime.UtcNow.AddMinutes(expireMinutes).ToTimestamp(), _validPhoneCodeHash, 0); Sut.ApplyEvents(new IDomainEvent[] { new DomainEvent(appCodeCreatedEvent, Metadata.Empty, DateTimeOffset.UtcNow, aggregateId, 1) }); } }