public async Task Authenticate_Should_Return_Failure_Result_When_Credentials_Are_Empity(string phoneNumber, string password)
        {
            var userRepositoryMock  = new Mock <IUserRepository>();
            var adminRepositoryMock = new Mock <IAdminRepository>();
            var hashingService      = new Mock <IHashingService>();

            var authService  = new PearUpAuthenticationService(userRepositoryMock.Object, hashingService.Object, adminRepositoryMock.Object);
            var actualResult = await authService.Authenticate(phoneNumber, password);

            Assert.IsFalse(actualResult.IsSuccessed);
            Assert.AreEqual(actualResult.GetErrorString(), UserErrorMessages.Phone_Number_And_Password_Are_Required);
        }
        public async Task AuthenticateAdmin_Should_Return_Failure_Result_When_Email_Exist_And_Password_Is_InCorrect(string email, string password)
        {
            var userRepositoryMock  = new Mock <IUserRepository>();
            var adminRepositoryMock = new Mock <IAdminRepository>();
            var hashingService      = new Mock <IHashingService>();

            adminRepositoryMock.Setup(us => us.GetAdminByEmailId(It.IsAny <string>()))
            .ReturnsAsync(Result.Ok(admin));

            hashingService.Setup(hash => hash.SlowEquals(It.IsAny <byte[]>(), It.IsAny <byte[]>()))
            .Returns(false);

            var authService  = new PearUpAuthenticationService(userRepositoryMock.Object, hashingService.Object, adminRepositoryMock.Object);
            var actualResult = await authService.AuthenticateAdmin(email, password);

            Assert.IsFalse(actualResult.IsSuccessed);
            Assert.AreEqual(actualResult.GetErrorString(), UserErrorMessages.Password_Is_Incorrect);
        }
        public async Task AuthenticateAdmin_Should_Return_SuccessResult_When_Credentials_Are_Valid(string email, string password)
        {
            var userRepositoryMock  = new Mock <IUserRepository>();
            var adminRepositoryMock = new Mock <IAdminRepository>();
            var hashingService      = new Mock <IHashingService>();


            adminRepositoryMock.Setup(us => us.GetAdminByEmailId(It.IsAny <string>()))
            .ReturnsAsync(Result.Ok(admin));

            hashingService.Setup(hash => hash.SlowEquals(It.IsAny <byte[]>(), It.IsAny <byte[]>()))
            .Returns(true);

            var authService  = new PearUpAuthenticationService(userRepositoryMock.Object, hashingService.Object, adminRepositoryMock.Object);
            var actualResult = await authService.AuthenticateAdmin(email, password);

            Assert.IsTrue(actualResult.IsSuccessed);
            Assert.AreEqual(actualResult.Value, admin);
        }
        public async Task Authenticate_Should_Return_Failure_Result_When_PhoneNumberExist_And_Password_Is_InCorrect(string phoneNumber, string password)
        {
            var userRepositoryMock  = new Mock <IUserRepository>();
            var adminRepositoryMock = new Mock <IAdminRepository>();
            var hashingService      = new Mock <IHashingService>();

            var successResult = Result.Ok <User>(await Builders.UserBuilder.Builder()
                                                 .WithPhoneNumber("9876543210", "91")
                                                 .BuildAsync());

            userRepositoryMock.Setup(us => us.GetUserByPhoneNumber(It.IsAny <string>()))
            .ReturnsAsync(successResult);

            hashingService.Setup(hash => hash.SlowEquals(It.IsAny <byte[]>(), It.IsAny <byte[]>()))
            .Returns(false);

            var authService  = new PearUpAuthenticationService(userRepositoryMock.Object, hashingService.Object, adminRepositoryMock.Object);
            var actualResult = await authService.Authenticate(phoneNumber, password);

            Assert.IsFalse(actualResult.IsSuccessed);
            Assert.AreEqual(actualResult.GetErrorString(), UserErrorMessages.Password_Is_Incorrect);
        }
        public async Task Authenticate_Should_Return_SuccessResult_When_Credentials_Are_Valid(string PhoneNumber, string Password)
        {
            var userRepositoryMock  = new Mock <IUserRepository>();
            var adminRepositoryMock = new Mock <IAdminRepository>();
            var hashingService      = new Mock <IHashingService>();
            var user = await Builders.UserBuilder.Builder()
                       .WithPhoneNumber("9876543210", "91")
                       .BuildAsync();

            var successResult = Result.Ok <User>(user);

            userRepositoryMock.Setup(us => us.GetUserByPhoneNumber(It.IsAny <string>()))
            .ReturnsAsync(successResult);

            hashingService.Setup(hash => hash.SlowEquals(It.IsAny <byte[]>(), It.IsAny <byte[]>()))
            .Returns(true);

            var authService  = new PearUpAuthenticationService(userRepositoryMock.Object, hashingService.Object, adminRepositoryMock.Object);
            var actualResult = await authService.Authenticate(PhoneNumber, Password);

            Assert.IsTrue(actualResult.IsSuccessed);
            Assert.AreEqual(actualResult.Value, user);
        }