package org.springframework.data.jpa.datatables.repository;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.aop.framework.Advised;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.datatables.Config;
import org.springframework.data.jpa.datatables.QConfig;
import org.springframework.data.jpa.datatables.qrepository.QDataTablesRepositoryImpl;
import org.springframework.data.jpa.datatables.qrepository.QEmployeeRepository;
import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import static org.assertj.core.api.Assertions.assertThat;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {Config.class, QConfig.class})
public class RepositoryTest {

  private @Autowired EmployeeRepository employeeRepository;
  private @Autowired QEmployeeRepository qEmployeeRepository;
  private @Autowired OfficeRepository officeRepository;

  @Test
  public void checkGeneratedRepositories() {
    assertThat(getTargetObject(employeeRepository)).isEqualTo(DataTablesRepositoryImpl.class);
    assertThat(getTargetObject(officeRepository)).isEqualTo(SimpleJpaRepository.class);
    assertThat(getTargetObject(qEmployeeRepository)).isEqualTo(QDataTablesRepositoryImpl.class);
  }

  // returns the class of the proxied object
  private Class getTargetObject(Object proxy) {
    return ((Advised) proxy).getTargetSource().getTargetClass();
  }

}