TestDataLoader.java

package com.wilzwert.myjobs.infrastructure.staging;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.wilzwert.myjobs.infrastructure.persistence.mongo.entity.MongoIntegrationEvent;
import com.wilzwert.myjobs.infrastructure.persistence.mongo.entity.MongoJob;
import com.wilzwert.myjobs.infrastructure.persistence.mongo.entity.MongoRefreshToken;
import com.wilzwert.myjobs.infrastructure.persistence.mongo.entity.MongoUser;
import com.wilzwert.myjobs.infrastructure.persistence.mongo.repository.MongoIntegrationEventRepository;
import com.wilzwert.myjobs.infrastructure.persistence.mongo.repository.MongoJobRepository;
import com.wilzwert.myjobs.infrastructure.persistence.mongo.repository.MongoRefreshTokenRepository;
import com.wilzwert.myjobs.infrastructure.persistence.mongo.repository.MongoUserRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.data.mongodb.repository.MongoRepository;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

@Configuration
@Profile({"integration","staging"})
@Slf4j
public class TestDataLoader {

    private final MongoUserRepository userRepository;
    private final MongoJobRepository jobRepository;
    private final MongoRefreshTokenRepository refreshTokenRepository;
    private final MongoIntegrationEventRepository integrationEventRepository;
    private final ObjectMapper objectMapper;

    public TestDataLoader(MongoUserRepository userRepository, MongoJobRepository jobRepository, MongoRefreshTokenRepository refreshTokenRepository, MongoIntegrationEventRepository integrationEventRepository, ObjectMapper objectMapper) {
        this.userRepository = userRepository;
        this.jobRepository = jobRepository;
        this.refreshTokenRepository = refreshTokenRepository;
        this.integrationEventRepository = integrationEventRepository;
        this.objectMapper = objectMapper;
    }

    private <T> void loadData(String fileName, Class<T> clazz, MongoRepository<T, ?> repository) {
        try (InputStream is = getClass().getResourceAsStream("/test-data/" +fileName)) {
            if (is != null) {
                List<T> elements = objectMapper.readValue(is, objectMapper.getTypeFactory().constructCollectionType(List.class, clazz));
                repository.saveAll(elements);
                log.info("✅ Test data loaded from {} (found {}", fileName, elements.size());
            } else {
                log.error("❌ Cannot find file {} !", fileName);
            }
        } catch (IOException e) {
            log.info("❌ Error while loading test data from {} : {}", fileName, e.getMessage());
        }
    }

    public void resetAndReload() {
        userRepository.deleteAll();
        jobRepository.deleteAll();
        refreshTokenRepository.deleteAll();
        integrationEventRepository.deleteAll();

        loadData("users.json", MongoUser.class, userRepository);
        loadData("jobs.json", MongoJob.class, jobRepository);
        loadData("refresh_token.json", MongoRefreshToken.class, refreshTokenRepository);
        loadData("integration_events.json", MongoIntegrationEvent.class, integrationEventRepository);
    }

    @Bean
    public CommandLineRunner loadTestData() {
        return args -> resetAndReload();
    }
}