Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: Publish to GitHub Packages

on:
push:
branches:
- develop

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v2

- name: Set up JDK 17
uses: actions/setup-java@v2
with:
distribution: 'temurin'
java-version: '17'

- name: Cache Maven dependencies
uses: actions/cache@v2
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven

- name: Build and Publish to GitHub Packages
run: mvn clean install deploy
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
39 changes: 39 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/

### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr

### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/

### VS Code ###
.vscode/

### Mac OS ###
.DS_Store
/.idea
59 changes: 59 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.tappayments.automation</groupId>
<artifactId>qa-common-utils</artifactId>
<version>1.0.1</version>
<packaging>jar</packaging>

<name>qa-common-utils</name>
<url>http://maven.apache.org</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>5.5.0</version>
</dependency>

<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.8.0</version>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.2</version>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.34</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>com.aventstack</groupId>
<artifactId>extentreports</artifactId>
<version>5.1.2</version>
</dependency>

</dependencies>
<distributionManagement>
<repository>
<id>github</id>
<url>https://maven.pkg.github.com/Tap-Payments/QA-Common-Utils</url>
</repository>
</distributionManagement>

</project>
9 changes: 9 additions & 0 deletions src/main/java/com/tappayments/automation/App.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.tappayments.automation;

public class App
{
public static void main( String[] args )
{
System.out.println( "QA Common util project." );
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package com.tappayments.automation.config;

import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.markuputils.CodeLanguage;
import com.aventstack.extentreports.markuputils.ExtentColor;
import com.aventstack.extentreports.markuputils.MarkupHelper;
import com.aventstack.extentreports.reporter.ExtentSparkReporter;
import com.aventstack.extentreports.reporter.configuration.Theme;
import com.tappayments.automation.utils.CommonConstants;
import io.restassured.http.Header;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;

public class ExtentReportManager {

public static ExtentReports extentReports;

public static ExtentReports createInstance(String fileName, String reportName, String documentTitle){

ExtentSparkReporter extentSparkReporter = new ExtentSparkReporter(fileName);
extentSparkReporter.config().setReportName(reportName);
extentSparkReporter.config().setDocumentTitle(documentTitle);
extentSparkReporter.config().setTheme(Theme.STANDARD);
extentSparkReporter.config().setEncoding(CommonConstants.UTF_8);

extentReports = new ExtentReports();
extentReports.attachReporter(extentSparkReporter);

return extentReports;
}

public static String getExtentReportNameWithTimeStamp(){

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyy_MM_dd_HH_mm_ss");
LocalDateTime localDateTime = LocalDateTime.now();
String formattedTime = dateTimeFormatter.format(localDateTime);
return "QA_Automation_Extent_Report_" + formattedTime + ".html";
}

public static void logPassDetails(String log){

ExtentReportSetup.extentTest.get().pass(MarkupHelper.createLabel(log, ExtentColor.GREEN));
}

public static void logFailureDetails(String log){

ExtentReportSetup.extentTest.get().fail(MarkupHelper.createLabel(log, ExtentColor.RED));
}

public static void logExceptionDetails(String log){

ExtentReportSetup.extentTest.get().fail(log);
}

public static void logInfoDetails(String log){

ExtentReportSetup.extentTest.get().info(MarkupHelper.createLabel(log, ExtentColor.GREY));
}

public static void logJson(String json){

ExtentReportSetup.extentTest.get().info(MarkupHelper.createCodeBlock(json, CodeLanguage.JSON));
}

public static void logHeaders(List<Header> headerList){

String[][] headers = headerList.stream()
.map(header -> new String[]{
header.getName(), header.getValue()
})
.toArray(String[][]::new);

ExtentReportSetup.extentTest.get().info(MarkupHelper.createTable(headers));
}

public static void logWarningDetails(String log){

ExtentReportSetup.extentTest.get().warning(MarkupHelper.createLabel(log, ExtentColor.YELLOW));
}
}
100 changes: 100 additions & 0 deletions src/main/java/com/tappayments/automation/config/ExtentReportSetup.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package com.tappayments.automation.config;

import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class ExtentReportSetup implements ITestListener {

private static ExtentReports extentReports;
public static ThreadLocal<ExtentTest> extentTest = new ThreadLocal<>();
private static Map<String, ExtentTest> categoryNodes = new HashMap<>();
private static Map<String, ExtentTest> subCategoryNodes = new HashMap<>();

public void onStart(ITestContext context){

// Generate the extent report name with timestamp
String fileName = ExtentReportManager.getExtentReportNameWithTimeStamp();

// Get platform-specific file separator ("/" for Mac/Linux, "\\" for Windows)
String separator = System.getProperty("file.separator");

// Construct the full path to the report directory
String fullReportPath = System.getProperty("user.dir")
+ separator + "extent.reports"
+ separator + fileName;
extentReports = ExtentReportManager.createInstance(fullReportPath, "QA Automation API Report", "QA Automation API Report");
}

public void onFinish(ITestContext context){

if(extentReports != null)
extentReports.flush();
}

public void onTestStart(ITestResult result) {

String[] groups = result.getMethod().getGroups();

if (groups.length > 0) {

String mainCategory = "";
String subCategory = "";
String sectionTag = "";
String author = "";

for (String group : groups) {
if (group.startsWith("MC:")) {
mainCategory = group.substring(3); // Remove "MC:" prefix
} else if (group.startsWith("SC:")) {
subCategory = group.substring(3); // Remove "SC:" prefix
} else if (group.startsWith("SECTION:")) {
sectionTag = group.substring(8); // Remove "TAG:" prefix
} else if (group.startsWith("AUTHOR:")) {
author = group.substring(7); // Remove "AUTHOR:" prefix
}
}

// Level 3: Specific Test Case Node
String testCaseName = result.getMethod().getDescription();

// Create or retrieve the main category node
ExtentTest mainCategoryNode = categoryNodes.computeIfAbsent(mainCategory, k -> extentReports.createTest(k));

// Create or retrieve the subcategory node under the main category
String finalSubCategory = subCategory;
ExtentTest subCategoryNode = subCategoryNodes.computeIfAbsent(mainCategory + subCategory, k -> mainCategoryNode.createNode(finalSubCategory));

// Create a node for the specific test case
ExtentTest testNode = subCategoryNode.createNode(testCaseName);
subCategoryNode.assignCategory(mainCategory);
subCategoryNode.assignAuthor(author);

testNode.assignCategory(sectionTag);
extentTest.set(testNode);
}
}

public void onTestFailure(ITestResult result){

ExtentReportManager.logFailureDetails(result.getThrowable().getMessage());

String stackTrace = Arrays.toString(result.getThrowable().getStackTrace());
stackTrace = stackTrace.replaceAll(",", "<br>");

String formattedTrace = """
<details>
<summary>Click here to see detail exception logs</summary>
""" + stackTrace + """
</details>
""";

ExtentReportManager.logExceptionDetails(formattedTrace);
}
}
Loading