package org.initialde.yakasave.Unit;

import org.initialde.yakasave.Api.Requests.RegisterRequest;
import org.initialde.yakasave.Application.Register;

import org.initialde.yakasave.UserFactory;
import org.initialde.yakasave.Domain.Exceptions.UserAlreadyExitsException;
import org.initialde.yakasave.Infrastructure.Persistence.Fake.InMemoryUserRepository;
import org.junit.jupiter.api.Test;

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

public class RegisterTests {
    @Test
    public void shouldCreateUserAccount() {
        var username = "user";
        var password = "1234";
        var userRepository = new InMemoryUserRepository();
        var registerRequest = new RegisterRequest(username, password);
        var register = new Register(userRepository);
        register.handle(registerRequest);

        assertTrue(userRepository.existsByUsername(username));
    }

    @Test
    public void shouldNotCreateUserAccountWhenAlreadyExistsWithSameUsername() {
        var sameUsername = "user";
        var password = "1234";
        var user = UserFactory.create( "user", "password");

        var userRepository = new InMemoryUserRepository();
        userRepository.save(user);

        var register = new Register(userRepository);
        var registerRequest = new RegisterRequest(sameUsername, password);
        assertThrowsExactly(UserAlreadyExitsException.class, () -> register.handle(registerRequest));
    }
}
