package productcatalog.pages; import com.fasterxml.jackson.databind.JsonNode; import common.categories.CategoryUtils; import common.cms.CmsPage; import common.contexts.UserContext; import common.pages.*; import common.utils.PriceFormatter; import io.sphere.sdk.categories.Category; import io.sphere.sdk.categories.CategoryTree; import io.sphere.sdk.products.ProductProjection; import io.sphere.sdk.products.ProductVariant; import io.sphere.sdk.shippingmethods.ShippingRate; import org.javamoney.moneta.Money; import org.junit.Test; import play.mvc.Call; import productcatalog.models.ShopShippingRate; import javax.money.CurrencyUnit; import javax.money.Monetary; import java.io.IOException; import java.time.ZoneId; import java.util.List; import java.util.Locale; import java.util.Optional; import static com.neovisionaries.i18n.CountryCode.DE; import static common.JsonUtils.readJsonNodeFromResource; import static common.products.ProductUtils.getProductById; import static common.products.ProductUtils.getQueryResult; import static io.sphere.sdk.json.SphereJsonUtils.readObjectFromResource; import static io.sphere.sdk.json.SphereJsonUtils.toJsonNode; import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static java.util.Locale.GERMAN; import static java.util.stream.Collectors.toList; import static org.assertj.core.api.Assertions.assertThat; public class ProductDetailPageContentTest { private static final ZoneId ZONE_ID = ZoneId.of("Europe/Berlin"); private static final CurrencyUnit EUR = Monetary.getCurrency("EUR"); private static final List<Locale> LOCALES = singletonList(GERMAN); private static final PriceFormatter PRICE_FORMATTER = PriceFormatter.of(GERMAN); private static final CategoryTree CATEGORIES = CategoryTree.of(CategoryUtils.getQueryResult("categoryQueryResult.json").getResults()); private static final List<ProductProjection> PRODUCTS = getQueryResult("productProjectionQueryResult.json").getResults(); private static final UserContext USER_CONTEXT = UserContext.of(DE, LOCALES, ZONE_ID, EUR, null, null); private static final ReverseRouter REVERSE_ROUTER = dummyReverseRouter(); @Test public void staticJson() throws IOException { final CmsPage cms = (messageKey, args) -> Optional.of(messageKey); final PdpStaticData pdpStaticData = new PdpStaticData(cms, BagItemDataFactory.of().create(100), RatingDataFactory.of(cms).create()); final JsonNode expected = readJsonNodeFromResource("pdpStaticData.json"); final JsonNode result = toJsonNode(pdpStaticData); assertThat(result).isEqualTo(expected); } @Test public void breadcrumbJson() throws IOException { final Category woman = CATEGORIES.findById("33339d11-0e7b-406b-899b-60f4c34c2948").get(); final Category bags = CATEGORIES.findById("32952779-d916-4f2b-b1d5-9efd7f7b9f58").get(); final Category handBags = CATEGORIES.findById("9a584ee8-a45a-44e8-b9ec-e11439084687").get(); final List<Category> breadcrumbCategories = asList(woman, bags, handBags); final BreadcrumbDataFactory breadCrumbDataFactory = BreadcrumbDataFactory.of(dummyReverseRouter(), GERMAN); final List<SelectableLinkData> breadcrumbData = breadCrumbDataFactory.create(breadcrumbCategories); final JsonNode expected = readJsonNodeFromResource("breadcrumbData.json").get("breadcrumbs"); final JsonNode result = toJsonNode(breadcrumbData); assertThat(result).isEqualTo(expected); } @Test public void productJson() throws IOException { final ProductProjection product = readObjectFromResource("product.json", ProductProjection.typeReference()); final ProductVariant variant = product.getMasterVariant(); final ProductData productData = ProductDataFactory.of(USER_CONTEXT, REVERSE_ROUTER).create(product, variant); final JsonNode expected = readJsonNodeFromResource("productData.json"); final JsonNode result = toJsonNode(productData); assertThat(result).isEqualTo(expected); } @Test public void deliveryJson() throws IOException { final ShopShippingRate dhl = new ShopShippingRate("DHL", ShippingRate.of(Money.of(10, "EUR"))); final ShopShippingRate dhlFreeAbove = new ShopShippingRate("DHL", ShippingRate.of(Money.of(10, "EUR"), Money.of(50, "EUR"))); final ShippingRateDataFactory shippingRateDataFactory = ShippingRateDataFactory.of(PRICE_FORMATTER); final List<ShippingRateData> deliveryData = asList(dhl, dhlFreeAbove).stream().map(shippingRateDataFactory::create).collect(toList()); final JsonNode expected = readJsonNodeFromResource("deliveryData.json").get("deliveries"); final JsonNode result = toJsonNode(deliveryData); assertThat(result).isEqualTo(expected); } @Test public void suggestionJson() throws IOException { final ProductProjection selma = getProductById(PRODUCTS, "4f643a44-5bed-415e-ae60-64c46bfb26f5"); final ProductProjection dkny = getProductById(PRODUCTS, "a3f4588e-fcfe-41de-bd09-a071d76d697d"); final ProductProjection miabag = getProductById(PRODUCTS, "dc9a4460-491c-48b4-bcf6-1d802bb7e164"); final ProductProjection altea = getProductById(PRODUCTS, "4f643a44-5bed-415e-ae60-64c46bfb26f5"); final ProductDataFactory productDataFactory = ProductDataFactory.of(USER_CONTEXT, REVERSE_ROUTER); final List<ProductData> suggestionData = asList(selma, dkny, miabag, altea).stream() .map(product -> productDataFactory.create(product, product.getMasterVariant())).collect(toList()); final JsonNode expected = readJsonNodeFromResource("suggestionData.json").get("suggestions"); final JsonNode result = toJsonNode(suggestionData); assertThat(result).isEqualTo(expected); } private static ReverseRouter dummyReverseRouter() { return new DefaultTestReverseRouter() { @Override public Call category(final String locale, final String slug, final int page) { return new Call() { @Override public String url() { return locale + "/" + slug; } @Override public String method() { return null; } @Override public String fragment() { return null; } }; } }; } }