diff --git a/backend/src/main/java/com/example/flashcards_backend/dto/AddCardsToDeckRequest.java b/backend/src/main/java/com/example/flashcards_backend/dto/AddCardsToDeckRequest.java deleted file mode 100644 index e163d01..0000000 --- a/backend/src/main/java/com/example/flashcards_backend/dto/AddCardsToDeckRequest.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.example.flashcards_backend.dto; - -public record AddCardsToDeckRequest(Long deckId, Long[] cardIds) {} diff --git a/backend/src/main/java/com/example/flashcards_backend/dto/CardCreationResult.java b/backend/src/main/java/com/example/flashcards_backend/dto/CardCreationResult.java deleted file mode 100644 index 4387855..0000000 --- a/backend/src/main/java/com/example/flashcards_backend/dto/CardCreationResult.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.example.flashcards_backend.dto; - -import com.example.flashcards_backend.model.Card; -import lombok.NonNull; - -public record CardCreationResult(@NonNull Card card, @NonNull Boolean alreadyExisted) {} diff --git a/backend/src/main/java/com/example/flashcards_backend/dto/RemoveCardsFromDeckRequest.java b/backend/src/main/java/com/example/flashcards_backend/dto/RemoveCardsFromDeckRequest.java deleted file mode 100644 index ea9865d..0000000 --- a/backend/src/main/java/com/example/flashcards_backend/dto/RemoveCardsFromDeckRequest.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.example.flashcards_backend.dto; - -public record RemoveCardsFromDeckRequest(Long deckId, Long[] cardIds) {} diff --git a/backend/src/main/java/com/example/flashcards_backend/model/BaseEntity.java b/backend/src/main/java/com/example/flashcards_backend/model/BaseEntity.java index c7631ec..f5355d8 100644 --- a/backend/src/main/java/com/example/flashcards_backend/model/BaseEntity.java +++ b/backend/src/main/java/com/example/flashcards_backend/model/BaseEntity.java @@ -14,37 +14,38 @@ @SuperBuilder public abstract class BaseEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Getter - @Setter - private Long id; - - @Override - public final boolean equals(Object o) { - if (this == o) return true; - if (o == null) return false; - - Class oEffectiveClass = - o instanceof HibernateProxy - ? ((HibernateProxy) o).getHibernateLazyInitializer().getPersistentClass() - : o.getClass(); - - Class thisEffectiveClass = - this instanceof HibernateProxy - ? ((HibernateProxy) this).getHibernateLazyInitializer().getPersistentClass() - : this.getClass(); - - if (thisEffectiveClass != oEffectiveClass) return false; - - BaseEntity that = (BaseEntity) o; - return getId() != null && Objects.equals(getId(), that.getId()); - } - - @Override - public final int hashCode() { - return this instanceof HibernateProxy - ? ((HibernateProxy) this).getHibernateLazyInitializer().getPersistentClass().hashCode() - : getClass().hashCode(); - } + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Getter + @Setter + private Long id; + + @Override + public final boolean equals(Object o) { + if (this == o) return true; + if (o == null) return false; + + if (!(o instanceof BaseEntity other)) return false; + + Class thisEffectiveClass = + (this instanceof HibernateProxy proxy) + ? proxy.getHibernateLazyInitializer().getPersistentClass() + : this.getClass(); + + Class otherEffectiveClass = + (o instanceof HibernateProxy proxy) + ? proxy.getHibernateLazyInitializer().getPersistentClass() + : o.getClass(); + + if (!thisEffectiveClass.equals(otherEffectiveClass)) return false; + + return getId() != null && Objects.equals(getId(), other.getId()); + } + + @Override + public final int hashCode() { + return (this instanceof HibernateProxy proxy) + ? proxy.getHibernateLazyInitializer().getPersistentClass().hashCode() + : getClass().hashCode(); + } } diff --git a/backend/src/main/java/com/example/flashcards_backend/model/Card.java b/backend/src/main/java/com/example/flashcards_backend/model/Card.java index 91f47ca..387dce7 100644 --- a/backend/src/main/java/com/example/flashcards_backend/model/Card.java +++ b/backend/src/main/java/com/example/flashcards_backend/model/Card.java @@ -122,6 +122,7 @@ public void addCardHistory(CardHistory cardHistory) { cardHistory.setCard(this); } + @SuppressWarnings("unused") public static class CardBuilder { private Long id; private String front; @@ -159,15 +160,15 @@ public Card build() { public final boolean equals(Object o) { if (this == o) return true; if (o == null) return false; - Class oEffectiveClass = o instanceof HibernateProxy ? ((HibernateProxy) o).getHibernateLazyInitializer().getPersistentClass() : o.getClass(); - Class thisEffectiveClass = this instanceof HibernateProxy ? ((HibernateProxy) this).getHibernateLazyInitializer().getPersistentClass() : this.getClass(); + if (!(o instanceof Card other)) return false; + Class oEffectiveClass = o instanceof HibernateProxy proxy ? proxy.getHibernateLazyInitializer().getPersistentClass() : o.getClass(); + Class thisEffectiveClass = this instanceof HibernateProxy proxy ? proxy.getHibernateLazyInitializer().getPersistentClass() : this.getClass(); if (thisEffectiveClass != oEffectiveClass) return false; - Card card = (Card) o; - return getId() != null && Objects.equals(getId(), card.getId()); + return getId() != null && Objects.equals(getId(), other.getId()); } @Override public final int hashCode() { - return this instanceof HibernateProxy ? ((HibernateProxy) this).getHibernateLazyInitializer().getPersistentClass().hashCode() : getClass().hashCode(); + return this instanceof HibernateProxy proxy ? proxy.getHibernateLazyInitializer().getPersistentClass().hashCode() : getClass().hashCode(); } } \ No newline at end of file diff --git a/backend/src/test/java/com/example/flashcards_backend/FlashcardsBackendApplicationTests.java b/backend/src/test/java/com/example/flashcards_backend/FlashcardsBackendApplicationTests.java deleted file mode 100644 index b0a5a8c..0000000 --- a/backend/src/test/java/com/example/flashcards_backend/FlashcardsBackendApplicationTests.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.example.flashcards_backend; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.ApplicationContext; -import org.springframework.test.context.ActiveProfiles; - -import static org.assertj.core.api.Assertions.assertThat; - -@SpringBootTest -@ActiveProfiles("test") -// TODO this is still spending seconds loading despite the only test is disabled -class FlashcardsBackendApplicationTests { - - @Autowired - private ApplicationContext context; - - @Test - @Disabled("This does not need to run every time all tests are run, as it is resource intensive.") - void contextLoads() { - assertThat(context).isNotNull(); - } -} \ No newline at end of file diff --git a/backend/src/test/java/com/example/flashcards_backend/model/DeckTest.java b/backend/src/test/java/com/example/flashcards_backend/model/DeckTest.java deleted file mode 100644 index d9da6a1..0000000 --- a/backend/src/test/java/com/example/flashcards_backend/model/DeckTest.java +++ /dev/null @@ -1,213 +0,0 @@ -package com.example.flashcards_backend.model; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import java.util.Set; - -class DeckTest { -// -// Card card1; -// Card card2; -// Card card3; -// Deck deck; -// -// @BeforeEach -// void setUp() { -// card1 = new Card(); -// card2 = new Card(); -// card3 = new Card(); -// deck = new Deck(); -// -// card1.setId(1L); -// card2.setId(2L); -// card3.setId(3L); -// deck.setId(1L); -// } -// -// @Test -// void testAddCard() { -// card1.setId(1L); -// -// assertThat(deck.getCards()).isEmpty(); -// assertThat(card1.getDecks()).isEmpty(); -// -// deck.addCard(card1); -// -// assertThat(deck.getCards()).containsExactly(card1); -// assertThat(card1.getDecks()).containsExactly(deck); -// } -// -// @Test -// void testAddCard_null() { -// assertThat(deck.getCards()).isEmpty(); -// -// deck.addCard(null); -// -// assertThat(deck.getCards()).isEmpty(); -// } -// -// @Test -// void testAddCards() { -// assertThat(deck.getCards()).isEmpty(); -// -// deck.addCards(Set.of(card1, card2, card3)); -// -// assertThat(deck.getCards()).containsExactlyInAnyOrder(card1, card2, card3); -// assertThat(card1.getDecks()).containsExactly(deck); -// assertThat(card2.getDecks()).containsExactly(deck); -// assertThat(card3.getDecks()).containsExactly(deck); -// } -// -// @Test -// void testAddCards_null() { -// assertThat(deck.getCards()).isEmpty(); -// -// deck.addCards(null); -// -// assertThat(deck.getCards()).isEmpty(); -// } -// -// @Test -// void testRemoveCard() { -// deck.addCard(card1); -// deck.addCard(card2); -// -// assertThat(card1.getDecks()).contains(deck); -// assertThat(card2.getDecks()).contains(deck); -// -// deck.removeCard(card1); -// -// assertThat(deck.getCards()).doesNotContain(card1); -// assertThat(deck.getCards()).contains(card2); -// -// assertThat(card1.getDecks()).doesNotContain(deck); -// assertThat(card2.getDecks()).contains(deck); -// } -// -// @Test -// void testRemoveCard_null() { -// deck.addCard(card1); -// deck.addCard(card2); -// -// assertThat(deck.getCards()).containsExactlyInAnyOrder(card1, card2); -// -// deck.removeCard(null); -// -// assertThat(deck.getCards()).containsExactlyInAnyOrder(card1, card2); -// } -// -// @Test -// void testRemoveCard_notInDeck() { -// deck.addCard(card1); -// deck.addCard(card2); -// -// assertThat(deck.getCards()).containsExactlyInAnyOrder(card1, card2); -// -// Card cardNotInDeck = new Card(); -// cardNotInDeck.setId(3L); -// -// deck.removeCard(cardNotInDeck); -// -// assertThat(deck.getCards()).containsExactlyInAnyOrder(card1, card2); -// } -// -// @Test -// void testRemoveCards() { -// deck.addCard(card1); -// deck.addCard(card2); -// deck.addCard(card3); -// -// assertThat(deck.getCards()).containsExactlyInAnyOrder(card1, card2, card3); -// -// deck.removeCards(Set.of(card1, card2)); -// -// assertThat(deck.getCards()).containsExactly(card3); -// assertThat(card1.getDecks()).doesNotContain(deck); -// assertThat(card2.getDecks()).doesNotContain(deck); -// } -// -// @Test -// void testRemoveCards_null() { -// deck.addCard(card1); -// deck.addCard(card2); -// deck.addCard(card3); -// -// assertThat(deck.getCards()).containsExactlyInAnyOrder(card1, card2, card3); -// -// deck.removeCards(null); -// -// assertThat(deck.getCards()).containsExactlyInAnyOrder(card1, card2, card3); -// } -// -// @Test -// void testRemoveAllCards() { -// deck.addCard(card1); -// deck.addCard(card2); -// deck.addCard(card3); -// assertThat(deck.getCards()).containsExactlyInAnyOrder(card1, card2, card3); -// deck.removeAllCards(); -// assertThat(deck.getCards()).isEmpty(); -// assertThat(card1.getDecks()).doesNotContain(deck); -// assertThat(card2.getDecks()).doesNotContain(deck); -// assertThat(card3.getDecks()).doesNotContain(deck); -// } -// -// @Test -// void testHasCard() { -// deck.addCard(card1); -// deck.addCard(card2); -// -// assertThat(deck.hasCard(card1)).isTrue(); -// assertThat(deck.hasCard(card2)).isTrue(); -// assertThat(deck.hasCard(card3)).isFalse(); -// } -// -// @Test -// void testHasNotCard_byCard() { -// deck.addCard(card1); -// deck.addCard(card2); -// -// assertThat(deck.hasNotCard(card1)).isFalse(); -// assertThat(deck.hasNotCard(card2)).isFalse(); -// assertThat(deck.hasNotCard(card3)).isTrue(); -// } -// -// @Test -// void testHasNotCard_byLong() { -// deck.addCard(card1); -// deck.addCard(card2); -// -// assertThat(deck.hasNotCard(1L)).isFalse(); -// assertThat(deck.hasNotCard(2L)).isFalse(); -// assertThat(deck.hasNotCard(3L)).isTrue(); -// } -// -// @Test -// void testGetCardById() { -// deck.addCard(card1); -// deck.addCard(card2); -// -// assertThat(deck.getCardById(1L)).isEqualTo(card1); -// assertThat(deck.getCardById(2L)).isEqualTo(card2); -// -// assertThatThrownBy(() -> deck.getCardById(3L)) -// .isInstanceOf(IllegalArgumentException.class) -// .hasMessageContaining("Card with ID 3 not found in this deck"); -// } -// -// @Test -// void testGetCardIds() { -// deck.addCard(card1); -// deck.addCard(card2); -// deck.addCard(card3); -// -// Set cardIds = deck.getCardIds(); -// -// assertThat(cardIds).containsExactlyInAnyOrder(1L, 2L, 3L); -// } - -} \ No newline at end of file diff --git a/backend/src/test/java/com/example/flashcards_backend/repository/CardRepositoryTest.java b/backend/src/test/java/com/example/flashcards_backend/repository/CardRepositoryTest.java deleted file mode 100644 index f404568..0000000 --- a/backend/src/test/java/com/example/flashcards_backend/repository/CardRepositoryTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.example.flashcards_backend.repository; - - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace.NONE; - -import java.util.Map; - -@DataJpaTest -@AutoConfigureTestDatabase(replace = NONE) // or point at your test‐container -class CardRepositoryTest { - - @Autowired - private CardRepository repo; - -// @Disabled("This method may be deprecated") -// @Test -// void createIfUnique_insertsAndThenReturnsExisting() { -// // First call should insert -// Map first = repo.createIfUnique("A", "B"); -// assertThat(first).containsKeys("id", "front", "back"); -// Long id1 = ((Number) first.get("id")).longValue(); -// assertThat(first.get("front")).isEqualTo("A"); -// assertThat(first.get("back")).isEqualTo("B"); -// -// // Second call with the same payload should not create a new row, -// // but return the same id -// Map second = repo.createIfUnique("A", "B"); -// Long id2 = ((Number) second.get("id")).longValue(); -// assertThat(id2).isEqualTo(id1); -// } -}