[object Object]

← 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

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 →