Skip to content
This repository has been archived by the owner on Mar 7, 2020. It is now read-only.

Commit

Permalink
Merge pull request #2 from WLammert/feature/adding_productcreator_tests
Browse files Browse the repository at this point in the history
Feature/adding productcreator tests
  • Loading branch information
WLammert authored Jan 26, 2020
2 parents eefcfbb + 3f29912 commit 76838c4
Show file tree
Hide file tree
Showing 6 changed files with 154 additions and 69 deletions.
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ dependencies {

testImplementation 'org.junit.jupiter:junit-jupiter:5.5.1'
testImplementation 'org.hamcrest:hamcrest-library:2.1'
testImplementation "org.mockito:mockito-junit-jupiter:3.2.4"

}

test {
Expand Down
39 changes: 10 additions & 29 deletions src/main/java/eu/dev089/components/RequestCreator.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,51 +8,32 @@
public class RequestCreator {

private static final String URL = "https://www.bienenkorb-shop.de/index.php/rest/V1/";
private final String token;

private Request.Builder requestBuilder(String contextPath) {
var bk_token = System.getenv().get("BK_TOKEN");
if (bk_token == null || bk_token.isEmpty()) {
public RequestCreator(String token) {
if (token == null || token.isEmpty()) {
throw new IllegalArgumentException("please provide a bearer token via ENV");
}
this.token = token;
}

Request.Builder requestBuilder(String contextPath) {
return new Request.Builder()
.url(URL + contextPath)
.addHeader("Authorization", String.format("Bearer %s", bk_token))
.addHeader("Authorization", String.format("Bearer %s", token))
.addHeader("Cache-Control", "no-cache")
.addHeader("Connection", "keep-alive");
}

public Request getActiveProductSkus() {
var query = "searchCriteria[filter_groups][0][filters][0][field]=status&searchCriteria[filter_groups][0][filters][0][value]=1&searchCriteria[filter_groups][0][filters][0][condition_type]=finset&fields=items[sku]";
return requestBuilder("products" + "?" + query).get().build();
}

public Request get100SkuForPage(int page) {
var query =
"searchCriteria[filter_groups][0][filters][0][field]=status&searchCriteria[filter_groups][0][filters][0][value]=1&searchCriteria[filter_groups][0][filters][0][condition_type]=finset&fields=items[sku]&searchCriteria[current_page]="
+ String.valueOf(page) + "&searchCriteria[page_size]=500";
return requestBuilder("products" + "?" + query).get().build();
}

public Request getAmazonCategoryProducts() {
var query = "searchCriteria[filterGroups][0][filters][0][field]=category_id& searchCriteria[filterGroups][0][filters][0][value]=2927&searchCriteria[filterGroups][0][filters][0][conditionType]=eq&fields=items[sku,name]";
return requestBuilder("products" + "?" + query).get().build();
}

public Request getAmazonCategoryProducts(int page) {
var query =
"searchCriteria[filterGroups][0][filters][0][field]=category_id& searchCriteria[filterGroups][0][filters][0][value]=2927&searchCriteria[filterGroups][0][filters][0][conditionType]=eq&fields=items[sku,name]&searchCriteria[current_page]="
+ page + "&searchCriteria[page_size]=200";
return requestBuilder("products" + "?" + query).get().build();
}

public Request getFirst100ForTesting() {
var request =
"products?searchCriteria[filterGroups][0][filters][0][field]=category_id& searchCriteria[filterGroups][0][filters][0][value]=2927&searchCriteria[filterGroups][0][filters][0][conditionType]=eq&fields=items[sku,name]&searchCriteria[current_page]=1&searchCriteria[page_size]=100";
return requestBuilder(request).get().build();
}

public Request updateProductRequest(Product product) {
var anotherJson = String.format("{\n"
var json = String.format("{\n"
+ " \"product\": {\n"
+ " \t\"sku\": \"%s\",\n"
+ " \"custom_attributes\": [\n"
Expand All @@ -68,7 +49,7 @@ public Request updateProductRequest(Product product) {
+ " \"saveOptions\": true\n"
+ "}", product.getSku(), product.getAmazonQuantity(), product.getAmazonDelivery());

var body = RequestBody.create(anotherJson, MediaType.parse("application/json"));
var body = RequestBody.create(json, MediaType.parse("application/json"));
return requestBuilder(String.format("products/%s/", product.getSku())).put(body).build();
}

Expand Down
9 changes: 6 additions & 3 deletions src/main/java/eu/dev089/components/Updater.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,11 @@ public class Updater extends TimerTask {
private OkHttpClient client;

public Updater() {
this.creator = new RequestCreator();
this(System.getenv().get("BK_TOKEN"));
}

Updater(String token) {
this.creator = new RequestCreator(token);
}

@Override
Expand Down Expand Up @@ -72,7 +75,7 @@ public void run() {
client.connectionPool().evictAll();
}

private void updateProducts(List<Product> updatableProducts) {
void updateProducts(List<Product> updatableProducts) {
if (!updatableProducts.isEmpty()) {
for (var product : updatableProducts) {
var request = creator.updateProductRequest(product);
Expand All @@ -92,7 +95,7 @@ private void updateProducts(List<Product> updatableProducts) {
}
}

private Optional<Product> processSku(String sku) {
Optional<Product> processSku(String sku) {
var jsonObject = readResponse(creator.getProduktDataForSku(sku));
if (jsonObject.isPresent()) {
var product = Product.builder()
Expand Down
29 changes: 21 additions & 8 deletions src/test/java/eu/dev089/JsonTemplates.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,10 @@

import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import eu.dev089.model.Product;

public class JsonTemplates {

public static JsonObject getValidProductAsJsonObject() {
return JsonParser
.parseString(
String.format(JSON, DEFAULT_SKU, DEFAULT_QUANTITY, DEFAULT_AMAZON_QUANTITY, DEFAULT_DELIVERY,
DEFAULT_LIEFERZEIT, DEFAULT_DELIVERY_WHEN_NA))
.getAsJsonObject();
}

private static final String JSON = "{\n"
+ " \"sku\": \"%s\",\n"
+ " \"name\": \"Testprodukt\",\n"
Expand Down Expand Up @@ -48,6 +41,22 @@ public static JsonObject getValidProductAsJsonObject() {
public static final String DEFAULT_LIEFERZEIT = "10";
public static final String DEFAULT_DELIVERY_WHEN_NA = "0";

public static JsonObject getValidProductAsJsonObject() {
return JsonParser
.parseString(
String.format(JSON, DEFAULT_SKU, DEFAULT_QUANTITY, DEFAULT_AMAZON_QUANTITY, DEFAULT_DELIVERY,
DEFAULT_LIEFERZEIT, DEFAULT_DELIVERY_WHEN_NA))
.getAsJsonObject();
}

public static JsonObject getWithSku(String sku) {
return JsonParser
.parseString(
String.format(JSON, sku, DEFAULT_QUANTITY, DEFAULT_AMAZON_QUANTITY, DEFAULT_DELIVERY,
DEFAULT_LIEFERZEIT, DEFAULT_DELIVERY_WHEN_NA))
.getAsJsonObject();
}

public static JsonObject getWithQuantity(String quantity) {
return JsonParser
.parseString(
Expand Down Expand Up @@ -79,4 +88,8 @@ public static JsonObject getWithDeliveryWhenNa(String deliveryWhenNa) {
DEFAULT_LIEFERZEIT, deliveryWhenNa))
.getAsJsonObject();
}

public static Product getValidProduct(String sku){
return Product.builder().setSku(sku).parseJson(getWithSku(sku)).build();
}
}
110 changes: 110 additions & 0 deletions src/test/java/eu/dev089/components/RequestCreatorTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
package eu.dev089.components;

import static eu.dev089.FeatureMatcher.createFeatureMatcher;
import static eu.dev089.JsonTemplates.getValidProduct;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.junit.jupiter.api.Assertions.assertThrows;

import java.util.stream.Stream;
import okhttp3.Request;
import org.hamcrest.Matcher;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;

class RequestCreatorTest {

private final RequestCreator creator = new RequestCreator("token");

@Test
void setsBearerToken() {
var token = "THIS_IS_MY_TOKEN";
var creator = new RequestCreator(token);
var request = creator.requestBuilder("somePath").get().build();

assertThat(request, hasToken(token));
}

private static Matcher<Request> hasToken(String token) {
return createFeatureMatcher(hasItem("Bearer " + token), "token",
r -> r.headers().values("Authorization"));
}

@ParameterizedTest
@MethodSource("emptyTokens")
void reportsNoTokenSet(String token) {
assertThrows(IllegalArgumentException.class, () -> {
new RequestCreator(token);
});
}

static Stream<String> emptyTokens() {
return Stream.of(null, "");
}

@ParameterizedTest
@MethodSource("headers")
void setsHeaders(String header) {
var builder = creator.requestBuilder("context");

assertThat(builder, hasHeaderProperty(header));
}

@Test
void createsAmazonRequest() {
var query = creator.getAmazonCategoryProducts(1).url().query();

assertThat(query, allOf(
containsString("searchCriteria[filterGroups][0][filters][0][field]=category_id"),
containsString("searchCriteria[filterGroups][0][filters][0][value]=2927"),
containsString("searchCriteria[filterGroups][0][filters][0][conditionType]=eq"),
containsString("searchCriteria[filterGroups][0][filters][0][conditionType]=eq"),
containsString("fields=items[sku,name]&searchCriteria[current_page]=1")
));
}

@Test
void createsUpdateRequest() {
var product = getValidProduct("my_product_sku");
var request = creator.updateProductRequest(product);

assertThat(request, allOf(
methodIs("PUT"),
urlContains("V1/products/" + product.getSku())
));
}

@Test
void returnsProductDataForSku() {
var sku = "MY_SKU";
var request = creator.getProduktDataForSku(sku);

assertThat(request, allOf(
methodIs("GET"),
urlContains("V1/products/" + sku),
urlContains("fields=sku,name,extension_attributes[stock_item[qty]],custom_attributes")
));
}

private static Matcher<Request> methodIs(String method) {
return createFeatureMatcher(is(method), "method", Request::method);
}

private static Matcher<Request> urlContains(String value) {
return createFeatureMatcher(containsString(value), "url",
req -> req.url().toString());
}

private static Matcher<Request.Builder> hasHeaderProperty(String header) {
return createFeatureMatcher(is(notNullValue()), "token", r -> r.build().headers().values(header));
}

static Stream<String> headers() {
return Stream.of("Authorization", "Cache-Control", "Connection");
}
}
34 changes: 5 additions & 29 deletions src/test/java/eu/dev089/components/UpdaterTest.java
Original file line number Diff line number Diff line change
@@ -1,39 +1,15 @@
package eu.dev089.components;

import java.io.IOException;
import java.time.Duration;
import java.time.Instant;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import okhttp3.OkHttpClient.Builder;
import okhttp3.Response;
import eu.dev089.model.Product;
import java.util.Optional;
import org.junit.jupiter.api.Test;

class UpdaterTest {

private Updater updater = new Updater();
private RequestCreator creator = new RequestCreator();


void run() {
updater.run();
}

void okhttp() throws IOException {
OkHttpClient client = new Builder()
.readTimeout(300, TimeUnit.SECONDS)
.build();
Instant start = Instant.now();
Response response = client.newCall(creator.getAmazonCategoryProducts(1)).execute();
System.out.println("returned responsecode " + response.code());

Instant finish = Instant.now();
long timeElapsed = Duration.between(start, finish).toMillis();
System.out.println("Call lasted " + timeElapsed + "ms");
}
private Updater updater = new Updater("MYTOKEN");

@Test
void myTest(){
System.out.println("WALDI!!!!");
void readsResponse() {
Optional<Product> mysku = updater.processSku("mysku");
}
}

0 comments on commit 76838c4

Please sign in to comment.