Skip to content

Commit

Permalink
Merge pull request #18 from zebrunner/develop
Browse files Browse the repository at this point in the history
1.1.3
  • Loading branch information
vdelendik authored Jun 29, 2023
2 parents 6b9da0c + 559db79 commit dbfef96
Show file tree
Hide file tree
Showing 9 changed files with 760 additions and 20 deletions.
15 changes: 6 additions & 9 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,10 @@
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>11</java.version>
<carina-utils.version>1.0.4</carina-utils.version>
<carina-utils.version>1.1.5</carina-utils.version>
<opencsv.version>1.7</opencsv.version>
<apache-poi.version>4.1.2</apache-poi.version>
<slf4j.version>1.7.30</slf4j.version>
<commons-lang3.version>3.5</commons-lang3.version>
<testng.version>7.7.1</testng.version>
<maven-source-plugin.version>3.0.1</maven-source-plugin.version>
<maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version>
Expand Down Expand Up @@ -90,10 +90,6 @@
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>io.rest-assured</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>

Expand All @@ -110,11 +106,12 @@
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${apache-poi.version}</version>
</dependency>


<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
package com.zebrunner.carina.dataprovider;

/*******************************************************************************
* Copyright 2020-2022 Zebrunner Inc (https://www.zebrunner.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/

import com.zebrunner.carina.utils.R;
import com.zebrunner.carina.utils.StringGenerator;
import com.zebrunner.carina.utils.commons.SpecialKeywords;
import com.zebrunner.carina.utils.config.Configuration;
import com.zebrunner.carina.utils.config.StandardConfigurationOption;
import com.zebrunner.carina.utils.exception.InvalidArgsException;
import com.zebrunner.carina.utils.parser.xls.XLSParser;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.ITestNGMethod;

import java.lang.invoke.MethodHandles;
import java.util.Arrays;
import java.util.Map;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DataProviderParameterGenerator {

private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private static final Pattern GENERATE_UUID_PATTERN = Pattern.compile(SpecialKeywords.GENERATE_UUID);
private static final Pattern GENERATE_PATTERN = Pattern.compile(SpecialKeywords.GENERATE);
private static final Pattern GENERATEAN_PATTERN = Pattern.compile(SpecialKeywords.GENERATEAN);
private static final Pattern GENERATEN_PATTERN = Pattern.compile(SpecialKeywords.GENERATEN);
private static final Pattern TESTDATA_PATTERN = Pattern.compile(SpecialKeywords.TESTDATA);
private static final Pattern ENV_PATTERN = Pattern.compile(SpecialKeywords.ENV);
private static final Pattern EXCEL_PATTERN = Pattern.compile(SpecialKeywords.EXCEL);
private static String uuid;

private DataProviderParameterGenerator() {
// do nothing
}

public static Object process(String param) {
try {
if (param == null || param.equalsIgnoreCase("nil")) {
return null;
}

Matcher matcher = GENERATE_UUID_PATTERN.matcher(param);
if (matcher.find()) {
return StringUtils.replace(param, matcher.group(), uuid);
}
matcher = GENERATE_PATTERN.matcher(param);
if (matcher.find()) {
int start = param.indexOf(':') + 1;
int end = param.indexOf('}');
int size = Integer.parseInt(param.substring(start, end));
return StringUtils.replace(param, matcher.group(), StringGenerator.generateWord(size));
}

matcher = GENERATEAN_PATTERN.matcher(param);
if (matcher.find()) {
int start = param.indexOf(':') + 1;
int end = param.indexOf('}');
int size = Integer.parseInt(param.substring(start, end));
return StringUtils.replace(param, matcher.group(), StringGenerator.generateWordAN(size));
}

matcher = GENERATEN_PATTERN.matcher(param);
if (matcher.find()) {
int start = param.indexOf(':') + 1;
int end = param.indexOf('}');
int size = Integer.parseInt(param.substring(start, end));
return StringUtils.replace(param, matcher.group(), StringGenerator.generateNumeric(size));
}

matcher = ENV_PATTERN.matcher(param);
if (matcher.find()) {
int start = param.indexOf(':') + 1;
int end = param.indexOf('}');
String key = param.substring(start, end);
return StringUtils.replace(param, matcher.group(), Configuration.get(key, StandardConfigurationOption.ENVIRONMENT).orElse(""));
}

matcher = TESTDATA_PATTERN.matcher(param);
if (matcher.find()) {
int start = param.indexOf(':') + 1;
int end = param.indexOf('}');
String key = param.substring(start, end);
return StringUtils.replace(param, matcher.group(), R.TESTDATA.get(key));
}

matcher = EXCEL_PATTERN.matcher(param);
if (matcher.find()) {
int start = param.indexOf(':') + 1;
int end = param.indexOf('}');
String key = param.substring(start, end);
return StringUtils.replace(param, matcher.group(), getValueFromXLS(key));
}
} catch (Exception e) {
LOGGER.error(e.getMessage());
}
return param;
}

public static void processMap(Map<String, String> paramsMap) {
paramsMap.entrySet()
.stream()
.filter(Objects::nonNull).forEach(entry -> {
String value = entry.getValue();
if (value == null)
return;
Object param = process(value);
if (param == null)
return;
String newValue = param.toString();
if (!value.equals(newValue)) {
entry.setValue(newValue);
}
});
}

private static String getValueFromXLS(String xlsSheetKey) {
if (StringUtils.isEmpty(xlsSheetKey)) {
throw new InvalidArgsException("Invalid excel key, should be 'xls_file#sheet#key'.");
}

String xls = xlsSheetKey.split("#")[0];
String sheet = xlsSheetKey.split("#")[1];
String key = xlsSheetKey.split("#")[2];

return XLSParser.parseValue(xls, sheet, key);
}

public static String getUUID() {
return uuid;
}

public static void setUUID(String uUID) {
uuid = uUID;
}

/**
* Generate hash by class name, method name and arg values.
*
* @param args Object[] test method arguments
* @param method ITestNGMethod
* @return String hash
*/
public static String hash(Object[] args, ITestNGMethod method) {
String toHash = "";
toHash += Arrays.hashCode(args);
toHash += method.getMethodName();
toHash += (method.getRealClass());
return String.valueOf(toHash.hashCode());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,12 @@
*******************************************************************************/
package com.zebrunner.carina.dataprovider.core.impl;

import com.zebrunner.carina.dataprovider.DataProviderParameterGenerator;
import com.zebrunner.carina.dataprovider.parser.DSBean;
import com.zebrunner.carina.utils.parser.xls.AbstractTable;
import org.testng.ITestContext;
import org.testng.ITestNGMethod;

import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.Collections;
Expand All @@ -24,13 +30,6 @@
import java.util.Map;
import java.util.Set;

import org.testng.ITestContext;
import org.testng.ITestNGMethod;

import com.zebrunner.carina.dataprovider.parser.DSBean;
import com.zebrunner.carina.utils.ParameterGenerator;
import com.zebrunner.carina.utils.parser.xls.AbstractTable;

/**
* Created by Patotsky on 19.12.2014.
*/
Expand Down Expand Up @@ -162,7 +161,7 @@ private void configureTestNamingVars(Object[][] dataProvider, DSBean dsBean, Abs
for (int rowIndex = 0; rowIndex < dataProvider.length; rowIndex++) {
Map<String, String> row = table.getDataRows().get(rowIndex);

String rowHash = ParameterGenerator.hash(dataProvider[rowIndex], testNGMethod);
String rowHash = DataProviderParameterGenerator.hash(dataProvider[rowIndex], testNGMethod);
addValueToMap(tuidMap, rowHash, getValueFromRow(row, dsBean.getUidArgs()));
addValueToMap(testColumnNamesMap, rowHash, getValueFromRow(row, List.of(dsBean.getTestMethodColumn())));
}
Expand All @@ -174,7 +173,7 @@ private void configureTestNamingVarsForGroupedProvider(Object[][] dataProvider,
ITestNGMethod testNGMethod) {
for (int rowIndex = 0; rowIndex < dataProvider.length; rowIndex++) {

String rowHash = ParameterGenerator.hash(dataProvider[rowIndex], testNGMethod);
String rowHash = DataProviderParameterGenerator.hash(dataProvider[rowIndex], testNGMethod);

//get all unique tuid values from certain group
String testUid = getValueFromGroupList(rowIndex, groupedList, dsBean.getUidArgs());
Expand Down Expand Up @@ -222,7 +221,7 @@ private String getValueFromRow(Map<String, String> row, List<String> columnNames
}

protected static Object getStaticParam(String name, DSBean dsBean) {
Object param = ParameterGenerator.process(dsBean.getTestParams().get(name));
Object param = DataProviderParameterGenerator.process(dsBean.getTestParams().get(name));
if (param == null) {
throw new RuntimeException("Cant find parameter " + name + " in suite");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ public Object[][] getDataProvider(Annotation annotation, ITestContext context, I
DSBean dsBean = new DSBean(parameters, context.getCurrentXmlTest().getAllParameters());

XLSTable xlsTable = XLSParser.parseSpreadSheet(dsBean.getDsFile(), dsBean.getXlsSheet(), dsBean.getExecuteColumn(), dsBean.getExecuteValue());
xlsTable.processTable();
//todo investigate how it will work without this method
// xlsTable.processTable();

String groupColumn = dsBean.getGroupColumn();
if (groupColumn.isEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package com.zebrunner.carina.utils.parser.xls;

import com.zebrunner.carina.dataprovider.DataProviderParameterGenerator;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

public abstract class AbstractTable {

protected List<String> headers;
protected List<Map<String, String>> dataRows;
protected String executeColumn;
protected String executeValue;

protected AbstractTable() {
headers = Collections.synchronizedList(new LinkedList<String>());
dataRows = Collections.synchronizedList(new LinkedList<Map<String, String>>());
}

protected AbstractTable(String executeColumn, String executeValue) {
this();
this.executeColumn = executeColumn;
this.executeValue = executeValue;
}

public List<String> getHeaders() {
return headers;
}

public List<Map<String, String>> getDataRows() {
return dataRows;
}

public String getExecuteColumn() {
return executeColumn;
}

public void setExecuteColumn(String executeColumn) {
this.executeColumn = executeColumn;
}

public String getExecuteValue() {
return executeValue;
}

public void setExecuteValue(String executeValue) {
this.executeValue = executeValue;
}

public void setHeaders(Collection<String> row) {
headers.clear();
headers.addAll(row);
}

public abstract void addDataRow(List<String> row);

public void processTable() {
for (Map<String, String> row : dataRows) {
DataProviderParameterGenerator.processMap(row);
}
}

public List<List<Map<String, String>>> getGroupedDataProviderMap(String fieldName) {
// add unique group values
Set<String> groupValues = new LinkedHashSet<>();
for (Map<String, String> item : dataRows) {
String value = item.get(fieldName);
groupValues.add(value);
}

// group maps into lists, that has the same unique group value
List<List<Map<String, String>>> groupedList = new ArrayList<>();
for (String groupBy : groupValues) {
List<Map<String, String>> groupOfRows = new ArrayList<>();
for (Map<String, String> item : dataRows) {
String value = item.get(fieldName);
if (value.equals(groupBy)) {
groupOfRows.add(item);
}
}
groupedList.add(groupOfRows);
}

return groupedList;
}
}
Loading

0 comments on commit dbfef96

Please sign in to comment.