|  | 
|  | 1 | +package g3601_3700.s3626_find_stores_with_inventory_imbalance | 
|  | 2 | + | 
|  | 3 | +import org.hamcrest.CoreMatchers.equalTo | 
|  | 4 | +import org.hamcrest.MatcherAssert.assertThat | 
|  | 5 | +import org.junit.jupiter.api.Test | 
|  | 6 | +import org.zapodot.junit.db.annotations.EmbeddedDatabase | 
|  | 7 | +import org.zapodot.junit.db.annotations.EmbeddedDatabaseTest | 
|  | 8 | +import org.zapodot.junit.db.common.CompatibilityMode | 
|  | 9 | +import java.io.BufferedReader | 
|  | 10 | +import java.io.FileNotFoundException | 
|  | 11 | +import java.io.FileReader | 
|  | 12 | +import java.sql.SQLException | 
|  | 13 | +import java.util.stream.Collectors | 
|  | 14 | +import javax.sql.DataSource | 
|  | 15 | + | 
|  | 16 | +@EmbeddedDatabaseTest( | 
|  | 17 | +    compatibilityMode = CompatibilityMode.MySQL, | 
|  | 18 | +    initialSqls = [ | 
|  | 19 | +        ( | 
|  | 20 | +            "CREATE TABLE stores (" + | 
|  | 21 | +                "    store_id INT PRIMARY KEY," + | 
|  | 22 | +                "    store_name VARCHAR(50)," + | 
|  | 23 | +                "    location VARCHAR(50)" + | 
|  | 24 | +                ");" + | 
|  | 25 | +                "INSERT INTO stores (store_id, store_name, location) VALUES" + | 
|  | 26 | +                "(1, 'Downtown Tech', 'New York')," + | 
|  | 27 | +                "(2, 'Suburb Mall', 'Chicago')," + | 
|  | 28 | +                "(3, 'City Center', 'Los Angeles')," + | 
|  | 29 | +                "(4, 'Corner Shop', 'Miami')," + | 
|  | 30 | +                "(5, 'Plaza Store', 'Seattle');" + | 
|  | 31 | +                "CREATE TABLE inventory (" + | 
|  | 32 | +                "    inventory_id INT PRIMARY KEY," + | 
|  | 33 | +                "    store_id INT," + | 
|  | 34 | +                "    product_name VARCHAR(50)," + | 
|  | 35 | +                "    quantity INT," + | 
|  | 36 | +                "    price DECIMAL(10,2)," + | 
|  | 37 | +                "    FOREIGN KEY (store_id) REFERENCES stores(store_id)" + | 
|  | 38 | +                ");" + | 
|  | 39 | +                "INSERT INTO inventory (inventory_id, store_id, " + | 
|  | 40 | +                "product_name, quantity, price) VALUES" + | 
|  | 41 | +                "(1,  1, 'Laptop',     5,   999.99)," + | 
|  | 42 | +                "(2,  1, 'Mouse',      50,   19.99)," + | 
|  | 43 | +                "(3,  1, 'Keyboard',   25,   79.99)," + | 
|  | 44 | +                "(4,  1, 'Monitor',    15,  299.99)," + | 
|  | 45 | +                "(5,  2, 'Phone',      3,   699.99)," + | 
|  | 46 | +                "(6,  2, 'Charger',    100,  25.99)," + | 
|  | 47 | +                "(7,  2, 'Case',       75,   15.99)," + | 
|  | 48 | +                "(8,  2, 'Headphones', 20,  149.99)," + | 
|  | 49 | +                "(9,  3, 'Tablet',     2,   499.99)," + | 
|  | 50 | +                "(10, 3, 'Stylus',     80,   29.99)," + | 
|  | 51 | +                "(11, 3, 'Cover',      60,   39.99)," + | 
|  | 52 | +                "(12, 4, 'Watch',      10,  299.99)," + | 
|  | 53 | +                "(13, 4, 'Band',       25,   49.99)," + | 
|  | 54 | +                "(14, 5, 'Camera',     8,   599.99)," + | 
|  | 55 | +                "(15, 5, 'Lens',       12,  199.99);" | 
|  | 56 | +            ), | 
|  | 57 | +    ], | 
|  | 58 | +) | 
|  | 59 | +internal class MysqlTest { | 
|  | 60 | +    @Test | 
|  | 61 | +    @Throws(SQLException::class, FileNotFoundException::class) | 
|  | 62 | +    fun testScript(@EmbeddedDatabase dataSource: DataSource) { | 
|  | 63 | +        dataSource.connection.use { connection -> | 
|  | 64 | +            connection.createStatement().use { statement -> | 
|  | 65 | +                statement.executeQuery( | 
|  | 66 | +                    BufferedReader( | 
|  | 67 | +                        FileReader( | 
|  | 68 | +                            ( | 
|  | 69 | +                                "src/main/kotlin/g3601_3700/" + | 
|  | 70 | +                                    "s3626_find_stores_with_" + | 
|  | 71 | +                                    "inventory_imbalance/" + | 
|  | 72 | +                                    "script.sql" | 
|  | 73 | +                                ), | 
|  | 74 | +                        ), | 
|  | 75 | +                    ) | 
|  | 76 | +                        .lines() | 
|  | 77 | +                        .collect(Collectors.joining("\n")) | 
|  | 78 | +                        .replace("#.*?\\r?\\n".toRegex(), ""), | 
|  | 79 | +                ).use { resultSet -> | 
|  | 80 | +                    assertThat<Boolean>(resultSet.next(), equalTo<Boolean>(true)) | 
|  | 81 | +                    assertThat<String>(resultSet.getNString(1), equalTo<String>("3")) | 
|  | 82 | +                    assertThat<String>( | 
|  | 83 | +                        resultSet.getNString(2), | 
|  | 84 | +                        equalTo<String>("City Center"), | 
|  | 85 | +                    ) | 
|  | 86 | +                    assertThat<String>( | 
|  | 87 | +                        resultSet.getNString(3), | 
|  | 88 | +                        equalTo<String>("Los Angeles"), | 
|  | 89 | +                    ) | 
|  | 90 | +                    assertThat<String>(resultSet.getNString(4), equalTo<String>("Tablet")) | 
|  | 91 | +                    assertThat<String>(resultSet.getNString(5), equalTo<String>("Stylus")) | 
|  | 92 | +                    assertThat<String>(resultSet.getNString(6), equalTo<String>("40.00")) | 
|  | 93 | +                    assertThat<Boolean>(resultSet.next(), equalTo<Boolean>(true)) | 
|  | 94 | +                    assertThat<String>(resultSet.getNString(1), equalTo<String>("2")) | 
|  | 95 | +                    assertThat<String>( | 
|  | 96 | +                        resultSet.getNString(2), | 
|  | 97 | +                        equalTo<String>("Suburb Mall"), | 
|  | 98 | +                    ) | 
|  | 99 | +                    assertThat<String>(resultSet.getNString(3), equalTo<String>("Chicago")) | 
|  | 100 | +                    assertThat<String>(resultSet.getNString(4), equalTo<String>("Phone")) | 
|  | 101 | +                    assertThat<String>(resultSet.getNString(5), equalTo<String>("Case")) | 
|  | 102 | +                    assertThat<String>(resultSet.getNString(6), equalTo<String>("25.00")) | 
|  | 103 | +                    assertThat<Boolean>(resultSet.next(), equalTo<Boolean>(true)) | 
|  | 104 | +                    assertThat<String>(resultSet.getNString(1), equalTo<String>("1")) | 
|  | 105 | +                    assertThat<String>( | 
|  | 106 | +                        resultSet.getNString(2), | 
|  | 107 | +                        equalTo<String>("Downtown Tech"), | 
|  | 108 | +                    ) | 
|  | 109 | +                    assertThat<String>( | 
|  | 110 | +                        resultSet.getNString(3), | 
|  | 111 | +                        equalTo<String>("New York"), | 
|  | 112 | +                    ) | 
|  | 113 | +                    assertThat<String>(resultSet.getNString(4), equalTo<String>("Laptop")) | 
|  | 114 | +                    assertThat<String>(resultSet.getNString(5), equalTo<String>("Mouse")) | 
|  | 115 | +                    assertThat<String>(resultSet.getNString(6), equalTo<String>("10.00")) | 
|  | 116 | +                    assertThat<Boolean>(resultSet.next(), equalTo<Boolean>(false)) | 
|  | 117 | +                } | 
|  | 118 | +            } | 
|  | 119 | +        } | 
|  | 120 | +    } | 
|  | 121 | +} | 
0 commit comments