package com.example.demo.util; import com.example.demo.entity.Author; import com.example.demo.entity.Book; import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.List; import static org.junit.jupiter.api.Assertions.assertTrue; class MyBatisGeneratorUtilsTest { @Test void testGenerateSql_Simple() { List fields = Arrays.asList("title", "isbn"); String sql = MyBatisGeneratorUtils.generateSql(Book.class, fields); System.out.println("=== Simple SQL ==="); System.out.println(sql); assertTrue(sql.contains("SELECT")); // Root fields should NOT have prefix (to match standard ResultMap) // book.title AS title assertTrue(sql.contains("book.title AS title")); assertTrue(sql.contains("FROM book book")); } @Test void testGenerateSql_OneToMany_List() { // Author -> List // Request: author.name, author.books.title List fields = Arrays.asList("name", "books.title"); String sql = MyBatisGeneratorUtils.generateSql(Author.class, fields); System.out.println("=== OneToMany List SQL ==="); System.out.println(sql); // Root: author assertTrue(sql.contains("FROM author author")); assertTrue(sql.contains("author.name AS name")); // Check Forced ID assertTrue(sql.contains("author.id AS id")); // Join: author -> book (OneToMany) // mappedBy="author" in Author means Book has "author" field. // Join condition should be: author.id = books.author_id assertTrue(sql.contains("LEFT JOIN book author$books")); // Correct Join Condition for OneToMany // author.id = author$books.author_id (assuming default convention or @JoinColumn on Book.author) // Book.java: @JoinColumn(name = "author_id") private Author author; assertTrue(sql.contains("author.id = author$books.author_id")); // Check Child Columns assertTrue(sql.contains("author$books.title AS books$title")); // Check Child Forced ID assertTrue(sql.contains("author$books.id AS books$id")); } @Test void testGenerateMapperXml() { List fields = Arrays.asList("title", "author.name", "author.books"); String xml = MyBatisGeneratorUtils.generateMapperXml(Book.class, "com.example.demo.mapper.BookMapper", fields); System.out.println("=== Generated Mapper XML ==="); System.out.println(xml); assertTrue(xml.contains("")); assertTrue(xml.contains(" AuthorMap association assertTrue(xml.contains("")); // Verify AuthorMap -> Books collection assertTrue(xml.contains("")); // Verify SQL is included assertTrue(xml.contains("SELECT")); // Use column name in alias (publish_month) assertTrue(xml.contains("book$author$books.publish_month AS author$books$publish_month")); } @Test void testGenerateSql_NestedJoin() { List fields = Arrays.asList("title", "author.name", "author.region.name"); String sql = MyBatisGeneratorUtils.generateSql(Book.class, fields); System.out.println("=== Nested Join SQL ==="); System.out.println(sql); // Verify Joins assertTrue(sql.contains("LEFT JOIN author book$author")); assertTrue(sql.contains("LEFT JOIN region book$author$region")); // Verify Columns // Child fields SHOULD have relative prefix // book$author.name AS author$name assertTrue(sql.contains("book$author.name AS author$name")); // book$author$region.name AS author$region$name assertTrue(sql.contains("book$author$region.name AS author$region$name")); } @Test void testGenerateSql_ExpandObject() { // "periodical" is an object, should expand to periodical.name, periodical.publishMonth etc. List fields = Arrays.asList("title", "periodical"); String sql = MyBatisGeneratorUtils.generateSql(Book.class, fields); System.out.println("=== Expand Object SQL ==="); System.out.println(sql); assertTrue(sql.contains("LEFT JOIN periodical book$periodical")); assertTrue(sql.contains("book$periodical.name AS periodical$name")); // Use column name in alias: publish_month assertTrue(sql.contains("book$periodical.publish_month AS periodical$publish_month")); } @Test void testGenerateSql_CompositeKeyJoin() { List fields = Arrays.asList("title", "periodical.name"); String sql = MyBatisGeneratorUtils.generateSql(Book.class, fields); System.out.println("=== Composite Key Join SQL ==="); System.out.println(sql); // Verify Composite Join Condition (publisher_id AND publish_month) assertTrue(sql.contains("LEFT JOIN periodical book$periodical")); assertTrue(sql.contains("book.publisher_id = book$periodical.publisher_id")); assertTrue(sql.contains("book.publish_month = book$periodical.publish_month")); } }