diff --git a/Online-Banking-App-Spring-Boot/pom.xml b/Online-Banking-App-Spring-Boot/pom.xml index 2f14ebe..fdd1762 100644 --- a/Online-Banking-App-Spring-Boot/pom.xml +++ b/Online-Banking-App-Spring-Boot/pom.xml @@ -1,114 +1,171 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.7.15 - - - com.beko - DemoBank_v1 - 0.0.1-SNAPSHOT - DemoBank_v1 - Demo project for Spring Boot - - 1.8 - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-mail - - - org.springframework.boot - spring-boot-starter-web - - - - com.mysql - mysql-connector-j - runtime - - - - org.springframework.boot - spring-boot-starter-tomcat - provided - - - org.springframework.boot - spring-boot-starter-test - test - - - javax.servlet - javax.servlet-api - 3.1.0 - - - - org.apache.tomcat.embed - tomcat-embed-jasper - provided - - - - org.springframework.boot - spring-boot-starter-validation - - - - javax.servlet.jsp - javax.servlet.jsp-api - 2.3.3 - provided - - - - javax.servlet - jstl - 1.2 - - - - org.springframework.security - spring-security-crypto - - - - io.jsonwebtoken - jjwt-api - 0.11.5 - - - - io.jsonwebtoken - jjwt-impl - 0.11.2 - runtime - - - - io.jsonwebtoken - jjwt-jackson - 0.11.2 - runtime - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.15 + + + + com.beko + DemoBank_v1 + 0.0.1-SNAPSHOT + DemoBank_v1 + Demo project for Spring Boot + + 1.8 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-mail + + + org.springframework.boot + spring-boot-starter-web + + + com.mysql + mysql-connector-j + runtime + + + org.springframework.boot + spring-boot-starter-tomcat + provided + + + org.springframework.boot + spring-boot-starter-test + test + + + javax.servlet + javax.servlet-api + 3.1.0 + + + org.apache.tomcat.embed + tomcat-embed-jasper + provided + + + org.springframework.boot + spring-boot-starter-validation + + + javax.servlet.jsp + javax.servlet.jsp-api + 2.3.3 + provided + + + javax.servlet + jstl + 1.2 + + + org.springframework.security + spring-security-crypto + + + io.jsonwebtoken + jjwt-api + 0.11.5 + + + io.jsonwebtoken + jjwt-impl + 0.11.2 + runtime + + + io.jsonwebtoken + jjwt-jackson + 0.11.2 + runtime + + + org.mockito + mockito-junit-jupiter + 2.23.4 + test + + + + io.spring.javaformat + spring-javaformat-formatter + 0.0.40 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.jacoco + jacoco-maven-plugin + 0.8.11 + + + + prepare-agent + + + + report + test + + report + + + coverageReport + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + + + org.apache.maven.plugins + maven-surefire-report-plugin + 3.2.5 + + testReport + + + + + org.apache.maven.plugins + maven-site-plugin + 2.1 + + testReport + + + + + io.spring.javaformat + spring-javaformat-maven-plugin + 0.0.40 + + + + + + + + \ No newline at end of file diff --git a/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetAccountIdTest.java b/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetAccountIdTest.java new file mode 100644 index 0000000..1828361 --- /dev/null +++ b/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetAccountIdTest.java @@ -0,0 +1,49 @@ + +// ********RoostGPT******** +/* +Test generated by RoostGPT for test unit-java-springboot using AI Type Azure Open AI and AI Model gpt-5 + +ROOST_METHOD_HASH=getAccount_id_77302f79ec +ROOST_METHOD_SIG_HASH=getAccount_id_b8d05339aa + +Scenario 1: Returns 0 by default for a newly constructed Account + +Details: + TestName: returnsZeroByDefaultForNewAccount + Description: Verify that getAccount_id() returns the default primitive int value (0) when a new Account is created and no ID has been explicitly set. + +Execution: + Arrange: Create a new Account instance without setting any fields. + Act: Call getAccount_id() on the new instance. + Assert: Use JUnit assertions (e.g., assertEquals) to confirm that the returned value is 0. + +Validation: + The assertion verifies that the primitive int field account_id is initialized to 0 by default in Java. + This is significant because it confirms predictable behavior for freshly instantiated entities prior to persistence or explicit assignment. + +*/ + +// ********RoostGPT******** + +package com.beko.DemoBank_v1.models; + +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.*; +import javax.persistence.Entity; +import javax.persistence.Id; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +public class AccountGetAccountIdTest { + + @Test + @Tag("valid") + public void testReturnsZeroByDefaultForNewAccount() { + Account account = new Account(); + int actual = account.getAccount_id(); + assertEquals((int) 0, (int) actual); + } + +} \ No newline at end of file diff --git a/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetAccountNameTest.java b/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetAccountNameTest.java new file mode 100644 index 0000000..1093c1f --- /dev/null +++ b/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetAccountNameTest.java @@ -0,0 +1,534 @@ + +// ********RoostGPT******** +/* +Test generated by RoostGPT for test unit-java-springboot using AI Type Azure Open AI and AI Model gpt-5 + +ROOST_METHOD_HASH=getAccount_name_ec9b406e17 +ROOST_METHOD_SIG_HASH=getAccount_name_4244db2a19 + +Scenario 1: Returns null by default when no account_name has been set + +Details: + TestName: returnsNullWhenAccountNameNotInitialized + Description: Verify that a newly constructed Account instance returns null from getAccount_name() when account_name has not been initialized via setAccount_name. + +Execution: + Arrange: Create a new Account object without invoking setAccount_name. + Act: Call getAccount_name on the Account instance. + Assert: Use assertNull to confirm the returned value is null. + +Validation: + This assertion verifies the default state of account_name, ensuring no unintended initialization occurs. It is significant for callers that rely on null checks to determine whether the name has been set. + +Scenario 2: Returns the exact value after setting a standard name + +Details: + TestName: returnsExactNameAfterSettingStandardValue + Description: Confirm that getAccount_name returns the exact string previously assigned via setAccount_name with a typical, human-readable value (e.g., "Checking"). + +Execution: + Arrange: Instantiate Account and invoke setAccount_name with "Checking". + Act: Call getAccount_name. + Assert: Use assertEquals("Checking", result) to validate the returned value. + +Validation: + The test verifies the straightforward getter/setter behavior and supports business flows that display or process the user-provided account name. + +Scenario 3: Handles empty string without transformation + +Details: + TestName: returnsEmptyStringWhenSet + Description: Ensure getAccount_name returns an empty string when account_name is set to "" and does not perform trimming or substitution. + +Execution: + Arrange: Create Account and set account_name to "" using setAccount_name. + Act: Invoke getAccount_name. + Assert: Use assertEquals("", result). + +Validation: + Validates that the entity preserves exact input, including empty strings. Important for systems that treat empty values distinctly from nulls. + +Scenario 4: Preserves whitespace-only values + +Details: + TestName: returnsWhitespaceOnlyStringUnchanged + Description: Verify that a whitespace-only string (e.g., " ") remains unmodified when retrieved via getAccount_name. + +Execution: + Arrange: Instantiate Account and set account_name to " ". + Act: Call getAccount_name. + Assert: Use assertEquals(" ", result). + +Validation: + Confirms no implicit trimming or normalization by the getter, which is critical if upstream validation is expected to enforce formatting rules. + +Scenario 5: Retains leading and trailing spaces + +Details: + TestName: returnsValueWithLeadingAndTrailingSpaces + Description: Check that values with leading/trailing spaces (e.g., " Savings ") are returned exactly as set. + +Execution: + Arrange: Create Account and set account_name to " Savings ". + Act: Invoke getAccount_name. + Assert: Use assertEquals(" Savings ", result). + +Validation: + Demonstrates fidelity of stored names, ensuring display and audit logic see the exact user input. + +Scenario 6: Supports very long strings + +Details: + TestName: returnsVeryLongStringAsIs + Description: Validate that getAccount_name properly returns a very long string (e.g., > 1000 characters) without truncation or alteration. + +Execution: + Arrange: Build a long string (e.g., by repeating "X" many times) and set it via setAccount_name. + Act: Call getAccount_name. + Assert: Use assertEquals(expectedLongString, result). + +Validation: + Ensures the entity can hold and return large names, which matters for integration scenarios or tests of boundary conditions. + +Scenario 7: Accepts special characters and symbols + +Details: + TestName: returnsSpecialCharactersUnchanged + Description: Confirm that special characters (e.g., "!@#$%^&*()_+-=[]{};:'\",.<>/?|") are preserved by getAccount_name. + +Execution: + Arrange: Create Account and set account_name to a string containing special characters. + Act: Invoke getAccount_name. + Assert: Use assertEquals(specialCharsString, result). + +Validation: + Important for user-entered names containing punctuation or symbols; ensures no sanitization occurs in the getter. + +Scenario 8: Treats numeric-looking content as plain text + +Details: + TestName: returnsNumericLookingStringAsText + Description: Verify that numeric-looking strings (e.g., "00123") are returned exactly and not interpreted as numbers. + +Execution: + Arrange: Set account_name to "00123" using setAccount_name. + Act: Call getAccount_name. + Assert: Use assertEquals("00123", result). + +Validation: + Protects against unintended type conversions; significant for names that may include leading zeros. + +Scenario 9: Supports non-Latin scripts (Unicode) + +Details: + TestName: returnsUnicodeCharactersCorrectly + Description: Ensure the getter returns non-Latin characters accurately, such as "账户名称" or "اسم الحساب". + +Execution: + Arrange: Set account_name to a Unicode string (e.g., "账户名称"). + Act: Invoke getAccount_name. + Assert: Use assertEquals("账户名称", result). + +Validation: + Validates internationalization support at the entity level, crucial for globalized applications. + +Scenario 10: Handles emojis correctly + +Details: + TestName: returnsEmojiContentUnchanged + Description: Confirm that emojis (e.g., "💳 Premium") are retained exactly when retrieved via getAccount_name. + +Execution: + Arrange: Set account_name to "💳 Premium". + Act: Call getAccount_name. + Assert: Use assertEquals("💳 Premium", result). + +Validation: + Ensures modern character sets are supported, impacting UI rendering and data persistence expectations. + +Scenario 11: Returns the most recently set value after multiple updates + +Details: + TestName: returnsLatestValueAfterSequentialUpdates + Description: Validate that after multiple calls to setAccount_name with different values, getAccount_name returns the last value set. + +Execution: + Arrange: Create Account and sequentially set account_name to "A", then "B", then "C". + Act: Invoke getAccount_name after the final set. + Assert: Use assertEquals("C", result). + +Validation: + Demonstrates that the setter overwrites previous values and the getter reflects current state, aligning with typical mutable entity behavior. + +Scenario 12: Independent values across multiple Account instances + +Details: + TestName: returnsIndependentValuesAcrossInstances + Description: Ensure that different Account objects hold and return their own distinct account_name values. + +Execution: + Arrange: Create two Account instances; set first to "Primary", second to "Secondary". + Act: Call getAccount_name on both instances. + Assert: Use assertEquals("Primary", firstResult) and assertEquals("Secondary", secondResult). + +Validation: + Verifies object encapsulation and absence of shared static state for account_name. + +Scenario 13: Unaffected by changes to other fields + +Details: + TestName: remainsUnchangedWhenOtherFieldsChange + Description: Confirm that modifying other fields (account_number, account_type, balance, create_at, updated_at, user_id, account_id) does not change the value returned by getAccount_name. + +Execution: + Arrange: Set account_name to "StableName". Then set account_number, account_type, balance (e.g., new BigDecimal("100.00")), create_at and updated_at (e.g., LocalDateTime.now()), user_id, account_id. + Act: Call getAccount_name. + Assert: Use assertEquals("StableName", result). + +Validation: + Demonstrates field independence, ensuring business updates to other properties won't affect the stored account name. + +Scenario 14: Returns null after explicitly setting null + +Details: + TestName: returnsNullAfterSettingNull + Description: Validate that setting account_name to null results in getAccount_name returning null, even if it previously had a non-null value. + +Execution: + Arrange: Set account_name to "TempName", then set account_name to null. + Act: Invoke getAccount_name. + Assert: Use assertNull(result). + +Validation: + Confirms that null assignments are respected, relevant for clearing or resetting the name field. + +Scenario 15: Returns the same String reference set via the setter + +Details: + TestName: returnsSameReferenceAsSet + Description: Check that the object reference returned by getAccount_name is the same as the one passed to setAccount_name (String immutability and direct field assignment imply reference equality). + +Execution: + Arrange: Create a String variable s = "ReferenceName" and set account_name using setAccount_name(s). + Act: Call getAccount_name. + Assert: Use assertSame(s, result). + +Validation: + Ensures there is no internal copying or transformation of the String, useful for performance assumptions and consistency checks. + +Scenario 16: Case sensitivity is preserved + +Details: + TestName: preservesCaseSensitivity + Description: Verify that the getter returns exactly the case provided (e.g., "savings" vs "SAVINGS") without altering capitalization. + +Execution: + Arrange: Set account_name to "savings". + Act: Call getAccount_name. + Assert: Use assertEquals("savings", result). Optionally, repeat with "SAVINGS" and assert accordingly. + +Validation: + Important for case-sensitive comparisons or displays where exact casing matters. + +Scenario 17: Multiple consecutive getter calls are idempotent + +Details: + TestName: getterIsIdempotentAcrossMultipleCalls + Description: Ensure that calling getAccount_name multiple times returns the same value and does not change any state. + +Execution: + Arrange: Set account_name to "ConstantName". + Act: Invoke getAccount_name multiple times (e.g., 3 calls). + Assert: Use assertEquals on each result to "ConstantName" and assertSame between successive results when appropriate. + +Validation: + Confirms the getter's pure access behavior, which is central to predictable read operations. + +Scenario 18: Supports control characters within the string + +Details: + TestName: returnsStringContainingControlCharacters + Description: Validate that getAccount_name can return strings containing control characters (e.g., "Name\u0000X") exactly as set. + +Execution: + Arrange: Set account_name to a string that includes a null character. + Act: Call getAccount_name. + Assert: Use assertEquals("Name\u0000X", result). + +Validation: + Ensures raw data fidelity for unusual inputs, significant in edge-case testing and data transport scenarios. + +Scenario 19: Independence from temporal fields (create_at, updated_at) + +Details: + TestName: remainsUnchangedWhenTemporalFieldsUpdate + Description: Verify that updating create_at and updated_at does not affect the value returned by getAccount_name. + +Execution: + Arrange: Set account_name to "TimeIndependent". Then set create_at and updated_at to LocalDateTime.now or other valid times. + Act: Invoke getAccount_name. + Assert: Use assertEquals("TimeIndependent", result). + +Validation: + Ensures the account name is not coupled to audit timestamps, maintaining separation of concerns within the entity. + +Scenario 20: Works with names created via external builders + +Details: + TestName: returnsStringBuiltExternally + Description: Confirm that a String built externally (e.g., via StringBuilder.toString()) is returned exactly by getAccount_name. + +Execution: + Arrange: Build a name using a StringBuilder (e.g., append "Premium", " Account") and set via setAccount_name(builder.toString()). + Act: Call getAccount_name. + Assert: Use assertEquals(builtString, result) and optionally assertSame if the same reference is used. + +Validation: + Demonstrates compatibility with typical Java string creation patterns and ensures no unexpected issues with constructed values. + +*/ + +// ********RoostGPT******** + +package com.beko.DemoBank_v1.models; + +import com.beko.DemoBank_v1.models.Account; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.*; +import javax.persistence.Entity; +import javax.persistence.Id; + +@ExtendWith(MockitoExtension.class) +public class AccountGetAccountNameTest { + + @Test + @Tag("valid") + public void testReturnsNullWhenAccountNameNotInitialized() { + Account account = new Account(); + String result = account.getAccount_name(); + assertNull((String) result); + } + + @Test + @Tag("valid") + public void testReturnsExactNameAfterSettingStandardValue() { + Account account = new Account(); + account.setAccount_name("Checking"); + String result = account.getAccount_name(); + assertEquals((String) "Checking", (String) result); + } + + @Test + @Tag("boundary") + public void testReturnsEmptyStringWhenSet() { + Account account = new Account(); + account.setAccount_name(""); + String result = account.getAccount_name(); + assertEquals((String) "", (String) result); + } + + @Test + @Tag("boundary") + public void testReturnsWhitespaceOnlyStringUnchanged() { + Account account = new Account(); + account.setAccount_name(" "); + String result = account.getAccount_name(); + assertEquals((String) " ", (String) result); + } + + @Test + @Tag("boundary") + public void testReturnsValueWithLeadingAndTrailingSpaces() { + Account account = new Account(); + account.setAccount_name(" Savings "); + String result = account.getAccount_name(); + assertEquals((String) " Savings ", (String) result); + } + + @Test + @Tag("boundary") + public void testReturnsVeryLongStringAsIs() { + Account account = new Account(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 2048; i++) { + sb.append('X'); + } + String longName = sb.toString(); + account.setAccount_name(longName); + String result = account.getAccount_name(); + assertEquals((String) longName, (String) result); + } + + @Test + @Tag("boundary") + public void testReturnsSpecialCharactersUnchanged() { + Account account = new Account(); + String special = "!@#$%^&*()_+-=[]{};:'\",.<>/?|`~"; + account.setAccount_name(special); + String result = account.getAccount_name(); + assertEquals((String) special, (String) result); + } + + @Test + @Tag("valid") + public void testReturnsNumericLookingStringAsText() { + Account account = new Account(); + String numericLike = "00123"; + account.setAccount_name(numericLike); + String result = account.getAccount_name(); + assertEquals((String) numericLike, (String) result); + } + + @Test + @Tag("boundary") + public void testReturnsUnicodeCharactersCorrectly() { + Account account = new Account(); + String unicodeName = "账户名称"; + account.setAccount_name(unicodeName); + String result = account.getAccount_name(); + assertEquals((String) unicodeName, (String) result); + } + + @Test + @Tag("boundary") + public void testReturnsEmojiContentUnchanged() { + Account account = new Account(); + String emojiName = "💳 Premium"; + account.setAccount_name(emojiName); + String result = account.getAccount_name(); + assertEquals((String) emojiName, (String) result); + } + + @Test + @Tag("valid") + public void testReturnsLatestValueAfterSequentialUpdates() { + Account account = new Account(); + account.setAccount_name("A"); + account.setAccount_name("B"); + account.setAccount_name("C"); + String result = account.getAccount_name(); + assertEquals((String) "C", (String) result); + } + + @Test + @Tag("valid") + public void testReturnsIndependentValuesAcrossInstances() { + Account first = new Account(); + Account second = new Account(); + first.setAccount_name("Primary"); + second.setAccount_name("Secondary"); + String firstResult = first.getAccount_name(); + String secondResult = second.getAccount_name(); + assertEquals((String) "Primary", (String) firstResult); + assertEquals((String) "Secondary", (String) secondResult); + } + + @Test + @Tag("valid") + public void testRemainsUnchangedWhenOtherFieldsChange() { + Account account = new Account(); + account.setAccount_name("StableName"); + account.setAccount_number("ACC-001-XYZ"); // TODO: Adjust format if repository + // enforces a specific pattern + account.setAccount_type("SAVINGS"); // TODO: Change if enum or specific values are + // required + account.setBalance(new BigDecimal("100.00")); + LocalDateTime now = LocalDateTime.now(); + account.setCreate_at(now); + account.setUpdated_at(now.plusMinutes(5)); + account.setUser_id(100); // TODO: Update user_id if constraints exist + account.setAccount_id(200); // TODO: Update account_id if constraints exist + String result = account.getAccount_name(); + assertEquals((String) "StableName", (String) result); + } + + @Test + @Tag("valid") + public void testReturnsNullAfterSettingNull() { + Account account = new Account(); + account.setAccount_name("TempName"); + account.setAccount_name(null); + String result = account.getAccount_name(); + assertNull((String) result); + } + + @Test + @Tag("valid") + public void testReturnsSameReferenceAsSet() { + Account account = new Account(); + String s = new String("ReferenceName"); + account.setAccount_name(s); + String result = account.getAccount_name(); + assertSame((Object) s, (Object) result); + } + + @Test + @Tag("valid") + public void testPreservesCaseSensitivity() { + Account account = new Account(); + account.setAccount_name("savings"); + String lower = account.getAccount_name(); + assertEquals((String) "savings", (String) lower); + account.setAccount_name("SAVINGS"); + String upper = account.getAccount_name(); + assertEquals((String) "SAVINGS", (String) upper); + } + + @Test + @Tag("valid") + public void testGetterIsIdempotentAcrossMultipleCalls() { + Account account = new Account(); + account.setAccount_name("ConstantName"); + String r1 = account.getAccount_name(); + String r2 = account.getAccount_name(); + String r3 = account.getAccount_name(); + assertEquals((String) "ConstantName", (String) r1); + assertEquals((String) "ConstantName", (String) r2); + assertEquals((String) "ConstantName", (String) r3); + assertSame((Object) r1, (Object) r2); + assertSame((Object) r2, (Object) r3); + } + + @Test + @Tag("boundary") + public void testReturnsStringContainingControlCharacters() { + Account account = new Account(); + String control = "Name\u0000X"; + account.setAccount_name(control); + String result = account.getAccount_name(); + assertEquals((String) control, (String) result); + } + + @Test + @Tag("valid") + public void testRemainsUnchangedWhenTemporalFieldsUpdate() { + Account account = new Account(); + account.setAccount_name("TimeIndependent"); + LocalDateTime t1 = LocalDateTime.now(); + LocalDateTime t2 = t1.plusHours(1); + account.setCreate_at(t1); + account.setUpdated_at(t2); + String result = account.getAccount_name(); + assertEquals((String) "TimeIndependent", (String) result); + } + + @Test + @Tag("valid") + public void testReturnsStringBuiltExternally() { + Account account = new Account(); + StringBuilder builder = new StringBuilder(); + builder.append("Premium").append(" Account"); + String built = builder.toString(); + account.setAccount_name(built); + String result = account.getAccount_name(); + assertEquals((String) built, (String) result); + assertSame((Object) built, (Object) result); + } + +} \ No newline at end of file diff --git a/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetAccountNumberTest.java b/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetAccountNumberTest.java new file mode 100644 index 0000000..99dc27f --- /dev/null +++ b/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetAccountNumberTest.java @@ -0,0 +1,134 @@ + +// ********RoostGPT******** +/* +Test generated by RoostGPT for test unit-java-springboot using AI Type Azure Open AI and AI Model gpt-5 + +ROOST_METHOD_HASH=getAccount_number_608999f189 +ROOST_METHOD_SIG_HASH=getAccount_number_4a1d3a4a16 + +Scenario 1: Getter returns the value previously assigned via the setter + +Details: + TestName: getAccountNumberReturnsValueAfterSet + Description: Verifies that after assigning a typical numeric account number string to the Account instance, the getAccount_number method returns exactly the same value. + +Execution: + Arrange: Create a new Account and assign account_number using setAccount_number with "1234567890". + Act: Call getAccount_number to retrieve the value. + Assert: Use assertEquals("1234567890", actual) to confirm the returned value matches the assigned string. + +Validation: + Confirms the basic getter functionality works as expected, which is fundamental for retrieving stored account identifiers used across the application. + +*/ + +// ********RoostGPT******** + +package com.beko.DemoBank_v1.models; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import org.junit.jupiter.api.*; +import javax.persistence.Entity; +import javax.persistence.Id; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@ExtendWith(MockitoExtension.class) +public class AccountGetAccountNumberTest { + + @Test + @Tag("valid") + @DisplayName("Getter returns the value previously assigned via the setter") + public void testGetAccountNumberReturnsValueAfterSet() { + Account account = new Account(); + account.setAccount_number("1234567890"); + String actual = account.getAccount_number(); + assertEquals((String) "1234567890", (String) actual); + } + + @Test + @Tag("boundary") + @DisplayName("Getter returns null when account_number is not set") + public void testGetAccountNumberReturnsNullWhenNotSet() { + Account account = new Account(); + String actual = account.getAccount_number(); + assertNull((String) actual); + } + + @Test + @Tag("boundary") + @DisplayName("Getter returns empty string when set to empty") + public void testGetAccountNumberReturnsEmptyStringWhenSetToEmpty() { + Account account = new Account(); + account.setAccount_number(""); + String actual = account.getAccount_number(); + assertEquals((String) "", (String) actual); + } + + @Test + @Tag("valid") + @DisplayName("Getter preserves whitespace in the assigned account_number") + public void testGetAccountNumberPreservesWhitespace() { + Account account = new Account(); + String expected = " 12345 "; + account.setAccount_number(expected); + String actual = account.getAccount_number(); + assertEquals((String) expected, (String) actual); + } + + @Test + @Tag("valid") + @DisplayName("Getter handles non-numeric account_number strings") + public void testGetAccountNumberAcceptsNonNumericStrings() { + Account account = new Account(); + String expected = "ACC-123-XYZ"; + account.setAccount_number(expected); + String actual = account.getAccount_number(); + assertEquals((String) expected, (String) actual); + } + + @Test + @Tag("boundary") + @DisplayName("Getter handles very long account_number values") + public void testGetAccountNumberHandlesVeryLongString() { + // TODO: Adjust the length if the system imposes a maximum allowed length for + // account_number + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 2048; i++) { + sb.append('9'); + } + String expected = sb.toString(); + Account account = new Account(); + account.setAccount_number(expected); + String actual = account.getAccount_number(); + assertEquals((String) expected, (String) actual); + } + + @Test + @Tag("valid") + @DisplayName("Getter handles Unicode characters in account_number") + public void testGetAccountNumberHandlesUnicode() { + String expected = "账户-№-Δ-𝟠-🙂"; + Account account = new Account(); + account.setAccount_number(expected); + String actual = account.getAccount_number(); + assertEquals((String) expected, (String) actual); + } + + @Test + @Tag("invalid") + @DisplayName("Getter returns null when account_number is explicitly set to null") + public void testGetAccountNumberAfterSettingNull() { + Account account = new Account(); + account.setAccount_number(null); + String actual = account.getAccount_number(); + assertNull((String) actual); + } + +} \ No newline at end of file diff --git a/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetAccountTypeTest.java b/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetAccountTypeTest.java new file mode 100644 index 0000000..470ee58 --- /dev/null +++ b/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetAccountTypeTest.java @@ -0,0 +1,54 @@ + +// ********RoostGPT******** +/* +Test generated by RoostGPT for test unit-java-springboot using AI Type Azure Open AI and AI Model gpt-5 + +ROOST_METHOD_HASH=getAccount_type_c5520dc350 +ROOST_METHOD_SIG_HASH=getAccount_type_458b0e6f7b + +Scenario 1: Returns null by default when no account_type is set + +Details: + TestName: returnsNullByDefaultWhenNotSet + Description: Verify that a newly constructed Account instance returns null from getAccount_type() when account_type has not been explicitly set. + +Execution: + Arrange: Create a new Account instance without calling setAccount_type. + Act: Invoke getAccount_type() and capture the result. + Assert: Use assertNull to confirm the returned value is null. + +Validation: + This assertion verifies that the default state of account_type is null prior to any setter invocation. It confirms that no implicit defaulting or initialization occurs in the getter and that the field is returned as-is when unset. + +*/ + +// ********RoostGPT******** + +package com.beko.DemoBank_v1.models; + +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.*; +import javax.persistence.Entity; +import javax.persistence.Id; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@ExtendWith(MockitoExtension.class) +public class AccountGetAccountTypeTest { + + @Test + @Tag("boundary") + public void testReturnsNullByDefaultWhenNotSet() { + // Arrange + Account account = new Account(); + // Act + String result = account.getAccount_type(); + // Assert + Assertions.assertNull((String) result); + } + +} \ No newline at end of file diff --git a/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetBalanceTest.java b/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetBalanceTest.java new file mode 100644 index 0000000..35c7cb1 --- /dev/null +++ b/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetBalanceTest.java @@ -0,0 +1,476 @@ + +// ********RoostGPT******** +/* +Test generated by RoostGPT for test unit-java-springboot using AI Type Azure Open AI and AI Model gpt-5 + +ROOST_METHOD_HASH=getBalance_a59e66118b +ROOST_METHOD_SIG_HASH=getBalance_46f7c6f8ab + +Scenario 1: Returns null when balance was never initialized + +Details: + TestName: returnsNullWhenBalanceNotSet + Description: Verify that a newly created Account instance with no balance assigned returns null when getBalance is invoked. + +Execution: + Arrange: Create a new Account instance without calling setBalance. + Act: Call getBalance on the Account instance. + Assert: Use JUnit assertions to verify that the returned value is null. + +Validation: + This assertion verifies that the default state of the balance field is null in a freshly instantiated entity without explicit initialization. It confirms that getBalance correctly exposes the internal field as-is and does not apply any defaulting behavior. + +Scenario 2: Returns the exact positive balance that was set + +Details: + TestName: returnsPositiveBalanceAsSet + Description: Ensure that when a positive BigDecimal (e.g., 100.00) is set via setBalance, getBalance returns an equal value with the same numeric value and scale. + +Execution: + Arrange: Create Account and set balance using setBalance with BigDecimal.valueOf(100).setScale(2). + Act: Invoke getBalance. + Assert: Assert that the returned BigDecimal equals the expected value (including scale) using a JUnit equality assertion. + +Validation: + Confirms that getBalance returns the same numeric amount and preserves scale as set by the application layer, reinforcing that no transformation occurs in the accessor. + +Scenario 3: Returns zero balance with preserved scale + +Details: + TestName: returnsZeroBalanceWithExactScale + Description: Verify that when balance is set to a zero value with a specific scale (e.g., 0.00), getBalance returns a value equal to the same scale representation. + +Execution: + Arrange: Create Account and call setBalance with BigDecimal.valueOf(0).setScale(2). + Act: Call getBalance. + Assert: Assert that the returned value equals BigDecimal.valueOf(0).setScale(2) (note that BigDecimal.equals considers scale). + +Validation: + Validates that scale is preserved. This is significant because BigDecimal equality is scale-sensitive; financial applications often require exact scale retention. + +Scenario 4: Returns negative balance as set + +Details: + TestName: returnsNegativeBalanceAsSet + Description: Ensure that getBalance can return a negative monetary amount when a negative BigDecimal is set. + +Execution: + Arrange: Create Account and set balance to a negative amount, such as BigDecimal.valueOf(-2500, 2) (i.e., -25.00). + Act: Invoke getBalance. + Assert: Assert that the returned value equals the negative BigDecimal expected. + +Validation: + Ensures the entity supports negative balances (e.g., overdrafts) and that getBalance accurately reflects negative values without alteration. + +Scenario 5: Preserves large magnitude values + +Details: + TestName: returnsVeryLargeBalanceUnchanged + Description: Validate that very large BigDecimal values (e.g., 10^30) set via setBalance are returned unchanged by getBalance. + +Execution: + Arrange: Create Account and set balance to a very large BigDecimal, such as new BigDecimal("100000000000000000000000000000"). + Act: Call getBalance. + Assert: Assert equality between returned and expected BigDecimal. + +Validation: + Demonstrates that the method handles high-magnitude numbers without overflow or precision loss, which is critical for accounts with large sums. + +Scenario 6: Preserves high-precision scale + +Details: + TestName: returnsHighPrecisionBalanceAsSet + Description: Verify that a high-precision BigDecimal (e.g., scale 6 or more) is returned with exact value and scale. + +Execution: + Arrange: Create Account and set balance to new BigDecimal("1234.567890"). + Act: Invoke getBalance. + Assert: Assert that the returned BigDecimal equals the value and scale that were set. + +Validation: + Confirms that no rounding or truncation occurs in getBalance, important for precise financial calculations. + +Scenario 7: Returns the latest value after multiple updates + +Details: + TestName: returnsMostRecentlySetBalance + Description: Confirm that if balance is updated multiple times via setBalance, getBalance returns the most recently assigned value. + +Execution: + Arrange: Create Account, call setBalance with an initial value (e.g., 10.00), then set a new value (e.g., 99.99). + Act: Call getBalance after the second set. + Assert: Assert that the returned value equals the second (latest) BigDecimal. + +Validation: + Ensures that subsequent updates overwrite previous values and that getBalance reflects the latest state, aligning with typical setter semantics. + +Scenario 8: Returns the exact same object reference that was set + +Details: + TestName: returnsSameInstanceReference + Description: Ensure that getBalance returns the exact BigDecimal instance set via setBalance (identity equality), not a copy. + +Execution: + Arrange: Create Account and construct a BigDecimal instance, assign it via setBalance. + Act: Invoke getBalance and capture the result. + Assert: Use an identity-based assertion (e.g., assertSame) to verify the returned reference is the same instance. + +Validation: + Verifies that getBalance is a simple accessor returning the field reference without cloning. This can matter for performance and for understanding reference semantics (though BigDecimal is immutable). + +Scenario 9: Returned BigDecimal immutability does not affect stored value + +Details: + TestName: returnedBalanceImmutabilityDoesNotAlterStoredValue + Description: Validate that performing arithmetic operations on the BigDecimal returned by getBalance does not change the internally stored balance (since BigDecimal is immutable). + +Execution: + Arrange: Create Account and set a known balance (e.g., 50.00). Retrieve it via getBalance, then perform an operation on the returned object (e.g., add(BigDecimal.TEN)) to create a new BigDecimal. + Act: Call getBalance again after the operation. + Assert: Assert that the account’s balance remains equal to the original value (e.g., 50.00), not the result of the arithmetic. + +Validation: + Ensures that consumers understand the immutability of BigDecimal and that getBalance does not expose a mutable state that could be altered inadvertently. + +Scenario 10: Returns null when balance is explicitly set to null + +Details: + TestName: returnsNullAfterExplicitNullSet + Description: Confirm that if setBalance is called with null, getBalance subsequently returns null. + +Execution: + Arrange: Create Account and call setBalance(null). + Act: Call getBalance. + Assert: Assert that the returned value is null. + +Validation: + Checks the method’s behavior with explicit null assignment, important for persistence and validation flows that may clear fields. + +Scenario 11: Invoking getBalance on a null Account reference throws NullPointerException + +Details: + TestName: nullReferenceInvocationThrowsNullPointerException + Description: Ensure that calling getBalance on a null Account reference appropriately results in a NullPointerException. + +Execution: + Arrange: Declare an Account reference and assign it to null. + Act: Attempt to invoke getBalance on this null reference within an assertion that expects an exception. + Assert: Use JUnit’s assertThrows to verify that a NullPointerException is thrown. + +Validation: + Validates client-side error handling and defensive programming expectations; while not a behavior of the method itself, it ensures tests cover misuse scenarios. + +Scenario 12: Calling getBalance has no side effects on timestamps + +Details: + TestName: getBalanceDoesNotModifyTimestamps + Description: Verify that invoking getBalance does not modify create_at or updated_at fields. + +Execution: + Arrange: Create Account, set create_at and updated_at to known LocalDateTime values, and set a balance. + Act: Call getBalance. + Assert: Assert that create_at and updated_at remain exactly the same as before the call. + +Validation: + Confirms that getBalance is a pure accessor with no side effects on other fields, aligning with expected getter behavior and preventing unintended state changes. + +Scenario 13: getBalance is unaffected by other fields being null or populated + +Details: + TestName: getBalanceIndependentOfOtherFields + Description: Ensure that getBalance returns the correct balance regardless of other fields (e.g., account_name, account_type, account_number) being null or set. + +Execution: + Arrange: Create Account, leave some fields null, set others via their setters, and assign a known balance. + Act: Invoke getBalance. + Assert: Assert that the returned balance equals the expected value. + +Validation: + Demonstrates field independence: the balance accessor should not depend on, compute from, or alter other attributes. + +Scenario 14: Concurrent reads and writes yield a consistent value without exceptions + +Details: + TestName: concurrentAccessReturnsConsistentOrLatestValue + Description: In a multithreaded scenario, verify that concurrent invocations of getBalance while another thread calls setBalance do not throw exceptions and return either the old or the newly set value. + +Execution: + Arrange: Create Account with an initial balance. Start one thread that frequently reads getBalance and another that updates the balance via setBalance with a new value. + Act: Run both threads for a short duration while capturing read results. + Assert: Assert that all read values are either the initial or the updated balance, and that no exceptions occur during the process. + +Validation: + While Java field reads of references are atomic, this test highlights that getBalance is safe for concurrent reads and exhibits eventual consistency under concurrent writes, important in high-throughput applications. + +Scenario 15: Preserves BigDecimal with unusual (negative) scale + +Details: + TestName: returnsBalanceWithNegativeScaleUnchanged + Description: Validate that BigDecimal values with non-standard negative scales (e.g., new BigDecimal("1E+3")) are returned unchanged. + +Execution: + Arrange: Create Account and set balance using a BigDecimal with a negative scale (scientific notation resulting in a negative scale). + Act: Invoke getBalance. + Assert: Assert that the returned value equals the same BigDecimal instance/value (preserving representation). + +Validation: + Ensures that getBalance does not re-scale or normalize unusual BigDecimal representations, which can occur with scientific notation and certain financial calculations. + +Scenario 16: Returns known constants exactly when set (e.g., BigDecimal.ZERO) + +Details: + TestName: returnsExactConstantInstanceWhenSet + Description: Ensure that when balance is set to a BigDecimal constant (e.g., BigDecimal.ZERO), getBalance returns that exact constant instance. + +Execution: + Arrange: Create Account and set balance to BigDecimal.ZERO. + Act: Call getBalance. + Assert: Use identity-based assertion (assertSame) to verify the returned reference is BigDecimal.ZERO. + +Validation: + Reinforces identity preservation and the absence of wrapping or copying in the getter, useful for performance and predictability when using shared constants. + +*/ + +// ********RoostGPT******** + +package com.beko.DemoBank_v1.models; + +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.*; +import javax.persistence.Entity; +import javax.persistence.Id; + +public class AccountGetBalanceTest { + + @Test + @Tag("boundary") + public void testReturnsNullWhenBalanceNotSet() { + Account account = new Account(); + BigDecimal actual = account.getBalance(); + assertNull((Object) actual, "Expected null when balance is not initialized"); + } + + @Test + @Tag("valid") + public void testReturnsPositiveBalanceAsSet() { + Account account = new Account(); + BigDecimal expected = BigDecimal.valueOf(100).setScale(2); + account.setBalance(expected); + BigDecimal actual = account.getBalance(); + assertEquals((BigDecimal) expected, (BigDecimal) actual, "Expected the same positive balance with exact scale"); + } + + @Test + @Tag("boundary") + public void testReturnsZeroBalanceWithExactScale() { + Account account = new Account(); + BigDecimal expected = BigDecimal.valueOf(0).setScale(2); + account.setBalance(expected); + BigDecimal actual = account.getBalance(); + assertEquals((BigDecimal) expected, (BigDecimal) actual, "Expected zero balance preserving exact scale"); + } + + @Test + @Tag("boundary") + public void testReturnsNegativeBalanceAsSet() { + Account account = new Account(); + BigDecimal expected = BigDecimal.valueOf(-2500, 2); // -25.00 + account.setBalance(expected); + BigDecimal actual = account.getBalance(); + assertEquals((BigDecimal) expected, (BigDecimal) actual, "Expected negative balance to be preserved"); + } + + @Test + @Tag("boundary") + public void testReturnsVeryLargeBalanceUnchanged() { + Account account = new Account(); + BigDecimal expected = new BigDecimal("100000000000000000000000000000"); + account.setBalance(expected); + BigDecimal actual = account.getBalance(); + assertEquals((BigDecimal) expected, (BigDecimal) actual, "Expected very large BigDecimal to be unchanged"); + } + + @Test + @Tag("boundary") + public void testReturnsHighPrecisionBalanceAsSet() { + Account account = new Account(); + BigDecimal expected = new BigDecimal("1234.567890"); + account.setBalance(expected); + BigDecimal actual = account.getBalance(); + assertEquals((BigDecimal) expected, (BigDecimal) actual, + "Expected high-precision BigDecimal to be returned as set"); + } + + @Test + @Tag("valid") + public void testReturnsMostRecentlySetBalance() { + Account account = new Account(); + BigDecimal first = BigDecimal.valueOf(10).setScale(2); + BigDecimal expected = new BigDecimal("99.99"); + account.setBalance(first); + account.setBalance(expected); + BigDecimal actual = account.getBalance(); + assertEquals((BigDecimal) expected, (BigDecimal) actual, + "Expected the most recently set balance to be returned"); + } + + @Test + @Tag("valid") + public void testReturnsSameInstanceReference() { + Account account = new Account(); + BigDecimal expected = new BigDecimal("42.00"); + account.setBalance(expected); + BigDecimal actual = account.getBalance(); + assertSame((Object) expected, (Object) actual, + "Expected the same BigDecimal instance reference to be returned"); + } + + @Test + @Tag("valid") + public void testReturnedBalanceImmutabilityDoesNotAlterStoredValue() { + Account account = new Account(); + BigDecimal expected = new BigDecimal("50.00"); + account.setBalance(expected); + BigDecimal retrieved = account.getBalance(); + BigDecimal computed = retrieved.add(BigDecimal.TEN); + assertEquals((BigDecimal) new BigDecimal("60.00"), (BigDecimal) computed, "Sanity check for arithmetic result"); + BigDecimal actualAfter = account.getBalance(); + assertEquals((BigDecimal) expected, (BigDecimal) actualAfter, + "Expected stored balance to remain unchanged after arithmetic on retrieved value"); + } + + @Test + @Tag("invalid") + public void testReturnsNullAfterExplicitNullSet() { + Account account = new Account(); + account.setBalance(null); + BigDecimal actual = account.getBalance(); + assertNull((Object) actual, "Expected null after setting balance to null"); + } + + @Test + @Tag("invalid") + public void testNullReferenceInvocationThrowsNullPointerException() { + assertThrows(NullPointerException.class, () -> { + Account ref = null; + // Intentional NPE invocation + ref.getBalance(); // NOSONAR + }, "Expected NullPointerException when invoking method on null reference"); + } + + @Test + @Tag("valid") + public void testGetBalanceDoesNotModifyTimestamps() { + Account account = new Account(); + LocalDateTime created = LocalDateTime.of(2023, 1, 1, 0, 0); + LocalDateTime updated = LocalDateTime.of(2023, 6, 1, 12, 30); + account.setCreate_at(created); + account.setUpdated_at(updated); + BigDecimal expected = new BigDecimal("5.00"); + account.setBalance(expected); + BigDecimal actual = account.getBalance(); + assertEquals((BigDecimal) expected, (BigDecimal) actual, "Sanity check on balance value"); + assertEquals((LocalDateTime) created, (LocalDateTime) account.getCreate_at(), + "create_at should remain unchanged after getBalance"); + assertEquals((LocalDateTime) updated, (LocalDateTime) account.getUpdated_at(), + "updated_at should remain unchanged after getBalance"); + } + + @Test + @Tag("valid") + public void testGetBalanceIndependentOfOtherFields() { + Account account = new Account(); + // Populate some fields; leave others null to verify independence + account.setAccount_name("Primary Checking"); // TODO: Adjust test data based on + // your domain if needed + account.setAccount_type("CHECKING"); // TODO: Adjust test data based on your + // domain if needed + account.setAccount_number("1234567890"); // TODO: Adjust test data based on your + // domain if needed + BigDecimal expected = new BigDecimal("777.77"); + account.setBalance(expected); + BigDecimal actual = account.getBalance(); + assertEquals((BigDecimal) expected, (BigDecimal) actual, + "Balance should be independent of other fields' values"); + } + + @Test + @Tag("integration") + public void testConcurrentAccessReturnsConsistentOrLatestValue() throws InterruptedException { + Account account = new Account(); + BigDecimal initial = new BigDecimal("1.00"); + BigDecimal updated = new BigDecimal("2.00"); + account.setBalance(initial); + List reads = Collections.synchronizedList(new ArrayList<>()); + List errors = Collections.synchronizedList(new ArrayList<>()); + Thread reader = new Thread(() -> { + try { + long end = System.currentTimeMillis() + 150; // ~150ms + while (System.currentTimeMillis() < end) { + BigDecimal v = account.getBalance(); + if (v == null) { + errors.add(new AssertionError("Read null balance during concurrent access")); + } + else { + reads.add(v); + } + } + } + catch (Throwable t) { + errors.add(t); + } + }, "reader-thread"); + Thread writer = new Thread(() -> { + try { + // Simple write once after a short delay + Thread.sleep(50); + account.setBalance(updated); + } + catch (Throwable t) { + errors.add(t); + } + }, "writer-thread"); + reader.start(); + writer.start(); + reader.join(1000); + writer.join(1000); + assertTrue(errors.isEmpty(), "No exceptions should occur during concurrent access"); + // Ensure all reads are either initial or updated value + for (BigDecimal v : reads) { + boolean matchesInitial = v.equals(initial); + boolean matchesUpdated = v.equals(updated); + assertTrue(matchesInitial || matchesUpdated, "Read values should be either the initial or updated balance"); + } + } + + @Test + @Tag("boundary") + public void testReturnsBalanceWithNegativeScaleUnchanged() { + Account account = new Account(); + BigDecimal expected = new BigDecimal("1E+3"); // scale -3 representation of 1000 + account.setBalance(expected); + BigDecimal actual = account.getBalance(); + assertSame((Object) expected, (Object) actual, + "Expected BigDecimal with negative scale to be returned unchanged (same instance)"); + assertEquals((BigDecimal) expected, (BigDecimal) actual, "Also expect numerical equality to hold"); + } + + @Test + @Tag("valid") + public void testReturnsExactConstantInstanceWhenSet() { + Account account = new Account(); + BigDecimal expected = BigDecimal.ZERO; + account.setBalance(expected); + BigDecimal actual = account.getBalance(); + assertSame((Object) expected, (Object) actual, "Expected the exact BigDecimal.ZERO instance when set"); + } + +} \ No newline at end of file diff --git a/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetCreateAtTest.java b/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetCreateAtTest.java new file mode 100644 index 0000000..6558c6f --- /dev/null +++ b/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetCreateAtTest.java @@ -0,0 +1,439 @@ + +// ********RoostGPT******** +/* +Test generated by RoostGPT for test unit-java-springboot using AI Type Azure Open AI and AI Model gpt-5 + +ROOST_METHOD_HASH=getCreate_at_8968989375 +ROOST_METHOD_SIG_HASH=getCreate_at_24819cd965 + +Scenario 1: Return null when create_at has never been set + +Details: + TestName: returnsNullWhenCreateAtNotSet + Description: Verify that a newly instantiated Account returns null from getCreate_at() when no value has been assigned to create_at. + +Execution: + Arrange: Instantiate a new Account without invoking setCreate_at(...) or any other setter that might affect create_at. + Act: Call getCreate_at() on the Account instance. + Assert: Use assertNull to confirm that the returned value is null. + +Validation: + Confirm that the default state for create_at is null, ensuring the getter accurately reflects uninitialized fields. This is important because many persistence layers or business rules may treat a null creation time as “not yet persisted or initialized.” + + +Scenario 2: Return the exact timestamp after a standard assignment + +Details: + TestName: returnsExactValueAfterSettingStandardTimestamp + Description: Confirm that after setting create_at to a typical LocalDateTime (with seconds), getCreate_at() returns the same value. + +Execution: + Arrange: Create an Account and set create_at using setCreate_at(LocalDateTime.of(2023, 5, 10, 15, 30, 45)). + Act: Invoke getCreate_at(). + Assert: Use assertEquals to compare the returned value with the originally set LocalDateTime. Optionally, use assertSame to confirm it is the same object reference that was set. + +Validation: + Validate that the getter returns the exact timestamp, preserving the assigned value and object reference. This ensures no transformation or unintended modification occurs between set and get operations. + + +Scenario 3: Return the latest assigned timestamp after multiple updates + +Details: + TestName: returnsLatestValueAfterMultipleSetOperations + Description: Ensure that getCreate_at() reflects the most recent value when create_at is updated multiple times. + +Execution: + Arrange: Create an Account, call setCreate_at(firstTimestamp), then call setCreate_at(secondTimestamp) with a different LocalDateTime. + Act: Invoke getCreate_at(). + Assert: Use assertEquals to verify the returned value equals secondTimestamp. Use assertNotEquals to verify it differs from firstTimestamp. + +Validation: + Confirm the getter reflects the current state of the field after successive updates, which is crucial for correctness when records are re-initialized or corrected. + + +Scenario 4: Return null after explicitly setting create_at to null + +Details: + TestName: returnsNullAfterExplicitNullAssignment + Description: Verify that explicitly setting create_at to null is honored, and getCreate_at() returns null. + +Execution: + Arrange: Create an Account, set a non-null LocalDateTime via setCreate_at(...), then setCreate_at(null). + Act: Call getCreate_at(). + Assert: Use assertNull to verify the returned value is null. + +Validation: + Ensure the API supports clearing the create_at field and that the getter exposes this cleared state, which may be needed for data corrections or resetting fields. + + +Scenario 5: Preserve nanosecond precision + +Details: + TestName: preservesNanosecondPrecision + Description: Validate that getCreate_at() returns a value with full nanosecond precision as assigned. + +Execution: + Arrange: Create an Account and invoke setCreate_at(LocalDateTime.of(2023, 1, 1, 0, 0, 0, 123456789)). + Act: Invoke getCreate_at(). + Assert: Use assertEquals to compare the returned value with the exact LocalDateTime including nanoseconds. Optionally, use assertSame to confirm the same reference is returned. + +Validation: + Confirm no truncation or rounding of the timestamp occurs. This is significant for systems that rely on high-resolution timestamps (e.g., audit trails). + + +Scenario 6: Handle the minimum boundary value + +Details: + TestName: returnsMinBoundaryTimestampUnchanged + Description: Ensure that assigning LocalDateTime.MIN is accurately returned by getCreate_at(). + +Execution: + Arrange: Create an Account and set create_at to LocalDateTime.MIN. + Act: Call getCreate_at(). + Assert: Use assertEquals to confirm the returned value is LocalDateTime.MIN. + +Validation: + Validate boundary handling to avoid issues when encountering very early timestamps, ensuring the model accommodates edge cases without errors. + + +Scenario 7: Handle the maximum boundary value + +Details: + TestName: returnsMaxBoundaryTimestampUnchanged + Description: Ensure that assigning LocalDateTime.MAX is accurately returned by getCreate_at(). + +Execution: + Arrange: Create an Account and set create_at to LocalDateTime.MAX. + Act: Call getCreate_at(). + Assert: Use assertEquals to confirm the returned value is LocalDateTime.MAX. + +Validation: + Validate upper boundary handling for extreme future timestamps, ensuring the getter is robust for edge-case values. + + +Scenario 8: Return the same instance across repeated calls + +Details: + TestName: repeatedCallsReturnSameInstance + Description: Verify that calling getCreate_at() multiple times returns the same object reference (reflecting simple field access without defensive copying). + +Execution: + Arrange: Create an Account, set create_at to a specific LocalDateTime. + Act: Call getCreate_at() twice and store both results. + Assert: Use assertSame to confirm both results reference the same LocalDateTime instance. + +Validation: + Confirm the getter does not create new instances on each call, ensuring consistent identity and potential performance expectations for a simple entity getter. + + +Scenario 9: Unaffected by changes to unrelated fields + +Details: + TestName: unaffectedByChangesToOtherFields + Description: Ensure that modifying other Account fields does not affect the value returned by getCreate_at(). + +Execution: + Arrange: Create an Account, set create_at to a known LocalDateTime, then modify various other fields (e.g., setAccount_id(...), setUser_id(...), setAccount_number(...), setAccount_name(...), setAccount_type(...), setBalance(...)). + Act: Call getCreate_at() after modifying other fields. + Assert: Use assertEquals to confirm the returned value equals the originally assigned create_at. + +Validation: + Verify field independence so that unrelated changes do not influence the creation timestamp, preserving data integrity across field updates. + + +Scenario 10: Independent from updated_at changes + +Details: + TestName: notAffectedByUpdatedAtChanges + Description: Validate that altering updated_at does not change the value returned by getCreate_at(). + +Execution: + Arrange: Create an Account, set create_at to a known LocalDateTime, then set updated_at to a different LocalDateTime and possibly reassign updated_at again. + Act: Call getCreate_at() after the updated_at changes. + Assert: Use assertEquals to ensure create_at remains the originally assigned value. + +Validation: + Confirm that both timestamps are independent, preventing accidental coupling between creation and update times. + + +Scenario 11: Correctness when comparing with an equal but distinct LocalDateTime instance + +Details: + TestName: equalsSemanticsWithDistinctButEqualTimestamp + Description: Ensure that getCreate_at() returns a value that is equal to another LocalDateTime instance with the same date-time fields, even if it is not the same reference. + +Execution: + Arrange: Create an Account, set create_at to a specific LocalDateTime original. Separately, construct another LocalDateTime equalTimestamp with identical date-time values. + Act: Call getCreate_at() to obtain actual. + Assert: Use assertEquals to verify actual equals equalTimestamp. Optionally, also use assertSame to verify actual is the same reference as original (and assertNotSame between actual and equalTimestamp if desired). + +Validation: + Confirm logical equality of timestamps regardless of object identity, which is critical for value-based comparisons in tests and business logic. + + +Scenario 12: External variable reassignment does not alter stored timestamp + +Details: + TestName: externalVariableReassignmentDoesNotAffectStoredTimestamp + Description: Demonstrate that reassigning the local variable used to set create_at does not change the object stored in Account. + +Execution: + Arrange: Create an Account and a LocalDateTime ts1; call setCreate_at(ts1). Then reassign the local variable ts1 to a different LocalDateTime (e.g., ts1.plusDays(1)) without calling setCreate_at again. + Act: Call getCreate_at(). + Assert: Use assertNotEquals to ensure the returned value differs from the reassigned ts1. Use assertEquals to verify the returned value equals the originally set timestamp. + +Validation: + Ensure that the Account holds the previously assigned object reference, and external variable reassignment does not back-propagate into the entity field. This guards against misunderstandings about reference handling in tests. + + +Scenario 13: Consistency under concurrent reads + +Details: + TestName: consistentValueUnderConcurrentReads + Description: Validate that when multiple threads read getCreate_at() concurrently, they all observe the same value without exceptions. + +Execution: + Arrange: Create an Account, set create_at to a known LocalDateTime, and prepare multiple parallel tasks that each call getCreate_at() and capture the result. + Act: Execute the parallel reads and collect all returned values. + Assert: Use assertions to confirm that every returned value is equal to the originally assigned LocalDateTime and that no unexpected exceptions occurred. + +Validation: + While simple getters are typically thread-safe for reads, this confirms the absence of race conditions or visibility issues in typical concurrent read scenarios. + + +Scenario 14: Stability after sequential modifications to updated_at and other fields + +Details: + TestName: remainsStableAfterSequentialOtherFieldModifications + Description: Ensure that the creation timestamp remains stable even when several other fields, including updated_at, are changed sequentially. + +Execution: + Arrange: Create an Account, set create_at to a known LocalDateTime. Then, sequentially modify updated_at and other fields (account_id, user_id, account_number, account_name, account_type, balance) multiple times. + Act: Invoke getCreate_at() after the sequence of changes. + Assert: Use assertEquals to verify that the returned value remains the same as the initially set create_at. + +Validation: + Reinforce the independence and stability of create_at against a series of unrelated updates, which is important for maintaining accurate creation metadata in dynamic application flows. + +*/ + +// ********RoostGPT******** + +package com.beko.DemoBank_v1.models; + +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import javax.persistence.Entity; +import javax.persistence.Id; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.*; +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.*; + +public class AccountGetCreateAtTest { + + @Test + @Tag("valid") + public void testReturnsNullWhenCreateAtNotSet() { + Account account = new Account(); + LocalDateTime actual = account.getCreate_at(); + assertNull((LocalDateTime) actual); + } + + @Test + @Tag("valid") + public void testReturnsExactValueAfterSettingStandardTimestamp() { + Account account = new Account(); + LocalDateTime expected = LocalDateTime.of(2023, 5, 10, 15, 30, 45); + account.setCreate_at(expected); + LocalDateTime actual = account.getCreate_at(); + assertEquals((LocalDateTime) expected, (LocalDateTime) actual); + assertSame((LocalDateTime) expected, (LocalDateTime) actual); + } + + @Test + @Tag("valid") + public void testReturnsLatestValueAfterMultipleSetOperations() { + Account account = new Account(); + LocalDateTime firstTimestamp = LocalDateTime.of(2022, 1, 1, 0, 0, 0); + LocalDateTime secondTimestamp = LocalDateTime.of(2024, 2, 2, 12, 30, 15); + account.setCreate_at(firstTimestamp); + account.setCreate_at(secondTimestamp); + LocalDateTime actual = account.getCreate_at(); + assertEquals((LocalDateTime) secondTimestamp, (LocalDateTime) actual); + assertNotEquals((LocalDateTime) firstTimestamp, (LocalDateTime) actual); + } + + @Test + @Tag("valid") + public void testReturnsNullAfterExplicitNullAssignment() { + Account account = new Account(); + LocalDateTime initial = LocalDateTime.of(2021, 6, 15, 8, 45, 30); + account.setCreate_at(initial); + account.setCreate_at(null); + LocalDateTime actual = account.getCreate_at(); + assertNull((LocalDateTime) actual); + } + + @Test + @Tag("valid") + public void testPreservesNanosecondPrecision() { + Account account = new Account(); + LocalDateTime expected = LocalDateTime.of(2023, 1, 1, 0, 0, 0, 123_456_789); + account.setCreate_at(expected); + LocalDateTime actual = account.getCreate_at(); + assertEquals((LocalDateTime) expected, (LocalDateTime) actual); + assertSame((LocalDateTime) expected, (LocalDateTime) actual); + } + + @Test + @Tag("boundary") + public void testReturnsMinBoundaryTimestampUnchanged() { + Account account = new Account(); + LocalDateTime expected = LocalDateTime.MIN; + account.setCreate_at(expected); + LocalDateTime actual = account.getCreate_at(); + assertEquals((LocalDateTime) expected, (LocalDateTime) actual); + } + + @Test + @Tag("boundary") + public void testReturnsMaxBoundaryTimestampUnchanged() { + Account account = new Account(); + LocalDateTime expected = LocalDateTime.MAX; + account.setCreate_at(expected); + LocalDateTime actual = account.getCreate_at(); + assertEquals((LocalDateTime) expected, (LocalDateTime) actual); + } + + @Test + @Tag("valid") + public void testRepeatedCallsReturnSameInstance() { + Account account = new Account(); + LocalDateTime expected = LocalDateTime.of(2022, 12, 31, 23, 59, 59, 999_999_999); + account.setCreate_at(expected); + LocalDateTime firstCall = account.getCreate_at(); + LocalDateTime secondCall = account.getCreate_at(); + assertSame((LocalDateTime) firstCall, (LocalDateTime) secondCall); + assertSame((LocalDateTime) expected, (LocalDateTime) firstCall); + } + + @Test + @Tag("valid") + public void testUnaffectedByChangesToOtherFields() { + Account account = new Account(); + LocalDateTime expected = LocalDateTime.of(2020, 7, 20, 10, 15, 0); + account.setCreate_at(expected); + // Modify unrelated fields + account.setAccount_id(1); + account.setUser_id(2); + account.setAccount_number("ACCT-0001"); // TODO: Update as per your account number + // format + account.setAccount_name("Primary Account"); // TODO: Update as per your domain + // naming + account.setAccount_type("SAVINGS"); // TODO: Update as per valid account types in + // your system + account.setBalance(new BigDecimal("1000.00")); + LocalDateTime actual = account.getCreate_at(); + assertEquals((LocalDateTime) expected, (LocalDateTime) actual); + } + + @Test + @Tag("valid") + public void testNotAffectedByUpdatedAtChanges() { + Account account = new Account(); + LocalDateTime expected = LocalDateTime.of(2019, 3, 3, 3, 3, 3, 3); + account.setCreate_at(expected); + LocalDateTime updated1 = LocalDateTime.of(2021, 4, 4, 4, 4, 4, 4); + LocalDateTime updated2 = LocalDateTime.of(2022, 5, 5, 5, 5, 5, 5); + account.setUpdated_at(updated1); + account.setUpdated_at(updated2); + LocalDateTime actual = account.getCreate_at(); + assertEquals((LocalDateTime) expected, (LocalDateTime) actual); + } + + @Test + @Tag("valid") + public void testEqualsSemanticsWithDistinctButEqualTimestamp() { + Account account = new Account(); + LocalDateTime original = LocalDateTime.of(2023, 11, 30, 9, 0, 0, 10); + account.setCreate_at(original); + LocalDateTime equalTimestamp = LocalDateTime.of(2023, 11, 30, 9, 0, 0, 10); + LocalDateTime actual = account.getCreate_at(); + assertEquals((LocalDateTime) equalTimestamp, (LocalDateTime) actual); + assertSame((LocalDateTime) original, (LocalDateTime) actual); + assertNotSame((LocalDateTime) equalTimestamp, (LocalDateTime) actual); + } + + @Test + @Tag("valid") + public void testExternalVariableReassignmentDoesNotAffectStoredTimestamp() { + Account account = new Account(); + LocalDateTime originalTs = LocalDateTime.of(2022, 8, 1, 14, 0, 0, 100); + LocalDateTime ts1 = originalTs; + account.setCreate_at(ts1); + // Reassign local variable without updating the entity + ts1 = ts1.plusDays(1); + LocalDateTime actual = account.getCreate_at(); + assertNotEquals((LocalDateTime) ts1, (LocalDateTime) actual); + assertEquals((LocalDateTime) originalTs, (LocalDateTime) actual); + } + + @Test + @Tag("integration") + public void testConsistentValueUnderConcurrentReads() throws InterruptedException, ExecutionException { + Account account = new Account(); + LocalDateTime expected = LocalDateTime.of(2021, 1, 1, 1, 1, 1, 1); + account.setCreate_at(expected); + int threadCount = 12; // TODO: Adjust thread count if needed for your environment + ExecutorService executor = Executors.newFixedThreadPool(threadCount); + List> tasks = new ArrayList<>(); + for (int i = 0; i < threadCount; i++) { + tasks.add(account::getCreate_at); + } + List> futures = executor.invokeAll(tasks); + executor.shutdown(); + boolean terminated = executor.awaitTermination(10, TimeUnit.SECONDS); + assertTrue(terminated); + for (Future f : futures) { + LocalDateTime value = f.get(); + assertNotNull((LocalDateTime) value); + assertEquals((LocalDateTime) expected, (LocalDateTime) value); + } + } + + @Test + @Tag("integration") + public void testRemainsStableAfterSequentialOtherFieldModifications() { + Account account = new Account(); + LocalDateTime expected = LocalDateTime.of(2018, 2, 14, 12, 0, 0, 0); + account.setCreate_at(expected); + // Sequential modifications to other fields multiple times + account.setUpdated_at(LocalDateTime.of(2020, 2, 1, 0, 0)); + account.setAccount_id(10); + account.setUser_id(20); + account.setAccount_number("ACCT-0020"); // TODO: Update according to your account + // number convention + account.setAccount_name("Operations"); // TODO: Update according to your domain + // naming + account.setAccount_type("CHECKING"); // TODO: Ensure this matches accepted types + // in your system + account.setBalance(new BigDecimal("500.00")); + account.setUpdated_at(LocalDateTime.of(2020, 3, 1, 0, 0)); + account.setAccount_id(11); + account.setUser_id(21); + account.setAccount_number("ACCT-0021"); // TODO: Update according to your account + // number convention + account.setAccount_name("Operations-2"); // TODO: Update according to your domain + // naming + account.setAccount_type("CHECKING"); // TODO: Ensure this matches accepted types + // in your system + account.setBalance(new BigDecimal("750.50")); + LocalDateTime actual = account.getCreate_at(); + assertEquals((LocalDateTime) expected, (LocalDateTime) actual); + } + +} \ No newline at end of file diff --git a/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetUpdatedAtTest.java b/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetUpdatedAtTest.java new file mode 100644 index 0000000..4e7909a --- /dev/null +++ b/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetUpdatedAtTest.java @@ -0,0 +1,58 @@ + +// ********RoostGPT******** +/* +Test generated by RoostGPT for test unit-java-springboot using AI Type Azure Open AI and AI Model gpt-5 + +ROOST_METHOD_HASH=getUpdated_at_e78d9eb596 +ROOST_METHOD_SIG_HASH=getUpdated_at_7aa7f28157 + + +Scenario 1: Returns null by default on a new Account + +Details: + TestName: returnsNullByDefaultWhenNotSet + Description: Verifies that a newly constructed Account instance has no updated_at value set and that getUpdated_at returns null. + +Execution: + Arrange: Create a new Account instance without setting updated_at. + Act: Call getUpdated_at on the Account instance. + Assert: Use JUnit assertNull to verify that the returned value is null. + +Validation: + This assertion verifies the default state of the entity’s updated_at field. Since no setter has been invoked, the field should remain unset (null), confirming correct default initialization for newly created entities. + +*/ + +// ********RoostGPT******** + +package com.beko.DemoBank_v1.models; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.DisplayName; +import java.time.LocalDateTime; +import static org.junit.jupiter.api.Assertions.assertNull; +import org.junit.jupiter.api.*; +import javax.persistence.Entity; +import javax.persistence.Id; +import java.math.BigDecimal; + +public class AccountGetUpdatedAtTest { + + private Account account; + + @BeforeEach + public void setUp() { + account = new Account(); + } + + @Test + @Tag("valid") + @DisplayName("Verifies that getUpdated_at returns null when not explicitly set on a new Account") + public void returnsNullByDefaultWhenNotSet() { + LocalDateTime actual = account.getUpdated_at(); + assertNull((LocalDateTime) actual); + } + +} \ No newline at end of file diff --git a/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetUserIdTest.java b/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetUserIdTest.java new file mode 100644 index 0000000..deec4d3 --- /dev/null +++ b/Online-Banking-App-Spring-Boot/src/test/java/com/beko/DemoBank_v1/models/AccountGetUserIdTest.java @@ -0,0 +1,53 @@ + +// ********RoostGPT******** +/* +Test generated by RoostGPT for test unit-java-springboot using AI Type Azure Open AI and AI Model gpt-5 + +ROOST_METHOD_HASH=getUser_id_307024e735 +ROOST_METHOD_SIG_HASH=getUser_id_3ef25c8115 + +Scenario 1: Return default user_id when Account is newly created + +Details: + TestName: returnsDefaultUserIdWhenNotSet + Description: Verify that getUser_id returns the Java default value for an int when a new Account instance is created and user_id has not been explicitly set. + +Execution: + Arrange: Create a new Account instance without calling setUser_id. + Act: Invoke getUser_id on the newly created Account. + Assert: Use JUnit assertEquals to compare the expected value 0 with the actual result returned by getUser_id. + +Validation: + Clarify: The assertion verifies that the getter reflects the default primitive int value (0) when no prior assignment has been made. + Significance: Confirms predictable default behavior and prevents unexpected null handling, which is impossible for primitive int fields. + +*/ + +// ********RoostGPT******** + +package com.beko.DemoBank_v1.models; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.*; +import javax.persistence.Entity; +import javax.persistence.Id; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +public class AccountGetUserIdTest { + + @Test + @Tag("valid") + @DisplayName("returnsDefaultUserIdWhenNotSet") + public void testReturnsDefaultUserIdWhenNotSet() { + Account account = new Account(); // TODO: Ensure Account has an accessible no-arg + // constructor + int actual = (int) account.getUser_id(); + int expected = (int) 0; + assertEquals((int) expected, (int) actual); + } + +} \ No newline at end of file