diff --git a/demo-app/build.gradle b/demo-app/build.gradle index 16927520..c569e864 100644 --- a/demo-app/build.gradle +++ b/demo-app/build.gradle @@ -19,6 +19,8 @@ android { localProperties.load(new FileInputStream(localPropertiesFile)) } def shopId = localProperties.getProperty('shop.id', '357382bf66ac0ce2f1722677c59511') + // Server-side shop secret (orders/by_user). Kept out of source — set shop.secret in local.properties. + def shopSecret = localProperties.getProperty('shop.secret', 'demo-shop-secret') defaultConfig { applicationId "com.personalization.demo" @@ -32,6 +34,7 @@ android { // Add shop ID to BuildConfig buildConfigField "String", "SHOP_ID", "\"${shopId}\"" + buildConfigField "String", "SHOP_SECRET", "\"${shopSecret}\"" } productFlavors { diff --git a/demo-app/local.properties.template b/demo-app/local.properties.template new file mode 100644 index 00000000..c7f0e700 --- /dev/null +++ b/demo-app/local.properties.template @@ -0,0 +1,8 @@ +# Template for demo-app credentials. Copy the relevant lines into your local.properties +# (root local.properties is read first, then demo-app/local.properties). Never commit real values. + +# Public shop identifier (sent on every request). +shop.id=YOUR_SHOP_ID + +# Server-side shop secret — required only for orders/by_user. Keep it local, never commit. +shop.secret=YOUR_SHOP_SECRET diff --git a/demo-app/src/androidTest/java/com/personalization/demo/OrdersDemoE2ETest.kt b/demo-app/src/androidTest/java/com/personalization/demo/OrdersDemoE2ETest.kt new file mode 100644 index 00000000..6934b78a --- /dev/null +++ b/demo-app/src/androidTest/java/com/personalization/demo/OrdersDemoE2ETest.kt @@ -0,0 +1,29 @@ +package com.personalization.demo + +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.action.ViewActions.click +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.ext.junit.rules.ActivityScenarioRule +import androidx.test.ext.junit.runners.AndroidJUnit4 +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class OrdersDemoE2ETest { + + @get:Rule + val activityRule = ActivityScenarioRule(MainActivity::class.java) + + @Test + fun getLastOrderProducts_tapButton_noCrash() { + onView(withId(R.id.btnGetLastOrderProducts)).perform(click()) + Thread.sleep(1500) + } + + @Test + fun getUserOrders_tapButton_noCrash() { + onView(withId(R.id.btnGetUserOrders)).perform(click()) + Thread.sleep(1500) + } +} diff --git a/demo-app/src/main/java/com/personalization/demo/MainActivity.kt b/demo-app/src/main/java/com/personalization/demo/MainActivity.kt index f210c8fe..b24991d9 100644 --- a/demo-app/src/main/java/com/personalization/demo/MainActivity.kt +++ b/demo-app/src/main/java/com/personalization/demo/MainActivity.kt @@ -38,6 +38,14 @@ class MainActivity : AppCompatActivity() { const val COLLISION_PLACEHOLDER_VALUE = "collision_demo" } + private object DemoOrdersConstants { + /** + * Server-side shop secret for `orders/by_user`. Sourced from `shop.secret` in local.properties + * (gitignored) via BuildConfig — never hardcode a real secret here. Falls back to a placeholder. + */ + val SHOP_SECRET = BuildConfig.SHOP_SECRET + } + private object DemoProductViewConstants { const val PRODUCT_ID = "demo-product-view-001" const val DEMO_PRICE = 2499.99 @@ -121,6 +129,61 @@ class MainActivity : AppCompatActivity() { findViewById