From 688f0661174cb097b337bfce197fe70c7379f382 Mon Sep 17 00:00:00 2001 From: Rajdeep Roy Chowdhury Date: Sat, 27 Dec 2025 17:16:57 +0530 Subject: [PATCH 1/4] test: added first test Signed-off-by: Rajdeep Roy Chowdhury --- build.gradle | 9 ++++ .../ui/Input/BillEntry/BillEntry.fxml | 2 +- src/test/java/functional/BillEntryTest.java | 52 +++++++++++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/test/java/functional/BillEntryTest.java diff --git a/build.gradle b/build.gradle index 09d1c54..38c2706 100644 --- a/build.gradle +++ b/build.gradle @@ -27,6 +27,11 @@ dependencies { testCompileOnly 'org.projectlombok:lombok:1.18.20' testAnnotationProcessor 'org.projectlombok:lombok:1.18.20' + + testImplementation 'org.testfx:testfx-junit5:4.0.18' + testImplementation 'org.testfx:openjfx-monocle:jdk-12.0.1+2' + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' + testImplementation 'org.hamcrest:hamcrest:2.2' } javafx { @@ -34,6 +39,10 @@ javafx { modules = [ 'javafx.controls', 'javafx.fxml', 'javafx.graphics', 'javafx.base' ] } +test { + useJUnitPlatform() +} + spotless { java { lineEndings 'WINDOWS' diff --git a/src/main/resources/satyamconsignment/ui/Input/BillEntry/BillEntry.fxml b/src/main/resources/satyamconsignment/ui/Input/BillEntry/BillEntry.fxml index d7847b2..b4b0ca6 100644 --- a/src/main/resources/satyamconsignment/ui/Input/BillEntry/BillEntry.fxml +++ b/src/main/resources/satyamconsignment/ui/Input/BillEntry/BillEntry.fxml @@ -13,7 +13,7 @@ - + diff --git a/src/test/java/functional/BillEntryTest.java b/src/test/java/functional/BillEntryTest.java new file mode 100644 index 0000000..7e6774f --- /dev/null +++ b/src/test/java/functional/BillEntryTest.java @@ -0,0 +1,52 @@ +package functional; + +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.stage.Stage; +import org.junit.jupiter.api.Test; +import org.testfx.framework.junit5.ApplicationTest; +import org.testfx.matcher.base.NodeMatchers; + +import static org.testfx.api.FxAssert.verifyThat; + +public class BillEntryTest extends ApplicationTest { + + @Override + public void start(Stage stage) throws Exception { + FXMLLoader loader = new FXMLLoader( + getClass().getResource("/satyamconsignment/ui/Main/Main.fxml") + ); + + Parent root = loader.load(); + stage.setScene(new Scene(root)); + stage.setMaximized(true); + stage.show(); + } + + @Test + void testIfLoadedProperly() { + clickOn("#input_btn"); + + verifyThat("#bill_entry_btn", NodeMatchers.isVisible()); + clickOn("#bill_entry_btn"); + + verifyThat("#TabButtonAdd", NodeMatchers.isVisible()); + clickOn("#TabButtonAdd"); + + verifyThat("#supplier_field", NodeMatchers.isVisible()); +// clickOn("#supplier_field"); + + interact(() -> { + lookup("#supplier_field").queryTextInputControl().setText("ajanta"); + }); + + + verifyThat("#buyer_name_field", NodeMatchers.isVisible()); + clickOn("#buyer_name_field"); + + write("hello"); + } + + +} From 1af272a552793d4cbd209e4da0b82891c7343dc1 Mon Sep 17 00:00:00 2001 From: Rajdeep Roy Chowdhury Date: Sat, 27 Dec 2025 22:35:35 +0530 Subject: [PATCH 2/4] feat: auto generating database.db on app startup if missing Signed-off-by: Rajdeep Roy Chowdhury --- scripts/start.bat | 4 +- .../satyamconsignment/common/Constants.java | 1 + .../common/DatabaseHandler.java | 41 +++++++++- src/main/resources/sql/init.sql | 76 +++++++++++++++++++ 4 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/sql/init.sql diff --git a/scripts/start.bat b/scripts/start.bat index 72ebf99..9d1001f 100644 --- a/scripts/start.bat +++ b/scripts/start.bat @@ -1,5 +1,5 @@ -set JAVA_HOME="C:\Program Files\Java\jdk-11.0.16\lib" -set PATH="C:\Program Files\Java\jdk-11.0.16\bin" +set JAVA_HOME="C:\Program Files\Java\jdk-17\lib" +set PATH="C:\Program Files\Java\jdk-17\bin" java --module-path "C:\Users\rrajd\openjfx-19_windows-x64_bin-sdk\javafx-sdk-19\lib" ^ --add-modules javafx.controls,javafx.base,javafx.graphics,javafx.fxml ^ diff --git a/src/main/java/satyamconsignment/common/Constants.java b/src/main/java/satyamconsignment/common/Constants.java index 5a85afe..606728e 100644 --- a/src/main/java/satyamconsignment/common/Constants.java +++ b/src/main/java/satyamconsignment/common/Constants.java @@ -3,4 +3,5 @@ public class Constants { public static final String REPORT_FILE_NAME = "report.pdf"; public static final String DATE_TIME_FORMAT = "dd-MM-yyyy"; + public static final String DATABASE_FILE_NAME = "database.db"; } diff --git a/src/main/java/satyamconsignment/common/DatabaseHandler.java b/src/main/java/satyamconsignment/common/DatabaseHandler.java index 7597dd3..ac8f6f9 100644 --- a/src/main/java/satyamconsignment/common/DatabaseHandler.java +++ b/src/main/java/satyamconsignment/common/DatabaseHandler.java @@ -1,8 +1,12 @@ package satyamconsignment.common; +import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; +import java.sql.Statement; +import java.util.Objects; import java.util.logging.Level; import java.util.logging.Logger; @@ -11,10 +15,45 @@ public final class DatabaseHandler { private static DatabaseHandler databaseHandler = null; private Connection conn = null; + private String getInitSQL() throws IOException { + return new String( + Objects.requireNonNull( + DatabaseHandler.class.getResourceAsStream("/sql/init.sql") + ).readAllBytes(), + StandardCharsets.UTF_8 + ); + } + + private void initDatabase(Connection conn) { + try { + String initSQL = getInitSQL(); + try (Statement st = conn.createStatement()) { + + for (String statement : initSQL.split(";")) { + String cleanedStatement = statement.trim(); + if (!cleanedStatement.isEmpty()) { + st.execute(cleanedStatement); + } + } + + conn.commit(); + } catch (Exception e) { + conn.rollback(); + throw e; + } finally { + conn.setAutoCommit(true); + } + } catch (Exception ex) { + System.out.println(ex.toString()); + } + + } + private DatabaseHandler() { try { Class.forName("org.sqlite.JDBC"); - conn = DriverManager.getConnection("jdbc:sqlite:database.db"); + conn = DriverManager.getConnection("jdbc:sqlite:" + Constants.DATABASE_FILE_NAME); + initDatabase(conn); } catch (ClassNotFoundException | SQLException ex) { Utils.showAlert(ex.toString()); Logger.getLogger(DatabaseHandler.class.getName()).log(Level.SEVERE, ex.toString(), ex); diff --git a/src/main/resources/sql/init.sql b/src/main/resources/sql/init.sql new file mode 100644 index 0000000..33e16f8 --- /dev/null +++ b/src/main/resources/sql/init.sql @@ -0,0 +1,76 @@ +CREATE TABLE IF NOT EXISTS `Transport_Master_Table` +( + `name` TEXT NOT NULL, + PRIMARY KEY (`name`) +); +CREATE TABLE IF NOT EXISTS `Supplier_Master_Table` +( + `Name` TEXT NOT NULL, + PRIMARY KEY (`Name`) +); +CREATE TABLE IF NOT EXISTS "Payment_Entry_Table" +( + `Voucher No.` TEXT NOT NULL, + `Voucher Date` TEXT NOT NULL, + `Supplier Name` TEXT NOT NULL, + `Total Amount` TEXT NOT NULL, + PRIMARY KEY (`Voucher No.`) +); +CREATE TABLE IF NOT EXISTS "Payment_Entry_Extended_Table" +( + `Voucher No.` TEXT NOT NULL, + `Buyer Name` TEXT NOT NULL, + `Bill No.` TEXT NOT NULL, + `Bill Date` TEXT NOT NULL, + `Bill Amount` TEXT NOT NULL, + `Due Amount` TEXT NOT NULL, + `Amount Paid` TEXT NOT NULL, + `Bank` TEXT NOT NULL, + `DD No.` TEXT NOT NULL, + `DD Date` TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS `LR_Table` +( + `Bill No.` TEXT NOT NULL, + `LR No.` TEXT NOT NULL, + `PM` TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS "Collection_Entry_Table" +( + `Voucher No.` TEXT NOT NULL, + `Voucher Date` TEXT NOT NULL, + `Buyer Name` TEXT NOT NULL, + `Total Amount` TEXT NOT NULL, + PRIMARY KEY (`Voucher No.`) +); +CREATE TABLE IF NOT EXISTS "Collection_Entry_Extended_Table" +( + `Voucher No.` TEXT NOT NULL, + `Supplier Name` TEXT NOT NULL, + `Bill No.` TEXT NOT NULL, + `Bill Date` TEXT NOT NULL, + `Bill Amount` TEXT NOT NULL, + `Collection Due` TEXT NOT NULL, + `Amount Collected` TEXT NOT NULL, + `Bank` TEXT NOT NULL, + `DD No.` TEXT NOT NULL, + `DD Date` TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS `Buyer_Master_Table` +( + `Name` TEXT NOT NULL, + PRIMARY KEY (`Name`) +); +CREATE TABLE IF NOT EXISTS "Bill_Entry_Table" +( + `Supplier Name` TEXT NOT NULL, + `Buyer Name` TEXT NOT NULL, + `Bill No.` TEXT NOT NULL, + `Bill Date` TEXT NOT NULL, + `Transport` TEXT NOT NULL, + `LR Date` TEXT NOT NULL, + `Bill Amount` TEXT NOT NULL, + `Collection Due` TEXT NOT NULL, + `Due` TEXT NOT NULL, + PRIMARY KEY (`Bill No.`) +); From a265a3e50f25830c43d3d16bc4201c206e58769f Mon Sep 17 00:00:00 2001 From: Rajdeep Roy Chowdhury Date: Sun, 28 Dec 2025 11:46:00 +0530 Subject: [PATCH 3/4] test: attempting to fix the test failure in ci Signed-off-by: Rajdeep Roy Chowdhury --- build.gradle | 22 +++++++++-- src/test/java/functional/BillEntryTest.java | 42 +++++++++++---------- 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/build.gradle b/build.gradle index 38c2706..fe933b3 100644 --- a/build.gradle +++ b/build.gradle @@ -29,9 +29,13 @@ dependencies { testAnnotationProcessor 'org.projectlombok:lombok:1.18.20' testImplementation 'org.testfx:testfx-junit5:4.0.18' - testImplementation 'org.testfx:openjfx-monocle:jdk-12.0.1+2' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' + testImplementation 'org.testfx:openjfx-monocle:17.0.10' testImplementation 'org.hamcrest:hamcrest:2.2' + + testImplementation "org.junit.jupiter:junit-jupiter-api:5.10.1" + testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.10.1" + + testImplementation "org.testfx:testfx-core:4.0.17" } javafx { @@ -41,6 +45,16 @@ javafx { test { useJUnitPlatform() + + if (System.getenv("CI") == "true") { + jvmArgs = [ + "-Dtestfx.robot=glass", + "-Dtestfx.headless=true", + "-Dprism.order=sw", + "-Dprism.text=t2k", + "-Djava.awt.headless=true" + ] + } } spotless { @@ -131,7 +145,7 @@ tasks.named('jar') { tasks.named('shadowJar') { dependsOn ( - tasks.named('copyScripts'), - tasks.named('copyDatabase'), + tasks.named('copyScripts') ) } + diff --git a/src/test/java/functional/BillEntryTest.java b/src/test/java/functional/BillEntryTest.java index 7e6774f..d5a7201 100644 --- a/src/test/java/functional/BillEntryTest.java +++ b/src/test/java/functional/BillEntryTest.java @@ -9,6 +9,7 @@ import org.testfx.matcher.base.NodeMatchers; import static org.testfx.api.FxAssert.verifyThat; +import static org.testfx.util.WaitForAsyncUtils.waitForFxEvents; public class BillEntryTest extends ApplicationTest { @@ -26,26 +27,27 @@ public void start(Stage stage) throws Exception { @Test void testIfLoadedProperly() { - clickOn("#input_btn"); - - verifyThat("#bill_entry_btn", NodeMatchers.isVisible()); - clickOn("#bill_entry_btn"); - - verifyThat("#TabButtonAdd", NodeMatchers.isVisible()); - clickOn("#TabButtonAdd"); - - verifyThat("#supplier_field", NodeMatchers.isVisible()); -// clickOn("#supplier_field"); - - interact(() -> { - lookup("#supplier_field").queryTextInputControl().setText("ajanta"); - }); - - - verifyThat("#buyer_name_field", NodeMatchers.isVisible()); - clickOn("#buyer_name_field"); - - write("hello"); + waitForFxEvents(); +// clickOn("#input_btn"); +// +// verifyThat("#bill_entry_btn", NodeMatchers.isVisible()); +// clickOn("#bill_entry_btn"); +// +// verifyThat("#TabButtonAdd", NodeMatchers.isVisible()); +// clickOn("#TabButtonAdd"); +// +// verifyThat("#supplier_field", NodeMatchers.isVisible()); +//// clickOn("#supplier_field"); +// +// interact(() -> { +// lookup("#supplier_field").queryTextInputControl().setText("ajanta"); +// }); +// +// +// verifyThat("#buyer_name_field", NodeMatchers.isVisible()); +// clickOn("#buyer_name_field"); +// +// write("hello"); } From bfdb841ba10fed9a577ae55812b2081c52b3ea99 Mon Sep 17 00:00:00 2001 From: Rajdeep Roy Chowdhury Date: Sun, 28 Dec 2025 12:17:26 +0530 Subject: [PATCH 4/4] feat: gradle jar task customization is removed Signed-off-by: Rajdeep Roy Chowdhury --- build.gradle | 49 ------------------------------------------------- 1 file changed, 49 deletions(-) diff --git a/build.gradle b/build.gradle index fe933b3..4a7fa42 100644 --- a/build.gradle +++ b/build.gradle @@ -80,32 +80,10 @@ run { jvmArgs += ['--add-exports=javafx.graphics/com.sun.javafx.stage=ALL-UNNAMED'] } -jar { - manifest { - attributes( - 'Manifest-Version': 1.0, - 'Main-Class': mainClassName, - "Class-Path": configurations.runtimeClasspath.collect { "lib/" + it.getName() }.join(' ') - ) - } -} - shadowJar { archiveClassifier.set("") } -def dependencyDirectory = layout.buildDirectory.dir("libs/lib") - -tasks.register('copyDatabase', Copy) { - from('data') { - include 'database.db' - } - into "${layout.buildDirectory.get()}/libs" - doLast { - println "Copied database.db to build directory" - } -} - tasks.register('copyScripts', Copy) { from('scripts') { include 'start.sh' @@ -117,35 +95,8 @@ tasks.register('copyScripts', Copy) { } } - -tasks.register('copyRuntimeDeps', Copy) { - from(configurations.runtimeClasspath) - into(dependencyDirectory) - doLast { - println "Copied runtime dependencies" - } -} - -tasks.register('copyDeps', Copy) { - from(configurations.compileClasspath) - into(dependencyDirectory) - doLast { - println "Copied compile-time dependencies" - } -} - -tasks.named('jar') { - dependsOn ( - tasks.named('copyScripts'), - tasks.named('copyDatabase'), - tasks.named('copyDeps'), - tasks.named('copyRuntimeDeps') - ) -} - tasks.named('shadowJar') { dependsOn ( tasks.named('copyScripts') ) } -