package de.accso.flexinale.security.infrastructure.persistence;

import de.accso.flexinale.FlexinaleDistributedApplicationTestIntegrated;
import de.accso.flexinale.common.shared_kernel.DoNotCheckInArchitectureTests;
import de.accso.flexinale.common.shared_kernel.Identifiable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit.jupiter.SpringExtension;

import static de.accso.flexinale.shared_code_for_test.TestDataBuilder.createBenutzerEntity;
import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest(classes = {FlexinaleDistributedApplicationTestIntegrated.class})
@ActiveProfiles("test-integrated")
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
@ExtendWith(SpringExtension.class)
@DoNotCheckInArchitectureTests
public class BenutzerSecurityAndPersistenceTest {

    @Autowired
    private BenutzerDao benutzerDao;

    @Test
    void saveAndFindAndDeleteBesucher() {
        // arrange
        BenutzerEntity benutzer = createBenutzerEntity();
        Identifiable.Id benutzerId = Identifiable.Id.of(benutzer.id);

        // act
        benutzer = benutzerDao.save(benutzer);

        // assert
        assertThat(benutzerDao.findById(benutzerId)).isNotEmpty();

        // cleanup
        benutzerDao.deleteById(benutzerId);

        // assert
        assertThat(benutzerDao.findById(benutzerId)).isEmpty();
    }

    @Test
    void saveAndFindByLoginAndDelete() {
        // arrange
        BenutzerEntity benutzer = createBenutzerEntity();
        Identifiable.Id benutzerId = Identifiable.Id.of(benutzer.id);

        // act
        benutzer = benutzerDao.save(benutzer);

        // assert
        assertThat(benutzerDao.findByLogin(benutzer.login)).isNotEmpty();

        // cleanup
        benutzerDao.deleteById(benutzerId);

        // assert
        assertThat(benutzerDao.findById(benutzerId)).isEmpty();
    }

    @Test
    void saveAndFindByNameAndDelete() {
        // arrange
        BenutzerEntity benutzer = createBenutzerEntity();
        Identifiable.Id benutzerId = Identifiable.Id.of(benutzer.id);

        // act
        benutzer = benutzerDao.save(benutzer);

        // assert
        assertThat(benutzerDao.findByName(benutzer.name)).isNotEmpty();

        // cleanup
        benutzerDao.deleteById(benutzerId);

        // assert
        assertThat(benutzerDao.findById(benutzerId)).isEmpty();
    }
}
