diff --git a/CODING_GUIDELINES.md b/CODING_GUIDELINES.md index d1817bf..05766ac 100644 --- a/CODING_GUIDELINES.md +++ b/CODING_GUIDELINES.md @@ -293,6 +293,10 @@ public class GlobalExceptionHandler { - Frontend: Vitest for composables and utility functions. Cypress or Playwright for E2E (Phase 1). - Test naming: `shouldXxxWhenYyy` — e.g., `shouldReturn404WhenPlateNotFound`. - Aim for test coverage on business logic, not on getters/setters/boilerplate. +- All database interaction in tests must go through JPA repositories + or EntityManager. Never use JdbcTemplate, DataSource queries, or + raw SQL in test code. Tests interact with the database the same way + production code does: through the ORM. --- diff --git a/backend/src/main/java/se/bilhalsning/entity/SubscriptionConverter.java b/backend/src/main/java/se/bilhalsning/entity/SubscriptionConverter.java new file mode 100644 index 0000000..b512e19 --- /dev/null +++ b/backend/src/main/java/se/bilhalsning/entity/SubscriptionConverter.java @@ -0,0 +1,26 @@ +package se.bilhalsning.entity; + +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; + +@Converter(autoApply = true) +public class SubscriptionConverter implements AttributeConverter { + + @Override + public String convertToDatabaseColumn(Subscription subscription) { + return subscription != null ? subscription.getValue() : null; + } + + @Override + public Subscription convertToEntityAttribute(String dbData) { + if (dbData == null) { + return null; + } + for (Subscription subscription : Subscription.values()) { + if (subscription.getValue().equals(dbData)) { + return subscription; + } + } + throw new IllegalArgumentException("Unknown subscription value: " + dbData); + } +} diff --git a/backend/src/main/java/se/bilhalsning/entity/User.java b/backend/src/main/java/se/bilhalsning/entity/User.java index 2d28672..f21a14f 100644 --- a/backend/src/main/java/se/bilhalsning/entity/User.java +++ b/backend/src/main/java/se/bilhalsning/entity/User.java @@ -2,8 +2,7 @@ package se.bilhalsning.entity; import jakarta.persistence.Column; import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; +import jakarta.persistence.Convert; import jakarta.persistence.Id; import jakarta.persistence.PrePersist; import jakarta.persistence.PreUpdate; @@ -25,7 +24,7 @@ public class User { @Column(name = "password_hash", nullable = false, length = 255) private String passwordHash; - @Enumerated(EnumType.STRING) + @Convert(converter = SubscriptionConverter.class) @Column(name = "subscription", nullable = false, length = 20) private Subscription subscription = Subscription.NONE;