package study.u43;

import jakarta.persistence.EntityManager;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import study.u43.model.Account;
import study.u43.repo.AccountRepository;
import static org.junit.jupiter.api.Assertions.*;

@DataJpaTest(properties = {"spring.jpa.hibernate.ddl-auto=create-drop", "spring.jpa.open-in-view=false"})
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class JpaSliceTest {
    @Autowired AccountRepository accounts;
    @Autowired EntityManager entityManager;
    @Autowired ApplicationContext context;

    @Test @Order(1) void repositoryAndMappingRunInSlice() {
        assertEquals(0, context.getBeansOfType(OutsideComponent.class).size());
        Account saved = accounts.saveAndFlush(new Account(101,"slice"));
        assertNotNull(saved.getCreatedAt());
        entityManager.clear();
        assertEquals("slice",accounts.findById(101L).orElseThrow().getName());
    }
    @Test @Order(2) void previousTestWasRolledBack() {
        assertFalse(accounts.existsById(101L));
    }
}
@Component class OutsideComponent { }
