Added PackagingRepositoryIntegrationTest for MySQL and MSSQL; extended PackagingRepository with additional fields in SELECT query and improved SQL pagination logic.

This commit is contained in:
Jan 2026-01-27 19:27:13 +01:00
parent c25f00bb01
commit 919c9d0499
2 changed files with 281 additions and 2 deletions

View file

@ -78,7 +78,7 @@ public class PackagingRepository {
private String buildQuery(Integer materialId, Integer supplierId, boolean excludeDeprecated, SearchQueryPagination pagination) { private String buildQuery(Integer materialId, Integer supplierId, boolean excludeDeprecated, SearchQueryPagination pagination) {
StringBuilder queryBuilder = new StringBuilder(""" StringBuilder queryBuilder = new StringBuilder("""
SELECT id, SELECT id, supplier_node_id, material_id, hu_dimension_id, shu_dimension_id, is_deprecated
FROM packaging FROM packaging
WHERE 1=1"""); WHERE 1=1""");
@ -91,7 +91,7 @@ public class PackagingRepository {
if (supplierId != null) { if (supplierId != null) {
queryBuilder.append(" AND supplier_node_id = ?"); queryBuilder.append(" AND supplier_node_id = ?");
} }
queryBuilder.append("ORDER BY id "); queryBuilder.append(" ORDER BY id ");
queryBuilder.append(dialectProvider.buildPaginationClause(pagination.getLimit(), pagination.getOffset())); queryBuilder.append(dialectProvider.buildPaginationClause(pagination.getLimit(), pagination.getOffset()));
return queryBuilder.toString(); return queryBuilder.toString();
} }

View file

@ -0,0 +1,279 @@
package de.avatic.lcc.repositories;
import de.avatic.lcc.model.db.packaging.Packaging;
import de.avatic.lcc.repositories.packaging.PackagingRepository;
import de.avatic.lcc.repositories.pagination.SearchQueryPagination;
import de.avatic.lcc.repositories.pagination.SearchQueryResult;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.*;
/**
* Integration tests for PackagingRepository.
* <p>
* Tests critical functionality across both MySQL and MSSQL:
* - Basic CRUD operations
* - Pagination with ORDER BY (MSSQL requirement)
* - Filtering by materialId and supplierId
* - Boolean literal compatibility (deprecated filtering)
* <p>
* Run with:
* <pre>
* mvn test -Dspring.profiles.active=test,mysql -Dtest=PackagingRepositoryIntegrationTest
* mvn test -Dspring.profiles.active=test,mssql -Dtest=PackagingRepositoryIntegrationTest
* </pre>
*/
class PackagingRepositoryIntegrationTest extends AbstractRepositoryIntegrationTest {
@Autowired
private PackagingRepository packagingRepository;
private Integer testMaterialId1;
private Integer testMaterialId2;
private Integer testNodeId1;
private Integer testNodeId2;
@BeforeEach
void setupTestData() {
// Create test materials (required by foreign key)
testMaterialId1 = createTestMaterial("TEST-MAT-001", "Test Material 1");
testMaterialId2 = createTestMaterial("TEST-MAT-002", "Test Material 2");
// Create test nodes (required by foreign key for supplier_node_id)
testNodeId1 = createTestNode("Test Supplier 1", 1);
testNodeId2 = createTestNode("Test Supplier 2", 1);
}
@Test
void testInsertAndRetrieve() {
// Given: Create packaging
Packaging packaging = new Packaging();
packaging.setMaterialId(testMaterialId1);
packaging.setSupplierId(testNodeId1);
packaging.setHuId(1); // Handling unit dimension
packaging.setShuId(1); // Shipping handling unit dimension
packaging.setDeprecated(false);
// When: Insert
Optional<Integer> packagingId = packagingRepository.insert(packaging);
// Then: Should be inserted successfully
assertTrue(packagingId.isPresent(), "Packaging ID should be present");
assertTrue(packagingId.get() > 0, "Packaging ID should be positive");
// When: Retrieve by ID
Optional<Packaging> retrieved = packagingRepository.getById(packagingId.get());
// Then: Should retrieve successfully
assertTrue(retrieved.isPresent(), "Packaging should be retrievable after insert");
assertEquals(packaging.getMaterialId(), retrieved.get().getMaterialId());
assertEquals(packaging.getSupplierId(), retrieved.get().getSupplierId());
assertEquals(packaging.getHuId(), retrieved.get().getHuId());
assertEquals(packaging.getShuId(), retrieved.get().getShuId());
assertFalse(retrieved.get().getDeprecated());
}
@Test
void testUpdate() {
// Given: Create and insert packaging
Packaging packaging = createTestPackaging(testMaterialId1, testNodeId1, 1, 1, false);
Integer packagingId = packagingRepository.insert(packaging).orElseThrow();
// When: Update packaging
Packaging toUpdate = packagingRepository.getById(packagingId).orElseThrow();
toUpdate.setHuId(2);
toUpdate.setShuId(2);
packagingRepository.update(toUpdate);
// Then: Verify update
Packaging updated = packagingRepository.getById(packagingId).orElseThrow();
assertEquals(2, updated.getHuId());
assertEquals(2, updated.getShuId());
}
@Test
void testSetDeprecatedById() {
// Given: Create packaging
Packaging packaging = createTestPackaging(1, 1, 1, 1, false);
Integer packagingId = packagingRepository.insert(packaging).orElseThrow();
// When: Deprecate
Optional<Integer> result = packagingRepository.setDeprecatedById(packagingId);
// Then: Should be deprecated
assertTrue(result.isPresent());
Packaging deprecated = packagingRepository.getById(packagingId).orElseThrow();
assertTrue(deprecated.getDeprecated(), "Packaging should be marked as deprecated");
}
@Test
void testListPackagingWithPagination() {
// Given: Create multiple packagings
for (int i = 0; i < 5; i++) {
Packaging packaging = createTestPackaging(1, 1, 1, 1, false);
packagingRepository.insert(packaging);
}
// When: List with pagination (page 1, size 3)
SearchQueryPagination pagination = new SearchQueryPagination(1, 3);
SearchQueryResult<Packaging> result = packagingRepository.listPackaging(
null, null, false, pagination
);
// Then: Verify pagination works
assertNotNull(result);
assertNotNull(result.toList());
assertTrue(result.toList().size() <= 3, "Should return at most 3 packagings per page");
}
@Test
void testListPackagingFilterByMaterialId() {
// Given: Create packagings with different materials
Packaging packaging1 = createTestPackaging(1, 1, 1, 1, false);
packagingRepository.insert(packaging1);
Packaging packaging2 = createTestPackaging(2, 1, 1, 1, false);
packagingRepository.insert(packaging2);
// When: Filter by materialId=1
SearchQueryPagination pagination = new SearchQueryPagination(1, 10);
SearchQueryResult<Packaging> result = packagingRepository.listPackaging(
1, null, false, pagination
);
// Then: Should only return material 1 packagings
assertNotNull(result);
for (Packaging p : result.toList()) {
assertEquals(1, p.getMaterialId(), "Should only return packagings with materialId=1");
}
}
@Test
void testListPackagingFilterBySupplierId() {
// Given: Create packagings with different suppliers
Packaging packaging1 = createTestPackaging(1, 1, 1, 1, false);
packagingRepository.insert(packaging1);
Packaging packaging2 = createTestPackaging(1, 2, 1, 1, false);
packagingRepository.insert(packaging2);
// When: Filter by supplierId=1
SearchQueryPagination pagination = new SearchQueryPagination(1, 10);
SearchQueryResult<Packaging> result = packagingRepository.listPackaging(
null, 1, false, pagination
);
// Then: Should only return supplier 1 packagings
assertNotNull(result);
for (Packaging p : result.toList()) {
assertEquals(1, p.getSupplierId(), "Should only return packagings with supplierId=1");
}
}
@Test
void testListPackagingExcludeDeprecated() {
// Given: Create deprecated and non-deprecated packagings
Packaging deprecated = createTestPackaging(1, 1, 1, 1, true);
packagingRepository.insert(deprecated);
Packaging active = createTestPackaging(1, 1, 1, 1, false);
packagingRepository.insert(active);
// When: List excluding deprecated
SearchQueryPagination pagination = new SearchQueryPagination(1, 10);
SearchQueryResult<Packaging> result = packagingRepository.listPackaging(
null, null, true, pagination
);
// Then: Should not include deprecated packagings
assertNotNull(result);
for (Packaging p : result.toList()) {
assertFalse(p.getDeprecated(), "Should not include deprecated packagings");
}
}
@Test
void testGetByMaterialId() {
// Given: Create packagings for specific material
Packaging packaging1 = createTestPackaging(10, 1, 1, 1, false);
packagingRepository.insert(packaging1);
Packaging packaging2 = createTestPackaging(10, 2, 1, 1, false);
packagingRepository.insert(packaging2);
// When: Get by materialId
List<Packaging> packagings = packagingRepository.getByMaterialId(10);
// Then: Should return all packagings for that material
assertNotNull(packagings);
assertTrue(packagings.size() >= 2, "Should find at least 2 packagings for material 10");
for (Packaging p : packagings) {
assertEquals(10, p.getMaterialId());
}
}
@Test
void testGetByMaterialIdAndSupplierId() {
// Given: Create packaging with specific material and supplier
Packaging packaging = createTestPackaging(15, 15, 1, 1, false);
Integer packagingId = packagingRepository.insert(packaging).orElseThrow();
// When: Get by materialId and supplierId
Optional<Packaging> result = packagingRepository.getByMaterialIdAndSupplierId(15, 15);
// Then: Should find the packaging
assertTrue(result.isPresent(), "Should find packaging with materialId=15 and supplierId=15");
assertEquals(packagingId, result.get().getId());
assertEquals(15, result.get().getMaterialId());
assertEquals(15, result.get().getSupplierId());
}
@Test
void testGetByMaterialIdAndSupplierIdNotFound() {
// When: Get by non-existent combination
Optional<Packaging> result = packagingRepository.getByMaterialIdAndSupplierId(99999, 99999);
// Then: Should return empty
assertFalse(result.isPresent(), "Should not find packaging with non-existent IDs");
}
@Test
void testListAllPackaging() {
// Given: Create packagings
Packaging packaging1 = createTestPackaging(1, 1, 1, 1, false);
packagingRepository.insert(packaging1);
Packaging packaging2 = createTestPackaging(2, 2, 1, 1, false);
packagingRepository.insert(packaging2);
// When: List all
List<Packaging> packagings = packagingRepository.listAllPackaging();
// Then: Should return all packagings ordered by id
assertNotNull(packagings);
assertFalse(packagings.isEmpty());
// Verify ordering
for (int i = 1; i < packagings.size(); i++) {
assertTrue(packagings.get(i - 1).getId() <= packagings.get(i).getId(),
"Packagings should be ordered by ID");
}
}
// ========== Helper Methods ==========
private Packaging createTestPackaging(Integer materialId, Integer supplierId, Integer huId, Integer shuId, boolean deprecated) {
Packaging packaging = new Packaging();
packaging.setMaterialId(materialId);
packaging.setSupplierId(supplierId);
packaging.setHuId(huId);
packaging.setShuId(shuId);
packaging.setDeprecated(deprecated);
return packaging;
}
}