From b571ee3e9799538f75b07be3e3762416365d559f Mon Sep 17 00:00:00 2001 From: boppler12 Date: Wed, 14 Jan 2026 11:13:58 +0100 Subject: [PATCH 1/3] test 1 --- .../example/controller/PaymentController.java | 0 src/test/java/org/example/AppIT.java | 1 + .../org/example/DatabaseConnectionTest.java | 43 +++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 src/main/java/org/example/controller/PaymentController.java create mode 100644 src/test/java/org/example/DatabaseConnectionTest.java diff --git a/src/main/java/org/example/controller/PaymentController.java b/src/main/java/org/example/controller/PaymentController.java new file mode 100644 index 00000000..e69de29b diff --git a/src/test/java/org/example/AppIT.java b/src/test/java/org/example/AppIT.java index 9d1ca031..393ff8e4 100644 --- a/src/test/java/org/example/AppIT.java +++ b/src/test/java/org/example/AppIT.java @@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.assertThat; + public class AppIT { @Test void itTest() { diff --git a/src/test/java/org/example/DatabaseConnectionTest.java b/src/test/java/org/example/DatabaseConnectionTest.java new file mode 100644 index 00000000..8a24c5e2 --- /dev/null +++ b/src/test/java/org/example/DatabaseConnectionTest.java @@ -0,0 +1,43 @@ +package org.example; + +import org.junit.jupiter.api.Test; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.DriverManager; +import java.sql.SQLException; + +import static org.assertj.core.api.Assertions.assertThat; + + +public class DatabaseConnectionTest { + + private static final String URL = "jdbc:mysql://localhost::3306/car_rental"; + private static final String USER = "root"; + private static final String PASSWORD = "root"; + + @Test + void testMySQLConnection(){ + try{ + Connection connection = DriverManager.getConnection(URL, USER, PASSWORD); + + assertThat(connection).isNotNull(); + assertThat(connection.isClosed()).isFalse(); + assertThat(connection.isValid(2)).isTrue(); + + DatabaseMetaData metaData = connection.getMetaData(); + System.out.println("Anslutning Lyckades!"); + System.out.println("Databasklient:"+metaData.getDatabaseProductName()); + System.out.println("Version:"+metaData.getDatabaseProductVersion()); + + connection.close(); + + + + + } catch (Exception e) { + System.err.println("Anslutning misslyckades!"+ e.getMessage()); + throw new AssertionError("kunde inte ansluta till server kolla så du är upkopllad"); + } + } + +} From f26aabe8888137986f9a8294d78e654e00f7bcc0 Mon Sep 17 00:00:00 2001 From: boppler12 Date: Wed, 14 Jan 2026 11:56:48 +0100 Subject: [PATCH 2/3] =?UTF-8?q?=C3=A4ndrar=20mer=20p=C3=A5=20tester=20och?= =?UTF-8?q?=20i=20PaymentMethod?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/example/entity/PaymentMethod.java | 3 +- .../java/org/example/EmailSendingTest.java | 79 ++++++++ src/test/java/org/example/PaymentService.java | 187 ++++++++++++++++++ 3 files changed, 267 insertions(+), 2 deletions(-) create mode 100644 src/test/java/org/example/EmailSendingTest.java create mode 100644 src/test/java/org/example/PaymentService.java diff --git a/src/main/java/org/example/entity/PaymentMethod.java b/src/main/java/org/example/entity/PaymentMethod.java index 0c829a25..87abce4d 100644 --- a/src/main/java/org/example/entity/PaymentMethod.java +++ b/src/main/java/org/example/entity/PaymentMethod.java @@ -1,8 +1,7 @@ package org.example.entity; public enum PaymentMethod { - CREDIT_CARD, - DEBIT_CARD, + CARD, CASH, INVOICE } diff --git a/src/test/java/org/example/EmailSendingTest.java b/src/test/java/org/example/EmailSendingTest.java new file mode 100644 index 00000000..830aa577 --- /dev/null +++ b/src/test/java/org/example/EmailSendingTest.java @@ -0,0 +1,79 @@ +package org.example; + +import org.junit.jupiter.api.Test; +import org.example.service.EmailService; +import org.example.entity.PaymentMethod; +import javafx.scene.control.Label; + +import static org.assertj.core.api.Assertions.assertThat; + +class EmailSendingTest { + + private final EmailService emailService = new EmailService(); + + @Test + void testBookingConfirmationEmailSending() { + String testEmail = "test@example.com"; + String customerName = "Test Kund"; + double totalPrice = 500.0; + Long bookingId = 123L; + Label statusLabel = new Label(); + //kolla är med ERIK + + try { + emailService.sendBookingConfirmation( + testEmail, + customerName, + PaymentMethod.CARD, + totalPrice, + statusLabel, + bookingId + ); + + Thread.sleep(2000); + + assertThat(statusLabel.getText()) + .as("Mejl borde ha skickats eller vara i testläge") + .isNotEmpty(); + + System.out.println(" Bokningsbekräftelse mejl test GODKÄNT!"); + System.out.println(" Status: " + statusLabel.getText()); + + } catch (Exception e) { + throw new AssertionError(" Mejl skickling misslyckades: " + e.getMessage(), e); + } + } + + @Test + void testCancellationEmailSending() { + String testEmail = "test@example.com"; + String customerName = "Test Kund"; + + try { + emailService.sendCancellationEmail(testEmail, customerName); + + Thread.sleep(2000); + + System.out.println(" Avbokningsmejl test GODKÄNT!"); + + } catch (Exception e) { + throw new AssertionError(" Avbokningsmejl skickling misslyckades: " + e.getMessage(), e); + } + } + + @Test + void testEmailServicePlaceholder() { + boolean isPlaceholder = emailService.isUsingPlaceholder(); + + if (isPlaceholder) { + System.out.println("⚠️ VARNING: EmailService använder placeholder-autentiseringsuppgifter!"); + System.out.println(" Du behöver uppdatera emailadress och applösenord i EmailService"); + } else { + System.out.println("✅ EmailService använder riktiga autentiseringsuppgifter"); + } + + assertThat(isPlaceholder) + .as("Du bör uppdatera emailadress och lösenord") + .isFalse(); + } +} diff --git a/src/test/java/org/example/PaymentService.java b/src/test/java/org/example/PaymentService.java new file mode 100644 index 00000000..54377765 --- /dev/null +++ b/src/test/java/org/example/PaymentService.java @@ -0,0 +1,187 @@ +package org.example; + +import org.example.entity.Payment; +import org.example.entity.PaymentMethod; +import org.example.entity.PaymentStatus; +import org.example.service.PaymentService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.time.LocalDate; + +import static org.assertj.core.api.Assertions.assertThat; + +@DisplayName("Tester för PaymentService (nybörjarvänlig)") +class PaymentServiceTest { + + private PaymentService paymentService; + + @BeforeEach + void setup() { + paymentService = new PaymentService(); + } + + @Test + @DisplayName("Skapa betalning med faktura") + void shouldCreateInvoicePayment() { + Payment payment = paymentService.createPayment( + new BigDecimal("5000.00"), + 30, + PaymentMethod.INVOICE + ); + + assertThat(payment).isNotNull(); + assertThat(payment.getAmount()).isEqualTo(new BigDecimal("5000.00")); + assertThat(payment.getMethod()).isEqualTo(PaymentMethod.INVOICE); + assertThat(payment.getStatus()).isEqualTo(PaymentStatus.PENDING); + } + + @Test + @DisplayName("Skapa betalning med kort") + void shouldCreateCardPayment() { + Payment payment = paymentService.createPayment( + new BigDecimal("2500.50"), + 0, + PaymentMethod.CARD + ); + + assertThat(payment.getMethod()).isEqualTo(PaymentMethod.CARD); + } + + @Test + @DisplayName("Skapa betalning med kontanter") + void shouldCreateCashPayment() { + Payment payment = paymentService.createPayment( + new BigDecimal("1500.00"), + 0, + PaymentMethod.CASH + ); + + assertThat(payment.getMethod()).isEqualTo(PaymentMethod.CASH); + } + + @Test + @DisplayName("Markera betalning som betald") + void shouldMarkPaymentAsPaid() { + Payment payment = paymentService.createPayment( + new BigDecimal("3000.00"), + 30, + PaymentMethod.INVOICE + ); + + paymentService.payPayment(payment); + + assertThat(payment.getStatus()).isEqualTo(PaymentStatus.COMPLETED); + } + + @Test + @DisplayName("Redan betald betalning ändras inte") + void shouldNotPayAlreadyPaidPayment() { + Payment payment = paymentService.createPayment( + new BigDecimal("5000.00"), + 30, + PaymentMethod.INVOICE + ); + + payment.markAsPaid(); + payment.markAsPaid(); // betala igen + + assertThat(payment.getStatus()).isEqualTo(PaymentStatus.COMPLETED); + } + + @Test + @DisplayName("Betalning före förfallodatum är inte försenad") + void paymentIsNotOverdue() { + Payment payment = paymentService.createPayment( + new BigDecimal("1000.00"), + 10, + PaymentMethod.INVOICE + ); + + assertThat(payment.isOverdue()).isFalse(); + } + + @Test + @DisplayName("Betald betalning räknas inte som försenad") + void paidPaymentIsNotOverdue() { + Payment payment = paymentService.createPayment( + new BigDecimal("2000.00"), + -5, + PaymentMethod.INVOICE + ); + + payment.markAsPaid(); + + assertThat(payment.isOverdue()).isFalse(); + } + + @Test + @DisplayName("Räkna dagar kvar till betalning") + void shouldCalculateDaysUntilDue() { + Payment payment = paymentService.createPayment( + new BigDecimal("5000.00"), + 30, + PaymentMethod.INVOICE + ); + + long daysLeft = payment.getDaysUntilDue(); + + assertThat(daysLeft).isBetween(29L, 30L); + } + + @Test + @DisplayName("Försenad betalning ger negativa dagar") + void overduePaymentHasNegativeDays() { + Payment payment = paymentService.createPayment( + new BigDecimal("1000.00"), + -10, + PaymentMethod.INVOICE + ); + + assertThat(payment.getDaysUntilDue()).isLessThan(0); + } + + @Test + @DisplayName("Fakturadatum sätts till idag") + void invoiceDateIsToday() { + Payment payment = paymentService.createPayment( + new BigDecimal("1000.00"), + 30, + PaymentMethod.INVOICE + ); + + assertThat(payment.getInvoiceDate()).isEqualTo(LocalDate.now()); + } + + @Test + @DisplayName("Förfallodatum sätts rätt") + void dueDateIsCorrect() { + Payment payment = paymentService.createPayment( + new BigDecimal("5000.00"), + 30, + PaymentMethod.INVOICE + ); + + assertThat(payment.getDueDate()) + .isEqualTo(LocalDate.now().plusDays(30)); + } + + @Test + @DisplayName("Skapa → betala → kontrollera") + void completePaymentFlow() { + Payment payment = paymentService.createPayment( + new BigDecimal("4500.00"), + 30, + PaymentMethod.INVOICE + ); + + assertThat(payment.getStatus()).isEqualTo(PaymentStatus.PENDING); + + paymentService.payPayment(payment); + + assertThat(payment.getStatus()).isEqualTo(PaymentStatus.COMPLETED); + assertThat(payment.isOverdue()).isFalse(); + } +} From 04820c78d09b5e45893d36e1aebec75f28c4545f Mon Sep 17 00:00:00 2001 From: boppler12 Date: Wed, 14 Jan 2026 21:13:34 +0100 Subject: [PATCH 3/3] ficks tester --- docker-compose.yml | 1 - faktura.txt | 4 +- sql/seeds.sql | 2 +- src/main/java/org/example/entity/Addon.java | 5 + .../java/org/example/BookingServiceTest.java | 73 +++++++ src/test/java/org/example/CarServiceTest.java | 27 +++ .../org/example/DatabaseConnectionTest.java | 43 ---- .../java/org/example/EmailSendingTest.java | 79 -------- src/test/java/org/example/PaymentService.java | 187 ------------------ 9 files changed, 108 insertions(+), 313 deletions(-) create mode 100644 src/test/java/org/example/BookingServiceTest.java create mode 100644 src/test/java/org/example/CarServiceTest.java delete mode 100644 src/test/java/org/example/DatabaseConnectionTest.java delete mode 100644 src/test/java/org/example/EmailSendingTest.java delete mode 100644 src/test/java/org/example/PaymentService.java diff --git a/ docker-compose.yml b/ docker-compose.yml index e39b1170..cea37c14 100644 --- a/ docker-compose.yml +++ b/ docker-compose.yml @@ -12,4 +12,3 @@ services: MYSQL_PASSWORD: strong_password_here ports: - "3306:3306" - command: --default-authentication-plugin=mysql_native_password diff --git a/faktura.txt b/faktura.txt index 7bc7b387..59334445 100644 --- a/faktura.txt +++ b/faktura.txt @@ -1,3 +1,3 @@ FAKTURA - EVTA Rental -Kund: eric -Att betala: 990.0 kr +Kund: jejejej +Att betala: 1850.0 kr diff --git a/sql/seeds.sql b/sql/seeds.sql index 8af9414f..6109826e 100644 --- a/sql/seeds.sql +++ b/sql/seeds.sql @@ -1,4 +1,4 @@ --- Seed data for local development +-- Seed data for local development USE car_rental; INSERT INTO cars (brand, model, registrationNumber, pricePerHour, pricePerDay) VALUES diff --git a/src/main/java/org/example/entity/Addon.java b/src/main/java/org/example/entity/Addon.java index e27cd73b..b9957053 100644 --- a/src/main/java/org/example/entity/Addon.java +++ b/src/main/java/org/example/entity/Addon.java @@ -25,6 +25,11 @@ public Addon(String name, double price) { this.price = price; } + public Addon(String name, String description, double price) { + this.name = name; + this.price = price; + } + public Long getId() { return id; } public String getName() { return name; } public double getPrice() { return price; } diff --git a/src/test/java/org/example/BookingServiceTest.java b/src/test/java/org/example/BookingServiceTest.java new file mode 100644 index 00000000..8737d08d --- /dev/null +++ b/src/test/java/org/example/BookingServiceTest.java @@ -0,0 +1,73 @@ +package org.example; + +import org.example.entity.Addon; +import org.example.entity.BookingType; +import org.example.entity.Car; +import org.example.service.BookingService; +import org.junit.jupiter.api.Test; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class BookingServiceTest { + + private final BookingService bookingService = new BookingService(); + + @Test + void testCalculatePriceHourly() { + Car car = new Car("Volvo", "XC90", "ABC123", 500, 2000); + LocalDateTime start = LocalDateTime.of(2026, 1, 14, 10, 0); + LocalDateTime end = LocalDateTime.of(2026, 1, 14, 12, 0); // 2 timmar + List addons = new ArrayList<>(); + + double price = bookingService.calculatePrice(car, start, end, BookingType.HOURLY, addons); + + // 2 timmar * 500 kr/timme = 1000 kr + assertThat(price).isEqualTo(1000); + } + + @Test + void testCalculatePriceDaily() { + Car car = new Car("Volvo", "XC90", "ABC123", 500, 2000); + LocalDateTime start = LocalDateTime.of(2026, 1, 14, 10, 0); + LocalDateTime end = LocalDateTime.of(2026, 1, 16, 10, 0); // 2 dagar + List addons = new ArrayList<>(); + + double price = bookingService.calculatePrice(car, start, end, BookingType.DAILY, addons); + + // 2 dagar * 2000 kr/dag = 4000 kr + assertThat(price).isEqualTo(4000); + } + + @Test + void testCalculatePriceWithAddons() { + Car car = new Car("Volvo", "XC90", "ABC123", 500, 2000); + LocalDateTime start = LocalDateTime.of(2026, 1, 14, 10, 0); + LocalDateTime end = LocalDateTime.of(2026, 1, 14, 12, 0); // 2 timmar + + List addons = new ArrayList<>(); + Addon addon1 = new Addon("GPS", "GPS-navigator", 100); + addons.add(addon1); + + double price = bookingService.calculatePrice(car, start, end, BookingType.HOURLY, addons); + + // (2 timmar * 500 kr/timme) + 100 kr addon = 1100 kr + assertThat(price).isEqualTo(1100); + } + + @Test + void testCalculatePriceMinimumOneHour() { + Car car = new Car("Volvo", "XC90", "ABC123", 500, 2000); + LocalDateTime start = LocalDateTime.of(2026, 1, 14, 10, 30); + LocalDateTime end = LocalDateTime.of(2026, 1, 14, 10, 45); // Samma timme + List addons = new ArrayList<>(); + + double price = bookingService.calculatePrice(car, start, end, BookingType.HOURLY, addons); + + // Minimum 1 timme även om mindre än 1 timme valts + assertThat(price).isEqualTo(500); + } +} diff --git a/src/test/java/org/example/CarServiceTest.java b/src/test/java/org/example/CarServiceTest.java new file mode 100644 index 00000000..aeacac84 --- /dev/null +++ b/src/test/java/org/example/CarServiceTest.java @@ -0,0 +1,27 @@ + +package org.example; + +import org.example.entity.Car; +import org.example.service.CarService; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class CarServiceTest { + + private final CarService carService = new CarService(); + + @Test + void testGetAllCarsReturnsNotNull() { + List cars = carService.getAllCars(); + assertThat(cars).isNotNull(); + } + + @Test + void testGetAllCarsReturnsAList() { + List cars = carService.getAllCars(); + assertThat(cars).isInstanceOf(List.class); + } +} diff --git a/src/test/java/org/example/DatabaseConnectionTest.java b/src/test/java/org/example/DatabaseConnectionTest.java deleted file mode 100644 index 8a24c5e2..00000000 --- a/src/test/java/org/example/DatabaseConnectionTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.example; - -import org.junit.jupiter.api.Test; -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.DriverManager; -import java.sql.SQLException; - -import static org.assertj.core.api.Assertions.assertThat; - - -public class DatabaseConnectionTest { - - private static final String URL = "jdbc:mysql://localhost::3306/car_rental"; - private static final String USER = "root"; - private static final String PASSWORD = "root"; - - @Test - void testMySQLConnection(){ - try{ - Connection connection = DriverManager.getConnection(URL, USER, PASSWORD); - - assertThat(connection).isNotNull(); - assertThat(connection.isClosed()).isFalse(); - assertThat(connection.isValid(2)).isTrue(); - - DatabaseMetaData metaData = connection.getMetaData(); - System.out.println("Anslutning Lyckades!"); - System.out.println("Databasklient:"+metaData.getDatabaseProductName()); - System.out.println("Version:"+metaData.getDatabaseProductVersion()); - - connection.close(); - - - - - } catch (Exception e) { - System.err.println("Anslutning misslyckades!"+ e.getMessage()); - throw new AssertionError("kunde inte ansluta till server kolla så du är upkopllad"); - } - } - -} diff --git a/src/test/java/org/example/EmailSendingTest.java b/src/test/java/org/example/EmailSendingTest.java deleted file mode 100644 index 830aa577..00000000 --- a/src/test/java/org/example/EmailSendingTest.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.example; - -import org.junit.jupiter.api.Test; -import org.example.service.EmailService; -import org.example.entity.PaymentMethod; -import javafx.scene.control.Label; - -import static org.assertj.core.api.Assertions.assertThat; - -class EmailSendingTest { - - private final EmailService emailService = new EmailService(); - - @Test - void testBookingConfirmationEmailSending() { - String testEmail = "test@example.com"; - String customerName = "Test Kund"; - double totalPrice = 500.0; - Long bookingId = 123L; - Label statusLabel = new Label(); - //kolla är med ERIK - - try { - emailService.sendBookingConfirmation( - testEmail, - customerName, - PaymentMethod.CARD, - totalPrice, - statusLabel, - bookingId - ); - - Thread.sleep(2000); - - assertThat(statusLabel.getText()) - .as("Mejl borde ha skickats eller vara i testläge") - .isNotEmpty(); - - System.out.println(" Bokningsbekräftelse mejl test GODKÄNT!"); - System.out.println(" Status: " + statusLabel.getText()); - - } catch (Exception e) { - throw new AssertionError(" Mejl skickling misslyckades: " + e.getMessage(), e); - } - } - - @Test - void testCancellationEmailSending() { - String testEmail = "test@example.com"; - String customerName = "Test Kund"; - - try { - emailService.sendCancellationEmail(testEmail, customerName); - - Thread.sleep(2000); - - System.out.println(" Avbokningsmejl test GODKÄNT!"); - - } catch (Exception e) { - throw new AssertionError(" Avbokningsmejl skickling misslyckades: " + e.getMessage(), e); - } - } - - @Test - void testEmailServicePlaceholder() { - boolean isPlaceholder = emailService.isUsingPlaceholder(); - - if (isPlaceholder) { - System.out.println("⚠️ VARNING: EmailService använder placeholder-autentiseringsuppgifter!"); - System.out.println(" Du behöver uppdatera emailadress och applösenord i EmailService"); - } else { - System.out.println("✅ EmailService använder riktiga autentiseringsuppgifter"); - } - - assertThat(isPlaceholder) - .as("Du bör uppdatera emailadress och lösenord") - .isFalse(); - } -} diff --git a/src/test/java/org/example/PaymentService.java b/src/test/java/org/example/PaymentService.java deleted file mode 100644 index 54377765..00000000 --- a/src/test/java/org/example/PaymentService.java +++ /dev/null @@ -1,187 +0,0 @@ -package org.example; - -import org.example.entity.Payment; -import org.example.entity.PaymentMethod; -import org.example.entity.PaymentStatus; -import org.example.service.PaymentService; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.math.BigDecimal; -import java.time.LocalDate; - -import static org.assertj.core.api.Assertions.assertThat; - -@DisplayName("Tester för PaymentService (nybörjarvänlig)") -class PaymentServiceTest { - - private PaymentService paymentService; - - @BeforeEach - void setup() { - paymentService = new PaymentService(); - } - - @Test - @DisplayName("Skapa betalning med faktura") - void shouldCreateInvoicePayment() { - Payment payment = paymentService.createPayment( - new BigDecimal("5000.00"), - 30, - PaymentMethod.INVOICE - ); - - assertThat(payment).isNotNull(); - assertThat(payment.getAmount()).isEqualTo(new BigDecimal("5000.00")); - assertThat(payment.getMethod()).isEqualTo(PaymentMethod.INVOICE); - assertThat(payment.getStatus()).isEqualTo(PaymentStatus.PENDING); - } - - @Test - @DisplayName("Skapa betalning med kort") - void shouldCreateCardPayment() { - Payment payment = paymentService.createPayment( - new BigDecimal("2500.50"), - 0, - PaymentMethod.CARD - ); - - assertThat(payment.getMethod()).isEqualTo(PaymentMethod.CARD); - } - - @Test - @DisplayName("Skapa betalning med kontanter") - void shouldCreateCashPayment() { - Payment payment = paymentService.createPayment( - new BigDecimal("1500.00"), - 0, - PaymentMethod.CASH - ); - - assertThat(payment.getMethod()).isEqualTo(PaymentMethod.CASH); - } - - @Test - @DisplayName("Markera betalning som betald") - void shouldMarkPaymentAsPaid() { - Payment payment = paymentService.createPayment( - new BigDecimal("3000.00"), - 30, - PaymentMethod.INVOICE - ); - - paymentService.payPayment(payment); - - assertThat(payment.getStatus()).isEqualTo(PaymentStatus.COMPLETED); - } - - @Test - @DisplayName("Redan betald betalning ändras inte") - void shouldNotPayAlreadyPaidPayment() { - Payment payment = paymentService.createPayment( - new BigDecimal("5000.00"), - 30, - PaymentMethod.INVOICE - ); - - payment.markAsPaid(); - payment.markAsPaid(); // betala igen - - assertThat(payment.getStatus()).isEqualTo(PaymentStatus.COMPLETED); - } - - @Test - @DisplayName("Betalning före förfallodatum är inte försenad") - void paymentIsNotOverdue() { - Payment payment = paymentService.createPayment( - new BigDecimal("1000.00"), - 10, - PaymentMethod.INVOICE - ); - - assertThat(payment.isOverdue()).isFalse(); - } - - @Test - @DisplayName("Betald betalning räknas inte som försenad") - void paidPaymentIsNotOverdue() { - Payment payment = paymentService.createPayment( - new BigDecimal("2000.00"), - -5, - PaymentMethod.INVOICE - ); - - payment.markAsPaid(); - - assertThat(payment.isOverdue()).isFalse(); - } - - @Test - @DisplayName("Räkna dagar kvar till betalning") - void shouldCalculateDaysUntilDue() { - Payment payment = paymentService.createPayment( - new BigDecimal("5000.00"), - 30, - PaymentMethod.INVOICE - ); - - long daysLeft = payment.getDaysUntilDue(); - - assertThat(daysLeft).isBetween(29L, 30L); - } - - @Test - @DisplayName("Försenad betalning ger negativa dagar") - void overduePaymentHasNegativeDays() { - Payment payment = paymentService.createPayment( - new BigDecimal("1000.00"), - -10, - PaymentMethod.INVOICE - ); - - assertThat(payment.getDaysUntilDue()).isLessThan(0); - } - - @Test - @DisplayName("Fakturadatum sätts till idag") - void invoiceDateIsToday() { - Payment payment = paymentService.createPayment( - new BigDecimal("1000.00"), - 30, - PaymentMethod.INVOICE - ); - - assertThat(payment.getInvoiceDate()).isEqualTo(LocalDate.now()); - } - - @Test - @DisplayName("Förfallodatum sätts rätt") - void dueDateIsCorrect() { - Payment payment = paymentService.createPayment( - new BigDecimal("5000.00"), - 30, - PaymentMethod.INVOICE - ); - - assertThat(payment.getDueDate()) - .isEqualTo(LocalDate.now().plusDays(30)); - } - - @Test - @DisplayName("Skapa → betala → kontrollera") - void completePaymentFlow() { - Payment payment = paymentService.createPayment( - new BigDecimal("4500.00"), - 30, - PaymentMethod.INVOICE - ); - - assertThat(payment.getStatus()).isEqualTo(PaymentStatus.PENDING); - - paymentService.payPayment(payment); - - assertThat(payment.getStatus()).isEqualTo(PaymentStatus.COMPLETED); - assertThat(payment.isOverdue()).isFalse(); - } -}