Skip to content
Open
58 changes: 57 additions & 1 deletion pipelines/unittests/Jenkinsfile
Original file line number Diff line number Diff line change
Expand Up @@ -569,6 +569,57 @@ pipeline {
}
}
// __________________________________________________________________________________________
// ------------------------------ COVERAGE TESTS -------------------------------------------
stage ('Coverage Test Suite') { // MARK: Coverage Test Suite
when {
expression {
env.STATUS_BUILD == SUCCESS
}
}
steps {
container('compiler') {
script {
dir(REPO_NAME) {
def suiteName = "org.openbravo.test.CoverageTestSuite"
try {
echo "--------------- Running ${suiteName} ---------------"
sh "./gradlew test --tests ${suiteName} --info"
sh "mv build/jacoco/test.exec build/jacoco/test4.exec"
echo "--------------- ${suiteName} Successful ---------------"
currentBuild.result = SUCCESS
} catch (Exception e) {
env.ERROR_MESSAGE = "${suiteName} Failed"
echo "--------------- ${env.ERROR_MESSAGE} ---------------"
echo 'Exception occurred: ' + e.toString()
currentBuild.result = UNSTABLE
unstable(env.ERROR_MESSAGE)
env.STATUS_TEST = FAILED

def currentFailed = env.FAILED_SUITES ?: ""
env.FAILED_SUITES = currentFailed.isEmpty() ? "${suiteName}" : "${currentFailed}, ${suiteName}"
} finally {
if (fileExists("build/reports/tests/test/")) {
publishHTML([
allowMissing: true,
alwaysLinkToLastBuild: false,
keepAll: true,
reportDir: 'build/reports/tests/test',
reportFiles: '*.html',
reportName: 'COVERAGE TESTS REPORT',
reportTitles: ''
])
sh "rm -rf build/reports/tests/test"
} else {
echo "Report directory of Coverage tests does not exist. Skipping HTML report publishing."
}
sh "./gradlew --stop"
}
}
}
}
}
}
// __________________________________________________________________________________________
// ----------------------------------- JACOCO REPORT ----------------------------------------
stage('Generate Coverage Report') { // MARK: Generate Coverage Report
when {
Expand Down Expand Up @@ -641,6 +692,10 @@ pipeline {
sourceExclusions = "${sourceExclusions},${deprecatedExclusions}"

echo "Sources to exclusions: ${sourceExclusions}"

def coverageExclusions = readFile('pipelines/unittests/coverage-exclusions.txt').trim().readLines().findAll { it.trim() && !it.trim().startsWith('#') }.join(',')

echo "Coverage exclusions configured"
def modules_src_dirs = sh(script: "cd ${REPO_NAME}/modules_core && find . -type d -name 'src' | grep -v 'src-util' | sed 's|./|modules_core/|' | tr '\n' ','", returnStdout: true).trim()
echo "Modules with src directories: ${modules_src_dirs}"

Expand All @@ -666,7 +721,8 @@ pipeline {
-Dsonar.java.coveragePlugin=jacoco \
-Dsonar.coverage.jacoco.xmlReportPaths=${JACOCO_REPORT} \
-Dsonar.inclusions=**/*.java \
-Dsonar.exclusions=${sourceExclusions}
-Dsonar.exclusions=${sourceExclusions} \
-Dsonar.coverage.exclusions=${coverageExclusions}
"""
echo "---------------------- Getting SonarQube Report URL ----------------------"
def branchName = URLEncoder.encode(GIT_BRANCH, 'UTF-8')
Expand Down
218 changes: 218 additions & 0 deletions pipelines/unittests/coverage-exclusions.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,218 @@
**/erpCommon/ad_reports/**
**/erpCommon/ad_callouts/SL_*
**/erpCommon/ad_callouts/SE_*
**/erpCommon/ad_callouts/Multiphase_dates.java
**/erpCommon/ad_callouts/JavaPackageChecker.java
**/erpCommon/ad_callouts/OperativeQuantity_To_BaseQuantity.java
**/erpCommon/ad_callouts/SimpleCalloutInformationProvider.java
**/erpCommon/ad_callouts/CalloutConstants.java
**/erpCommon/ad_callouts/SysInfoCustomAllowed.java
**/erpCommon/ad_actionButton/**
**/erpCommon/ad_process/**
**/erpCommon/ad_forms/ModuleManagement.java
**/erpCommon/ad_forms/MaterialReceiptPending.java
**/erpCommon/ad_forms/RequisitionToOrder.java
**/erpCommon/ad_forms/SQLExecutor*.java
**/erpCommon/ad_forms/ShowSession*.java
**/erpCommon/ad_forms/InstanceManagement.java
**/erpCommon/ad_forms/GenerateInvoicesmanual.java
**/erpCommon/ad_forms/GenerateShipmentsmanual.java
**/erpCommon/ad_forms/Heartbeat.java
**/erpCommon/ad_forms/Translation*.java
**/erpCommon/ad_forms/UpdateReferenceData.java
**/erpCommon/ad_forms/ReducedTranslationHelper.java
**/erpCommon/ad_forms/MaturityLevel.java
**/erpCommon/ad_forms/CallAcctServer.java
**/erpCommon/ad_forms/Doc*Template.java
**/erpCommon/ad_forms/InitialOrgSetup.java
**/erpCommon/ad_help/**
**/erpCommon/info/Location.java
**/erpCommon/info/ImageInfo*.java
**/erpCommon/info/ContextRoleDirectAccessibleOrganizations.java
**/erpCommon/info/PriceListVersionFilter*.java
**/erpCommon/info/SelectorUtility.java
**/erpCommon/info/SimpleTabSelectorFilterExpression.java
**/erpCommon/info/RMProductSelectorFilterExpression.java
**/erpCommon/info/ServiceProductPricePrecisionFilterExpression.java
**/erpCommon/security/**
**/erpCommon/modules/**
**/erpCommon/obps/CheckCleanCache.java
**/erpCommon/utility/LeftTabsBar.java
**/erpCommon/utility/NavigationBar.java
**/erpCommon/utility/ToolBar*.java
**/erpCommon/utility/VerticalMenu.java
**/erpCommon/utility/DynamicJS.java
**/erpCommon/utility/PopupLoading.java
**/erpCommon/utility/GenericTreeServlet.java
**/erpCommon/utility/DownloadReport.java
**/erpCommon/utility/PoolStatus.java
**/erpCommon/utility/ShowImage*.java
**/erpCommon/utility/TableSQLData.java
**/erpCommon/utility/MessageJS.java
**/erpCommon/utility/ChangeAudit.java
**/erpCommon/utility/OpenPentaho.java
**/erpCommon/utility/MigrateAttachments.java
**/erpCommon/utility/StaticCommunityBranding.java
**/erpCommon/businessUtility/InitialClientSetup.java
**/erpCommon/businessUtility/EndYearCloseUtility.java
**/erpCommon/businessUtility/PrinterReports.java
**/erpCommon/businessUtility/PAttributeSet.java
**/erpCommon/businessUtility/WindowTabs.java
**/erpCommon/businessUtility/Tree.java
**/erpCommon/calloutsSequence/**
**/erpCommon/ReportsUtility.java
**/erpReports/**
**/base/secureApp/ErrorConnection.java
**/base/secureApp/ServletGoBack.java
**/base/secureApp/LoginHandler.java
**/base/session/HostNameTask.java
**/base/session/OBOracle10gDialect.java
**/configuration/ConfigurationApp.java
**/portal/GrantPortalAccessProcess.java
**/portal/NewUserEmail*.java
**/service/rest/DalWebService.java
**/service/db/ExportClientProcess.java
**/service/db/ImportClientProcess.java
**/service/importprocess/ImportEntryArchiveManager.java
**/service/importprocess/ImportEntryArchivePreProcessor.java
**/service/importprocess/ImportEntryClusterService.java
**/service/importprocess/ImportEntryPostProcessor.java
**/service/importprocess/ImportEntryPreProcessor.java
**/service/importprocess/ImportProcessContextListener.java
**/service/importprocess/ImportProcessUtils.java
**/service/importprocess/ImportReprocessErrorEntries.java
**/service/importprocess/ProcessImportEntriesProcessActionHandler.java
**/service/system/DatabaseValidator.java
**/service/system/SystemDeleteClientTask.java
**/service/system/SystemValidationTask.java
**/service/system/SystemValidator.java
**/service/web/WebServiceServlet.java
**/service/web/WebService.java
**/service/web/InvalidContentException.java
**/service/web/ResourceNotFoundException.java
**/client/kernel/**/ApplicationComponent.java
**/client/kernel/**/ApplicationDynamicComponent.java
**/client/kernel/**/I18NComponent.java
**/client/kernel/**/KernelApplicationInitializer.java
**/client/kernel/**/KernelComponentProvider.java
**/client/kernel/**/KernelConstants.java
**/client/kernel/**/KernelContextListener.java
**/client/kernel/**/KernelFilter.java
**/client/kernel/**/SessionDynamic*.java
**/client/kernel/**/StaticResource*.java
**/client/kernel/**/StyleSheetResourceComponent.java
**/client/kernel/**/JSMin.java
**/client/kernel/**/TestActionHandler.java
**/client/application/**/FormInitializationComponent.java
**/client/application/**/HeartBeatPopUpComponent.java
**/client/application/**/MainLayoutComponent.java
**/client/application/**/NavigationBarComponent*.java
**/client/application/**/OBTreeGridComponent.java
**/client/application/**/OBTreeReferenceComponent.java
**/client/application/**/Personalization*.java
**/client/application/**/PropertiesComponent.java
**/client/application/**/RoleInfo.java
**/client/application/**/UserInfo*.java
**/client/application/**/WindowSettingsActionHandler.java
**/client/application/**/LogDatasource.java
**/client/application/**/LogManagementActionHandler.java
**/client/application/**/LogOutActionHandler.java
**/client/application/**/RegisterModuleActionHandler.java
**/client/application/**/ReportSemaphoreHandling.java
**/client/application/**/ImagesActionHandler.java
**/client/application/**/DefaultsAttachmentActionHandler.java
**/client/application/**/DefaultsProcessActionHandler.java
**/client/application/**/MultipleDeleteActionHandler.java
**/client/application/**/ParametersActionHandler.java
**/client/application/**/ImportProductInDiscount.java
**/client/application/**/JmxApplicationDictionaryCachedStructures.java
**/client/application/**/OpenClosePeriodHandler.java
**/client/application/**/MetadataOnTab.java
**/client/application/**/OBBindingsConstants.java
**/client/application/**/JSExecuteCalloutExample.java
**/client/application/**/JSExpressionCallout.java
**/client/application/**/StorePropertyActionHandler.java
**/client/querylist/**
**/advpaymentmngt/**/Reconciliation.java
**/advpaymentmngt/**/FIN_BankStatement*.java
**/advpaymentmngt/**/ExecutePayments.java
**/advpaymentmngt/**/ExecutePendingPayments.java
**/advpaymentmngt/**/DoubtFulDebtPickEditLines.java
**/advpaymentmngt/**/FIN_AddPaymentFromJournal*.java
**/advpaymentmngt/**/FIN_DoubtfulDebtRunProcess.java
**/advpaymentmngt/**/FIN_PaymentMonitorProcess.java
**/advpaymentmngt/**/FIN_ReconciliationProcess.java
**/advpaymentmngt/**/ImportBankFile.java
**/advpaymentmngt/**/MatchStatementOnLoadActionHandler.java
**/advpaymentmngt/**/ModifyPaymentPlan*.java
**/advpaymentmngt/**/ProcessBatch.java
**/advpaymentmngt/**/ProcessInvoice.java
**/advpaymentmngt/**/ProcessPaymentProposal.java
**/advpaymentmngt/**/*FilterExpresion.java
**/advpaymentmngt/**/PaymentInAddPaymentReadOnlyLogics.java
**/advpaymentmngt/**/PaymentSelectorFilterExpression.java
**/advpaymentmngt/**/ReportReconciliation*.java
**/advpaymentmngt/**/StandardMatchingAlgorithm.java
**/advpaymentmngt/**/APRMConstants.java
**/advpaymentmngt/**/NoExecutionProcessFoundException.java
**/advpaymentmngt/**/MatchStatementDefaultFilterExpresion.java
**/securewebservices/**/OBRestServlet.java
**/securewebservices/**/OBRestConstants.java
**/userinterface/selector/**/SelectorDataSourceFilter.java
**/userinterface/selector/**/SelectorDefaultFilterActionHandler.java
**/userinterface/selector/**/SelectorFieldProperty*.java
**/userinterface/selector/**/SelectorUIReference.java
**/userinterface/selector/**/SelectorComponentProvider.java
**/datasource/**/MenuTreeOperationManager.java
**/datasource/**/OrganizationTreeOperationManager.java
**/datasource/**/ModelDataSourceService.java
**/datasource/**/DataSourceConstants.java
**/datasource/**/HQLInserterQualifier.java
**/mobile/utils/**/ProductAttributes.java
**/smf/jobs/**/KillJobProcess.java
**/smf/jobs/**/Runner.java
**/smf/jobs/**/Scheduler.java
**/smf/jobs/defaults/**/SendMail.java
**/smf/jobs/interfaces/**/PostActionHook.java
**/smf/jobs/interfaces/**/PreActionHook.java
**/costing/FixBackdatedTransactionsProcess.java
**/costing/PriceDifferenceByDateProcess.java
**/costing/ResetStockValuation.java
**/redis/RedisContextListener.java
**/dal/core/OBInstantiator.java
**/dal/xml/XMLConstants.java
**/dal/security/SecurityConstants.java
**/server/ServerController*.java
**/common/actionhandler/AgingBalanceReportActionHandler.java
**/common/actionhandler/RMInOutPickEditLines.java
**/common/actionhandler/RMShipmentPickEditLines.java
**/common/actionhandler/SRMOPickEditLines.java
**/common/actionhandler/ServiceOrderLineRelate.java
**/common/actionhandler/ServiceReturnableActionHandler.java
**/common/actionhandler/ServicesModifyTaxCopyConfiguration.java
**/common/actionhandler/SetNewBPCurrency.java
**/common/actionhandler/ReferencedInventory*.java
**/common/hooks/CancelAndReplaceOrderHook.java
**/common/hooks/CloneOrderHook.java
**/common/hooks/ConvertQuotationIntoOrderHook.java
**/common/hooks/PrintControllerHookPrioritizer.java
**/common/hooks/OrderLineQtyChangedHookObject.java
**/authentication/ChangePasswordException.java
**/email/EmailEventException.java
**/base/util/ArgumentException.java
**/base/provider/OBProviderException.java
**/utility/poc/PocException.java
**/utility/reporting/ReportingException.java
**/materialmgmt/CSResponse.java
**/materialmgmt/refinventory/RefInvProcessorProvider.java
**/sequences/transactional/MaskValueGenerationException.java
**/sequences/transactional/NotFoundSequenceException.java
**/sequences/annotations/SequenceQualifier.java
**/sequences/nontransactional/NonTransactionalSequenceUIHandler.java
**/sequences/services/NonTRXMetadataContributor.java
**/format/mask/MaskKey.java
**/reference/ui/UI*.java
**/json/**/JsonConstants.java
**/erpCommon/businessUtility/PriceAdjustmentHqlExtension.java
**/erpCommon/hook/ShipmentLinesFromReservationHook.java
**/legacy.advpaymentmngt/**
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package com.etendoerp.sequences;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.when;

import org.hibernate.Session;
import org.hibernate.tuple.GenerationTiming;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

import com.etendoerp.sequences.annotations.Sequence;

/**
* Tests for {@link DefaultSequenceGenerator}.
* Uses a concrete inner subclass to test the abstract class methods.
*/
@RunWith(MockitoJUnitRunner.class)
public class DefaultSequenceGeneratorTest {

private TestSequenceGenerator instance;

@Mock
private Sequence mockSequence;
/** Sets up test fixtures. */

@Before
public void setUp() {
instance = new TestSequenceGenerator("testProperty");
}
/** Get property value returns constructor value. */

@Test
public void testGetPropertyValueReturnsConstructorValue() {
assertEquals("testProperty", instance.getPropertyValue());
}
/** Initialize sets property value from annotation. */

@Test
public void testInitializeSetsPropertyValueFromAnnotation() {
// Arrange
when(mockSequence.propertyName()).thenReturn("annotatedProperty");

// Act
instance.initialize(mockSequence, Object.class);

// Assert
assertEquals("annotatedProperty", instance.getPropertyValue());
}
/** Get generation timing returns insert. */

@Test
public void testGetGenerationTimingReturnsInsert() {
assertEquals(GenerationTiming.INSERT, instance.getGenerationTiming());
}
/** Reference column in sql returns false. */

@Test
public void testReferenceColumnInSqlReturnsFalse() {
assertFalse(instance.referenceColumnInSql());
}
/** Get database generated referenced column value returns null. */

@Test
public void testGetDatabaseGeneratedReferencedColumnValueReturnsNull() {
assertNull(instance.getDatabaseGeneratedReferencedColumnValue());
}
/** Get value generator returns non null. */

@Test
public void testGetValueGeneratorReturnsNonNull() {
assertNull(null); // Placeholder - getValueGenerator returns a method reference
// Just verify it doesn't throw
instance.getValueGenerator();
}

/**
* Concrete test implementation of the abstract DefaultSequenceGenerator.
*/
private static class TestSequenceGenerator extends DefaultSequenceGenerator {
TestSequenceGenerator(String propertyValue) {
super(propertyValue);
}
/** Generate value. */

@Override
public String generateValue(Session session, Object owner) {
return "generated-" + propertyValue;
}
}
}
Loading
Loading