package org.initialde.yakasave.Unit;

import org.initialde.yakasave.Api.Requests.LoginRequest;
import org.initialde.yakasave.Application.Login;
import org.initialde.yakasave.Domain.Exceptions.PasswordNotMatchesException;
import org.initialde.yakasave.Domain.Exceptions.UserNotFoundException;
import org.initialde.yakasave.Infrastructure.Persistence.Fake.InMemoryUserRepository;
import org.initialde.yakasave.Infrastructure.authentication.FakeAuthenticationGateway;
import org.initialde.yakasave.Infrastructure.authentication.Jwt.fake.FakeJwtService;
import org.initialde.yakasave.UserFactory;
import org.junit.jupiter.api.Test;


import static org.junit.jupiter.api.Assertions.*;

public class LoginTests {
    @Test
    public void shouldGenerateRightTokenWhenUserAttemptWithValidCredentials() {
        var username = "user";
        var password = "1234";
        var user = UserFactory.create(username, password);
        var userRepository = new InMemoryUserRepository();
        userRepository.save(user);

        var expectedToken = "fake-token-for-" + user.getUsername();
        var tokenGenerator = new FakeJwtService();
        tokenGenerator.setupFakeToken(expectedToken);

        var request = new LoginRequest(username, password);
        var authenticationGateway = new FakeAuthenticationGateway(tokenGenerator);

        var login = new Login(authenticationGateway);
        String token = login.handle(request);

        assertEquals(expectedToken, token);
    }
}
