← back to Dw Five Field Step0
Add Phase 2 verification script for live sample variants
6f4bf56eacefd2d84b0555e282ef71782c4cd2e0 · 2026-06-21 19:55:28 -0700 · Steve Abrams
Files touched
A scripts/verify-samples-live.js
Diff
commit 6f4bf56eacefd2d84b0555e282ef71782c4cd2e0
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Sun Jun 21 19:55:28 2026 -0700
Add Phase 2 verification script for live sample variants
---
scripts/verify-samples-live.js | 130 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 130 insertions(+)
diff --git a/scripts/verify-samples-live.js b/scripts/verify-samples-live.js
new file mode 100755
index 0000000..2720a44
--- /dev/null
+++ b/scripts/verify-samples-live.js
@@ -0,0 +1,130 @@
+#!/usr/bin/env node
+/**
+ * Verify Phase 2 Results: Sample variants live on Shopify storefront
+ *
+ * Spot-check 10 random SKUs from each of the 9 vendors:
+ * - Verify variant exists (status 200)
+ * - Verify price = $4.25
+ * - Verify title includes "Sample"
+ * - Verify no "Sample-Sample" suffix issues
+ */
+const fs = require('fs');
+const path = require('path');
+const { Pool } = require('pg');
+
+const env = fs.readFileSync(path.join(process.env.HOME, '/Projects/secrets-manager/.env'), 'utf8');
+const TOKEN = (env.match(/SHOPIFY_ADMIN_TOKEN=(\S+)/) || [])[1];
+const DOMAIN = 'designer-laboratory-sandbox.myshopify.com';
+const VER = '2024-10';
+
+delete process.env.PGPASSWORD;
+delete process.env.DATABASE_URL;
+const pool = new Pool({ host: '/tmp', database: 'dw_unified' });
+
+const VENDORS = [
+ 'Clarke And Clarke',
+ 'Gaston Y Daniela',
+ 'Lee Jofa',
+ 'Brunschwig & Fils',
+ 'GP & J Baker',
+ 'Threads',
+ 'Mulberry',
+ 'Kravet',
+ 'Phillipe Romano'
+];
+
+async function getRandomSKUsForVendor(vendor, limit = 10) {
+ const res = await pool.query(
+ `SELECT DISTINCT dw_sku, shopify_id
+ FROM active_five_field_gaps
+ WHERE vendor = $1 AND fix_type = 'add-sample' AND priceable = true
+ ORDER BY RANDOM()
+ LIMIT $2`,
+ [vendor, limit]
+ );
+ return res.rows;
+}
+
+async function verifySampleVariant(productId, dwSku) {
+ const pid = productId.match(/\d+$/)[0];
+
+ const result = await fetch(
+ `https://${DOMAIN}/admin/api/${VER}/products/${pid}.json`,
+ {
+ headers: {
+ 'X-Shopify-Access-Token': TOKEN
+ }
+ }
+ ).then(r => r.json());
+
+ if (!result.product) {
+ return { status: 'ERROR', reason: 'Product not found' };
+ }
+
+ const sampleVariant = result.product.variants.find(v =>
+ v.sku && v.sku.includes(`${dwSku}-Sample`)
+ );
+
+ if (!sampleVariant) {
+ return { status: 'MISSING', reason: 'Sample variant not found' };
+ }
+
+ const checks = {
+ price: sampleVariant.price === '4.25' ? 'PASS' : `FAIL (${sampleVariant.price})`,
+ title: sampleVariant.title && sampleVariant.title.includes('Sample') ? 'PASS' : `FAIL (${sampleVariant.title})`,
+ skuFormat: !sampleVariant.sku.includes('Sample-Sample') ? 'PASS' : `FAIL (${sampleVariant.sku})`,
+ inventory: sampleVariant.inventory_quantity === 0 ? 'PASS' : `WARN (${sampleVariant.inventory_quantity})`
+ };
+
+ return { status: 'FOUND', checks, sku: sampleVariant.sku };
+}
+
+(async () => {
+ console.log('[VERIFY] Phase 2 Sample Variants Live\n');
+
+ let totalSpots = 0, found = 0, missing = 0, errors = 0;
+
+ for (const vendor of VENDORS) {
+ console.log(`[${vendor}]`);
+ const skus = await getRandomSKUsForVendor(vendor, 10);
+
+ if (skus.length === 0) {
+ console.log(` No SKUs found\n`);
+ continue;
+ }
+
+ for (const sku of skus) {
+ const result = await verifySampleVariant(sku.shopify_id, sku.dw_sku);
+ totalSpots++;
+
+ if (result.status === 'FOUND') {
+ found++;
+ console.log(` ✓ ${sku.dw_sku} (SKU: ${result.sku}) - ${result.checks.price}, ${result.checks.title}`);
+ } else if (result.status === 'MISSING') {
+ missing++;
+ console.log(` ✗ ${sku.dw_sku} - MISSING`);
+ } else {
+ errors++;
+ console.log(` ⚠ ${sku.dw_sku} - ERROR: ${result.reason}`);
+ }
+ }
+ console.log('');
+ }
+
+ console.log(`[RESULTS]`);
+ console.log(` Spots checked: ${totalSpots}`);
+ console.log(` Found: ${found}/${totalSpots} (${((found/totalSpots)*100).toFixed(1)}%)`);
+ console.log(` Missing: ${missing}/${totalSpots}`);
+ console.log(` Errors: ${errors}/${totalSpots}`);
+ console.log('');
+
+ if (found === totalSpots) {
+ console.log('✓ ALL CHECKS PASSED');
+ } else if (found >= totalSpots * 0.95) {
+ console.log('⚠ MOSTLY PASSED (>95%)');
+ } else {
+ console.log('✗ CHECKS FAILED (< 95%)');
+ }
+
+ process.exit(found >= totalSpots * 0.95 ? 0 : 1);
+})().finally(() => pool.end());
← ca94eb0 Phase 2: Fix REST API variant creation with option1='Sample'
·
back to Dw Five Field Step0
·
Document Phase 2 execution status and progress 750a80f →