Skip to content
This repository has been archived by the owner on Sep 3, 2024. It is now read-only.

Commit

Permalink
Merge pull request #357 from sbtqa/custom-data-provider
Browse files Browse the repository at this point in the history
Add ability to set custom test data provider
  • Loading branch information
kosteman authored Nov 10, 2021
2 parents e7454b5 + b33bea3 commit 390ddc3
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
package ru.sbtqa.tag.pagefactory.data;

import com.mongodb.DB;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;

import java.lang.reflect.InvocationTargetException;

import com.mongodb.client.MongoDatabase;
import org.apache.commons.lang3.reflect.ConstructorUtils;
import org.slf4j.Logger;
Expand All @@ -15,14 +11,16 @@
import ru.sbtqa.tag.datajack.exceptions.DataException;
import ru.sbtqa.tag.pagefactory.properties.Configuration;

import java.lang.reflect.InvocationTargetException;

import static java.lang.String.format;

public class DataFactory {

private static final Logger LOG = LoggerFactory.getLogger(DataFactory.class);
private static final Configuration PROPERTIES = Configuration.create();
private static TestDataProvider testDataProvider;
private static final String BASE_FQDN = "ru.sbtqa.tag.datajack.providers.";
private static final String BASE_FQDN = PROPERTIES.getDataProviderFqdn() + ".";

private enum PROVIDERS {
JSON_DATA_PROVIDER("json.JsonDataProvider"),
Expand Down Expand Up @@ -85,7 +83,15 @@ public static TestDataProvider getDataProvider() throws DataException {
LOG.debug("Data provider isn't set. Leaving all placeholders as is.");
break;
default:
throw new DataException(format("Data provider %s isn't supported", dataType));
LOG.debug(format("Using custom data provider %s", dataType));
if (!dataExtension.isEmpty() && !PROPERTIES.getDataDb().isEmpty()) {
throw new DataException("data.extension and data.db could not be set both");
}
testDataProvider = initProvider(dataType,
dataFolder,
initialCollection,
dataExtension+PROPERTIES.getDataDb()
);
}
}
if (!PROPERTIES.getGeneratorsClass().isEmpty()) {
Expand All @@ -106,12 +112,16 @@ public static void updateCollection(TestDataProvider newObject) {
}

private static TestDataProvider initProvider(PROVIDERS provider, Object... args) throws DataException {
return initProvider(provider.value, args);
}

private static TestDataProvider initProvider(String provider, Object... args) throws DataException {
try {
Class<?> providerClass = DataFactory.class.getClassLoader().loadClass(BASE_FQDN + provider.value);
Class<?> providerClass = DataFactory.class.getClassLoader().loadClass(BASE_FQDN + provider);
return (TestDataProvider) ConstructorUtils.invokeConstructor(providerClass, args);
} catch (ClassNotFoundException e) {
throw new DataException(format("Could not find data provider %s in classpath. " +
"Make sure you're added required maven dependency", provider.getName()));
"Make sure you're added required maven dependency", provider));
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | InstantiationException ex) {
throw new DataException(format("Could not initialize data provider %s", provider), ex);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,9 @@ public interface Configuration extends Config {
@DefaultValue("")
String getFragmentsPath();

@Key("data.provider.fqdn")
@DefaultValue("ru.sbtqa.tag.datajack.providers")
String getDataProviderFqdn();

@Key("data.initial.collection")
@DefaultValue("")
Expand Down
25 changes: 25 additions & 0 deletions page-factory-doc/src/main/asciidoc/cucumber_data.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
* properties
* excel
* mongo
* custom test data provider

====== Тип и расположение файлов тестовых данных

Expand Down Expand Up @@ -70,6 +71,30 @@ data.db = bd
data.arrayDelimiter = !
----

====== Подключение своего провайдера тестовых данных
Есть возможность зарегистрировать свой провайдер данных. Для этого необходимо, реализовать интерфейс https://github.com/sbtqa/datajack/blob/master/datajack-api/src/main/java/ru/sbtqa/tag/datajack/TestDataProvider.java[TestDataProvider].

В классе реализации должен присутствовать конструктор со следующими параметрами: `new MyDataProvider(String initialCollection, String extensionOrDb)`

Конфигурация задается следующими параметрам в `application.properties` (на примере JsonDataProvider):
----
# Полное имя java пакета
data.provider.fqdn=ru.sbtqa.tag.datajack.providers
# Имя артефакта и имя класса реализации
data.type = json.JsonDataProvider
# Указать изначальную коллекцию
data.initial.collection = Data
# Задать расширение файла, либо имя базы данных (нельзя задавать оба значения одновременно)
data.extension = json
# data.db = bd
----

Это позволит начать использовать свой провайдер данных по общим правилам фреймворка.


====== Путь к элементу коллекции
Для обозначения пути внутри коллекции используются фигурные скобки

Expand Down

0 comments on commit 390ddc3

Please sign in to comment.