adserver-dashboard 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.ci/staging.yml +191 -0
- package/.dockerignore +117 -0
- package/.env +40 -0
- package/.env.staging +38 -0
- package/.gitlab-ci.yml +16 -0
- package/DEMO_STATUS.md +579 -0
- package/Dockerfile +61 -0
- package/Influence-MW-AdServer-12-02-2026/client/index.html +17 -0
- package/Influence-MW-AdServer-12-02-2026/client/public/favicon.png +0 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/App.tsx +91 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/advanced-map-drawer.tsx +1131 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ai-recommendation-panel.tsx +379 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/app-sidebar.tsx +183 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/auto-optimize-button.tsx +184 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/availability-drawer.tsx +385 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/brand-insights-panel.tsx +87 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/create-agency-drawer.tsx +198 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/create-brand-drawer.tsx +275 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/creative-assignment.tsx +526 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/data-table-toolbar.tsx +148 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/data-table.tsx +158 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/filter-drawer.tsx +356 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/form-insights-panel.tsx +82 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/geography-selector.tsx +699 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/header-user-menu.tsx +178 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/history-drawer.tsx +313 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/inventory-availability-section.tsx +176 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/inventory-format-drawer.tsx +173 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/inventory-selector.tsx +401 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/manual-inventory-drawer.tsx +368 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/mapbox-map.tsx +368 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/market-insights-panel.tsx +202 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/media-owner-drawer.tsx +217 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/metric-card.tsx +58 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/page-header.tsx +27 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/player-status-indicator.tsx +137 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/poi-targeting-drawer.tsx +298 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/recommendation-score-badge.tsx +102 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/recommended-inventories-panel.tsx +248 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/searchable-combobox.tsx +134 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/signal-visualizations.tsx +407 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/status-badge.tsx +35 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/theme-provider.tsx +73 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/theme-toggle.tsx +37 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/traffic-slider.tsx +75 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/accordion.tsx +56 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/alert-dialog.tsx +139 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/alert.tsx +59 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/aspect-ratio.tsx +5 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/avatar.tsx +51 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/badge.tsx +38 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/breadcrumb.tsx +115 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/button.tsx +62 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/calendar.tsx +68 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/card.tsx +85 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/carousel.tsx +260 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/chart.tsx +365 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/checkbox.tsx +28 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/collapsible.tsx +11 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/command.tsx +151 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/context-menu.tsx +198 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/dialog.tsx +122 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/drawer.tsx +118 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/dropdown-menu.tsx +198 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/form.tsx +178 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/hover-card.tsx +29 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/input-otp.tsx +69 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/input.tsx +23 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/label.tsx +24 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/menubar.tsx +256 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/navigation-menu.tsx +128 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/pagination.tsx +117 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/popover.tsx +29 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/progress.tsx +28 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/radio-group.tsx +42 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/resizable.tsx +45 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/scroll-area.tsx +46 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/select.tsx +160 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/separator.tsx +29 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/sheet.tsx +140 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/sidebar.tsx +727 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/skeleton.tsx +15 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/slider.tsx +26 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/switch.tsx +27 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/table.tsx +117 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/tabs.tsx +53 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/textarea.tsx +22 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toast.tsx +127 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toaster.tsx +33 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toggle-group.tsx +61 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toggle.tsx +43 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/tooltip.tsx +30 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/vendor-stores-modal.tsx +336 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/venue-type-drawer.tsx +359 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/components/venue-type-selector.tsx +436 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/hooks/use-mobile.tsx +19 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/hooks/use-toast.ts +191 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/index.css +244 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/lib/queryClient.ts +57 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/lib/utils.ts +39 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/lib/venue-taxonomy.ts +532 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/main.tsx +5 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/assign-creative.tsx +781 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/content-hub.tsx +995 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/custom-pois.tsx +431 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/dashboard.tsx +620 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/deal-detail.tsx +1062 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/deal-form.tsx +1570 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/deals.tsx +716 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/edit-creative-assignment.tsx +1051 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/geotargeting.tsx +675 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/integrations.tsx +425 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/line-item-creatives.tsx +622 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/line-item-form.tsx +3132 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/line-items.tsx +530 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/not-found.tsx +21 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/proof-of-play-upload.tsx +479 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/proof-of-play.tsx +880 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/reports.tsx +235 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/settings.tsx +652 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/signal-form.tsx +1117 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/signals.tsx +366 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/tags.tsx +332 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/pages/venues.tsx +381 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/types/mapbox-gl-draw.d.ts +37 -0
- package/Influence-MW-AdServer-12-02-2026/client/src/types/react-simple-maps.d.ts +57 -0
- package/Influence-MW-AdServer-12-02-2026/components.json +20 -0
- package/Influence-MW-AdServer-12-02-2026/docs/PRD.md +3373 -0
- package/Influence-MW-AdServer-12-02-2026/docs/influence-feature-mapping.csv +498 -0
- package/Influence-MW-AdServer-12-02-2026/drizzle.config.ts +14 -0
- package/Influence-MW-AdServer-12-02-2026/package-lock.json +9672 -0
- package/Influence-MW-AdServer-12-02-2026/package.json +118 -0
- package/Influence-MW-AdServer-12-02-2026/postcss.config.js +6 -0
- package/Influence-MW-AdServer-12-02-2026/replit.md +91 -0
- package/Influence-MW-AdServer-12-02-2026/script/build.ts +67 -0
- package/Influence-MW-AdServer-12-02-2026/scripts/create-miro-diagrams.cjs +318 -0
- package/Influence-MW-AdServer-12-02-2026/scripts/create-remaining-diagrams.cjs +270 -0
- package/Influence-MW-AdServer-12-02-2026/server/index.ts +103 -0
- package/Influence-MW-AdServer-12-02-2026/server/recommendation-service.ts +319 -0
- package/Influence-MW-AdServer-12-02-2026/server/routes.ts +1890 -0
- package/Influence-MW-AdServer-12-02-2026/server/static.ts +19 -0
- package/Influence-MW-AdServer-12-02-2026/server/storage.ts +2058 -0
- package/Influence-MW-AdServer-12-02-2026/server/vite.ts +58 -0
- package/Influence-MW-AdServer-12-02-2026/shared/schema.ts +1595 -0
- package/Influence-MW-AdServer-12-02-2026/tailwind.config.ts +107 -0
- package/Influence-MW-AdServer-12-02-2026/tsconfig.json +23 -0
- package/Influence-MW-AdServer-12-02-2026/vite.config.ts +40 -0
- package/LINE_ITEM_BUDGET_FIELD_MAPPING.md +178 -0
- package/PCM/.env.example +92 -0
- package/PCM/README.md +558 -0
- package/PCM/docs/TEST_CASES.md +422 -0
- package/PCM/index.js +106 -0
- package/PCM/package-lock.json +3282 -0
- package/PCM/package.json +32 -0
- package/PCM/replit.md +64 -0
- package/PCM/schema.sql +495 -0
- package/PCM/scripts/export-schema.js +183 -0
- package/PCM/scripts/seed-comprehensive.js +631 -0
- package/PCM/scripts/seed-production.js +477 -0
- package/PCM/src/config/db.js +56 -0
- package/PCM/src/config/swagger.js +5975 -0
- package/PCM/src/dto/EmailRequestDTO.js +166 -0
- package/PCM/src/middleware/errorHandler.js +52 -0
- package/PCM/src/middleware/logger.js +26 -0
- package/PCM/src/migrations/001_add_campaign_mode_fields.sql +36 -0
- package/PCM/src/migrations/002_create_deal_id_counters.sql +22 -0
- package/PCM/src/migrations/003_update_publishers_column.sql +15 -0
- package/PCM/src/migrations/004_add_direct_dealtype_and_advertiser.sql +5 -0
- package/PCM/src/migrations/005_add_programmatic_fields_and_update_enums.sql +31 -0
- package/PCM/src/migrations/006_add_line_item_programmatic_fields.sql +12 -0
- package/PCM/src/migrations/007_add_line_item_direct_fields.sql +15 -0
- package/PCM/src/migrations/008_add_inventory_fields.sql +45 -0
- package/PCM/src/migrations/009_move_inventory_fields_to_metadata.sql +32 -0
- package/PCM/src/migrations/010_add_draft_status_and_line_items_count.sql +23 -0
- package/PCM/src/migrations/011_add_planning_field.sql +21 -0
- package/PCM/src/migrations/012_fix_inventory_composite_pk.sql +17 -0
- package/PCM/src/migrations/013_make_external_id_optional.sql +3 -0
- package/PCM/src/migrations/014_create_change_history.sql +38 -0
- package/PCM/src/migrations/016_create_publisher_insertion_orders.sql +33 -0
- package/PCM/src/migrations/017_fix_line_item_id_fk_reference.sql +86 -0
- package/PCM/src/migrations/018_create_approval_tables.sql +44 -0
- package/PCM/src/migrations/019_add_encrypted_token_column.sql +2 -0
- package/PCM/src/migrations/020_add_rejection_reason_to_deals.sql +10 -0
- package/PCM/src/migrations/021_add_publisher_external_id_to_inventories.sql +12 -0
- package/PCM/src/migrations/022_add_line_item_extended_fields.sql +24 -0
- package/PCM/src/migrations/023_add_base_price_fields.sql +8 -0
- package/PCM/src/migrations/run-migrations.js +46 -0
- package/PCM/src/models/ApprovalOTP.js +51 -0
- package/PCM/src/models/ApprovalToken.js +79 -0
- package/PCM/src/models/ChangeHistory.js +107 -0
- package/PCM/src/models/Deal.js +186 -0
- package/PCM/src/models/DealIdCounter.js +28 -0
- package/PCM/src/models/LineItem.js +227 -0
- package/PCM/src/models/LineItemCreative.js +89 -0
- package/PCM/src/models/LineItemInventory.js +115 -0
- package/PCM/src/models/PublisherInsertionOrder.js +93 -0
- package/PCM/src/models/TransactionHistory.js +34 -0
- package/PCM/src/models/associations.js +81 -0
- package/PCM/src/routes/approval.js +321 -0
- package/PCM/src/routes/creatives.js +437 -0
- package/PCM/src/routes/deals.js +1638 -0
- package/PCM/src/routes/digitalSignage.js +242 -0
- package/PCM/src/routes/insertionOrders.js +380 -0
- package/PCM/src/routes/lineItems.js +926 -0
- package/PCM/src/routes/system.js +384 -0
- package/PCM/src/services/ApprovalService.js +885 -0
- package/PCM/src/services/CampaignImportConverter.js +631 -0
- package/PCM/src/services/CampaignModeService.js +273 -0
- package/PCM/src/services/CampaignStatusService.js +395 -0
- package/PCM/src/services/ChangeHistoryService.js +316 -0
- package/PCM/src/services/DealIdService.js +94 -0
- package/PCM/src/services/DealResponseFormatter.js +90 -0
- package/PCM/src/services/EmailNotificationService.js +315 -0
- package/PCM/src/services/LineItemResponseFormatter.js +122 -0
- package/PCM/src/services/LineItemStatusService.js +380 -0
- package/PCM/src/tests/comprehensiveTestRunner.js +360 -0
- package/PCM/src/tests/comprehensiveTests.js +1277 -0
- package/PCM/src/tests/dealTypeUnitTests.js +1058 -0
- package/PCM/src/tests/testRunner.js +248 -0
- package/PCM/src/utils/caseConverter.js +92 -0
- package/PCM/src/utils/dealCalculations.js +206 -0
- package/PCM/src/utils/lineItemPayloadNormalizer.js +41 -0
- package/PCM/src/utils/payloadNormalizer.js +34 -0
- package/PCM/src/utils/sourceNormalizer.js +56 -0
- package/PCM/src/validators/creativeValidator.js +27 -0
- package/PCM/src/validators/dealValidator.js +203 -0
- package/PCM/src/validators/lineItemValidator.js +489 -0
- package/PCM/tests/approval-flows.test.js +238 -0
- package/PCM/tests/approval-workflow.test.js +291 -0
- package/PCM/tests/campaign-import-converter.test.js +543 -0
- package/PCM/tests/campaign-import-e2e.test.js +520 -0
- package/PCM/tests/campaign-status.test.js +539 -0
- package/PCM/tests/direct-publisher-split-reimport.test.js +460 -0
- package/PCM/tests/e2e/digital-signage.test.js +145 -0
- package/PCM/tests/e2e/search-filter-pagination.test.js +399 -0
- package/PCM/tests/e2e-comprehensive.test.js +3446 -0
- package/PCM/tests/edge-cases.test.js +340 -0
- package/PCM/tests/line-item-status.test.js +340 -0
- package/PCM/tests/seller-account-external-ids.test.js +877 -0
- package/PCM/tests/source-validation.test.js +324 -0
- package/PRD.md +3373 -0
- package/README.md +186 -0
- package/client/index.html +35 -0
- package/client/public/DEMO_STATUS.md +579 -0
- package/client/public/img/MW-logo-trans_1754045676555.png +0 -0
- package/client/public/locales/ar/approval.json +144 -0
- package/client/public/locales/ar/buyer.json +61 -0
- package/client/public/locales/ar/campaigns.json +1 -0
- package/client/public/locales/ar/common.json +218 -0
- package/client/public/locales/ar/contentHub.json +266 -0
- package/client/public/locales/ar/creatives.json +79 -0
- package/client/public/locales/ar/dashboard.json +57 -0
- package/client/public/locales/ar/deals.json +886 -0
- package/client/public/locales/ar/dsp.json +131 -0
- package/client/public/locales/ar/inventory.json +201 -0
- package/client/public/locales/ar/lineItems.json +553 -0
- package/client/public/locales/ar/navigation.json +48 -0
- package/client/public/locales/ar/wizard.json +1 -0
- package/client/public/locales/en/approval.json +144 -0
- package/client/public/locales/en/buyer.json +65 -0
- package/client/public/locales/en/campaigns.json +1 -0
- package/client/public/locales/en/common.json +218 -0
- package/client/public/locales/en/contentHub.json +266 -0
- package/client/public/locales/en/creatives.json +79 -0
- package/client/public/locales/en/dashboard.json +57 -0
- package/client/public/locales/en/deals.json +886 -0
- package/client/public/locales/en/dsp.json +131 -0
- package/client/public/locales/en/inventory.json +201 -0
- package/client/public/locales/en/lineItems.json +659 -0
- package/client/public/locales/en/navigation.json +48 -0
- package/client/public/locales/en/wizard.json +1 -0
- package/client/public/locales/ja/approval.json +144 -0
- package/client/public/locales/ja/buyer.json +61 -0
- package/client/public/locales/ja/campaigns.json +1 -0
- package/client/public/locales/ja/common.json +218 -0
- package/client/public/locales/ja/contentHub.json +266 -0
- package/client/public/locales/ja/creatives.json +79 -0
- package/client/public/locales/ja/dashboard.json +57 -0
- package/client/public/locales/ja/deals.json +886 -0
- package/client/public/locales/ja/dsp.json +131 -0
- package/client/public/locales/ja/inventory.json +201 -0
- package/client/public/locales/ja/lineItems.json +553 -0
- package/client/public/locales/ja/navigation.json +48 -0
- package/client/public/locales/ja/wizard.json +1 -0
- package/client/public/locales/zh/approval.json +144 -0
- package/client/public/locales/zh/buyer.json +61 -0
- package/client/public/locales/zh/campaigns.json +1 -0
- package/client/public/locales/zh/common.json +218 -0
- package/client/public/locales/zh/contentHub.json +266 -0
- package/client/public/locales/zh/creatives.json +79 -0
- package/client/public/locales/zh/dashboard.json +57 -0
- package/client/public/locales/zh/deals.json +886 -0
- package/client/public/locales/zh/dsp.json +131 -0
- package/client/public/locales/zh/inventory.json +201 -0
- package/client/public/locales/zh/lineItems.json +553 -0
- package/client/public/locales/zh/navigation.json +48 -0
- package/client/public/locales/zh/wizard.json +1 -0
- package/client/public/manifest.json +36 -0
- package/client/src/App.tsx +464 -0
- package/client/src/components/app-sidebar.tsx +312 -0
- package/client/src/components/approval/approval-decision-form.test.tsx +294 -0
- package/client/src/components/approval/approval-decision-form.tsx +326 -0
- package/client/src/components/approval/approval-sheet.tsx +631 -0
- package/client/src/components/approval/line-item-details-sheet.tsx +371 -0
- package/client/src/components/approval/otp-verification.test.tsx +337 -0
- package/client/src/components/approval/otp-verification.tsx +180 -0
- package/client/src/components/content-hub/bulk-transcode-dialog.tsx +379 -0
- package/client/src/components/content-hub/content-hub-manager-v2.tsx +574 -0
- package/client/src/components/content-hub/content-hub-manager.tsx +330 -0
- package/client/src/components/content-hub/creative-card.tsx +456 -0
- package/client/src/components/content-hub/creative-detail-sheet.tsx +685 -0
- package/client/src/components/content-hub/creative-filters.tsx +457 -0
- package/client/src/components/content-hub/creative-grid.tsx +329 -0
- package/client/src/components/content-hub/creative-selector.tsx +415 -0
- package/client/src/components/content-hub/creative-upload.tsx +547 -0
- package/client/src/components/content-hub/folder-dialogs.tsx +445 -0
- package/client/src/components/content-hub/folder-list.tsx +280 -0
- package/client/src/components/content-hub/review-dialogs.tsx +268 -0
- package/client/src/components/content-hub/transcode-dialog.tsx +226 -0
- package/client/src/components/creative-library/creative-details-view.tsx +446 -0
- package/client/src/components/creative-library/creative-filters-panel.tsx +203 -0
- package/client/src/components/creative-library/creative-list.tsx +360 -0
- package/client/src/components/creative-library/creative-status-badge.tsx +71 -0
- package/client/src/components/creative-library/folder-card.tsx +78 -0
- package/client/src/components/creative-library/index.ts +27 -0
- package/client/src/components/creative-library/new-creative-card.tsx +211 -0
- package/client/src/components/creative-library/upload-creative-dialog.tsx +261 -0
- package/client/src/components/dashboard-overview.tsx +109 -0
- package/client/src/components/deals/approval-history-panel.test.tsx +240 -0
- package/client/src/components/deals/approval-history-panel.tsx +156 -0
- package/client/src/components/deals/deal-status-badge.tsx +92 -0
- package/client/src/components/deals/import-from-planner-dialog.tsx +399 -0
- package/client/src/components/deals/market-insights-panel.tsx +237 -0
- package/client/src/components/deals/reopen-deal-sheet.tsx +191 -0
- package/client/src/components/deals/request-approval-sheet.test.tsx +323 -0
- package/client/src/components/deals/request-approval-sheet.tsx +136 -0
- package/client/src/components/deals/resend-approval-sheet.tsx +201 -0
- package/client/src/components/direct-campaigns/campaign-card.tsx +283 -0
- package/client/src/components/direct-campaigns/deal-filter-panel.tsx +325 -0
- package/client/src/components/inventory/advanced-filters-panel.tsx +273 -0
- package/client/src/components/inventory/csv-upload-modal.tsx +639 -0
- package/client/src/components/inventory/inventory-availability-view.tsx +486 -0
- package/client/src/components/inventory/inventory-details-sheet.tsx +376 -0
- package/client/src/components/inventory/inventory-map-view.tsx +596 -0
- package/client/src/components/inventory/inventory-settings-menu.tsx +52 -0
- package/client/src/components/language-switcher.tsx +53 -0
- package/client/src/components/line-items/campaign-forecast-panel.tsx +138 -0
- package/client/src/components/line-items/form-insights.tsx +89 -0
- package/client/src/components/line-items/geofencing/LocationCsvUploadDrawer.tsx +100 -0
- package/client/src/components/line-items/geofencing/POIDropdown.tsx +379 -0
- package/client/src/components/line-items/geofencing/SelectedLocationsSidebar.tsx +436 -0
- package/client/src/components/line-items/geofencing/ViewFileLocationDrawer.tsx +199 -0
- package/client/src/components/line-items/geofencing/components/ExistingFilesTab.tsx +268 -0
- package/client/src/components/line-items/geofencing/components/TemplateDownloadSection.tsx +59 -0
- package/client/src/components/line-items/geofencing/components/UploadTab.tsx +215 -0
- package/client/src/components/line-items/geofencing-map.tsx +1270 -0
- package/client/src/components/line-items/inventory-availability-section.tsx +178 -0
- package/client/src/components/line-items/line-item-schedule-manager.tsx +313 -0
- package/client/src/components/line-items/manual-inventory-drawer.tsx +346 -0
- package/client/src/components/line-items/planner-inventory-card.tsx +495 -0
- package/client/src/components/line-items/planner-schedule-grid.tsx +495 -0
- package/client/src/components/line-items/schedule-rule-editor.tsx +649 -0
- package/client/src/components/line-items/schedule-rule-types.ts +122 -0
- package/client/src/components/line-items/steps/creatives-step.tsx +681 -0
- package/client/src/components/line-items/steps/inventory-schedule-step.tsx +1596 -0
- package/client/src/components/line-items/steps/inventory-step.tsx +1533 -0
- package/client/src/components/line-items/steps/line-item-details-step.tsx +916 -0
- package/client/src/components/line-items/steps/schedule-step.tsx +273 -0
- package/client/src/components/line-items/steps/summary-step.tsx +680 -0
- package/client/src/components/line-items/steps/targeting-step.tsx +1708 -0
- package/client/src/components/product-switcher.tsx +105 -0
- package/client/src/components/protected-route.tsx +49 -0
- package/client/src/components/skip-link.tsx +22 -0
- package/client/src/components/stat-card.tsx +53 -0
- package/client/src/components/status-badge.tsx +96 -0
- package/client/src/components/ui/hierarchical-venue-selector.tsx +389 -0
- package/client/src/components/ui/toaster.tsx +111 -0
- package/client/src/contexts/auth-context.tsx +181 -0
- package/client/src/contexts/sidebar-state.tsx +50 -0
- package/client/src/contexts/theme-context.tsx +66 -0
- package/client/src/data/campaign-data.json +107 -0
- package/client/src/data/countries.json +22 -0
- package/client/src/hooks/use-approval.ts +366 -0
- package/client/src/hooks/use-keyboard-shortcuts.ts +74 -0
- package/client/src/hooks/use-media-query.ts +46 -0
- package/client/src/hooks/use-mobile.tsx +19 -0
- package/client/src/hooks/use-page-title.ts +21 -0
- package/client/src/hooks/use-toast.ts +195 -0
- package/client/src/index.css +694 -0
- package/client/src/lib/__tests__/accessibility.test.ts +104 -0
- package/client/src/lib/__tests__/date-utils.test.ts +199 -0
- package/client/src/lib/__tests__/dsp-buyer-api.test.ts +127 -0
- package/client/src/lib/__tests__/dsp-buyer-integration.test.ts +247 -0
- package/client/src/lib/__tests__/storage-utils.test.ts +167 -0
- package/client/src/lib/__tests__/utils.test.ts +57 -0
- package/client/src/lib/accessibility.ts +141 -0
- package/client/src/lib/api-config.ts +9 -0
- package/client/src/lib/auth-service.ts +209 -0
- package/client/src/lib/campaign-creative-api.ts +82 -0
- package/client/src/lib/company-api.ts +61 -0
- package/client/src/lib/content-hub-api.ts +407 -0
- package/client/src/lib/creative-mapper.ts +61 -0
- package/client/src/lib/date-utils.ts +119 -0
- package/client/src/lib/deal-helpers.ts +220 -0
- package/client/src/lib/dsp-buyer-api.ts +196 -0
- package/client/src/lib/geo-import-api.ts +151 -0
- package/client/src/lib/google-poi-api.ts +305 -0
- package/client/src/lib/i18n/__tests__/formatting.test.ts +202 -0
- package/client/src/lib/i18n/formatting.ts +130 -0
- package/client/src/lib/i18n/index.ts +8 -0
- package/client/src/lib/i18n-compat.ts +76 -0
- package/client/src/lib/influence-deals-api.ts +896 -0
- package/client/src/lib/inventory-api.ts +399 -0
- package/client/src/lib/oauth-service.ts +678 -0
- package/client/src/lib/poi-types.ts +75 -0
- package/client/src/lib/queryClient.ts +144 -0
- package/client/src/lib/recommendation-api.ts +380 -0
- package/client/src/lib/storage-utils.ts +104 -0
- package/client/src/lib/tolgee.ts +85 -0
- package/client/src/lib/utils.ts +0 -0
- package/client/src/main.tsx +67 -0
- package/client/src/mapbox-draw-modes.d.ts +32 -0
- package/client/src/pages/all-folders.tsx +203 -0
- package/client/src/pages/auth-callback.tsx +115 -0
- package/client/src/pages/buyer-form.tsx +339 -0
- package/client/src/pages/buyer-list.tsx +622 -0
- package/client/src/pages/content-hub.tsx +1358 -0
- package/client/src/pages/create-deal.tsx +2093 -0
- package/client/src/pages/creative-assignment-page.tsx +548 -0
- package/client/src/pages/creatives.tsx +5 -0
- package/client/src/pages/custom-pois.tsx +425 -0
- package/client/src/pages/dashboard.tsx +615 -0
- package/client/src/pages/deal-history.tsx +434 -0
- package/client/src/pages/deal-line-items.tsx +1703 -0
- package/client/src/pages/demo-status.tsx +113 -0
- package/client/src/pages/direct-campaign-details.tsx +361 -0
- package/client/src/pages/direct-campaigns-new.tsx +824 -0
- package/client/src/pages/dsp-form.tsx +803 -0
- package/client/src/pages/dsp-list.tsx +239 -0
- package/client/src/pages/folder-content.tsx +336 -0
- package/client/src/pages/integrations.tsx +429 -0
- package/client/src/pages/line-item-creatives.tsx +789 -0
- package/client/src/pages/line-item-detail-page.tsx +684 -0
- package/client/src/pages/line-item-form-page.tsx +3261 -0
- package/client/src/pages/line-item-wizard.tsx +1207 -0
- package/client/src/pages/login.tsx +154 -0
- package/client/src/pages/not-found.tsx +23 -0
- package/client/src/pages/proof-of-play.tsx +397 -0
- package/client/src/pages/public-approval.tsx +551 -0
- package/client/src/pages/reports.tsx +231 -0
- package/client/src/pages/settings.tsx +760 -0
- package/client/src/pages/signals.tsx +389 -0
- package/client/src/pages/tags.tsx +318 -0
- package/client/src/pages/test-results.tsx +328 -0
- package/client/src/store/hooks.ts +5 -0
- package/client/src/store/index.ts +15 -0
- package/client/src/store/mapMarkerLocationsSlice.ts +241 -0
- package/client/src/styles/design-tokens.css +324 -0
- package/client/src/test/setup.ts +261 -0
- package/client/src/test/test-utils.tsx +40 -0
- package/client/src/types/approval.ts +221 -0
- package/client/src/types/content-hub.ts +209 -0
- package/client/src/types/geofencing.ts +67 -0
- package/client/src/types/transcoding.ts +140 -0
- package/client/src/vite-env.d.ts +18 -0
- package/components.json +20 -0
- package/creative-api.json +1 -0
- package/docs/AI_REFERENCE.md +459 -0
- package/docs/MWDesign-Prompt.md +132 -0
- package/docs/MWDesign-System.md +344 -0
- package/docs/test-plan.md +277 -0
- package/e2e/AUTONOMOUS-TESTING.md +406 -0
- package/e2e/README.md +219 -0
- package/e2e/autonomous-flow.spec.ts +308 -0
- package/e2e/debug-sso.spec.ts +163 -0
- package/e2e/direct-campaigns.spec.ts +219 -0
- package/e2e/explore-sso.spec.ts +149 -0
- package/e2e/fixtures/auth.ts +26 -0
- package/e2e/fixtures/enhanced-test.ts +331 -0
- package/e2e/pagination.spec.ts +280 -0
- package/e2e/view-toggle.spec.ts +312 -0
- package/generated-icon.png +0 -0
- package/i18next-scanner.config.cjs +46 -0
- package/package.json +141 -0
- package/playwright.config.ts +93 -0
- package/postcss.config.js +6 -0
- package/replit.md +196 -0
- package/screenshot-after-login.png +0 -0
- package/screenshot-contenthub-grid.png +0 -0
- package/screenshot-contenthub-list-fixed.png +0 -0
- package/screenshot-contenthub-list.png +0 -0
- package/screenshot-create-deal.png +0 -0
- package/screenshot-dashboard.png +0 -0
- package/screenshot-deals.png +0 -0
- package/screenshot-login-filled.png +0 -0
- package/screenshot-login.png +0 -0
- package/screenshot.mjs +24 -0
- package/scripts/deploy-stg.sh +185 -0
- package/shared/direct-io-schema.ts +383 -0
- package/shared/schema.ts +439 -0
- package/shared/screen-types.ts +149 -0
- package/springdocDefault.json +1 -0
- package/swagger-ui-bundle.js +2 -0
- package/swagger-ui-init.js +10316 -0
- package/tailwind.config.ts +282 -0
- package/terraform/README.md +306 -0
- package/terraform/cloudfront.tf +289 -0
- package/terraform/ecs.tf +727 -0
- package/terraform/environments/dev.tfvars +59 -0
- package/terraform/environments/production.tfvars +60 -0
- package/terraform/main.tf +47 -0
- package/terraform/outputs.tf +145 -0
- package/terraform/s3.tf +192 -0
- package/terraform/variables.tf +226 -0
- package/terraform/waf.tf +165 -0
- package/terraform-frontend/.terraform.lock.hcl +25 -0
- package/terraform-frontend/README.md +85 -0
- package/terraform-frontend/cloudfront.tf +125 -0
- package/terraform-frontend/main.tf +31 -0
- package/terraform-frontend/outputs.tf +24 -0
- package/terraform-frontend/terraform.tfvars +12 -0
- package/terraform-frontend/variables.tf +53 -0
- package/tsconfig.json +23 -0
- package/vite.config.ts +226 -0
- package/vitest.config.ts +56 -0
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
# Autonomous End-to-End Testing Guide
|
|
2
|
+
|
|
3
|
+
Complete autonomous testing framework with SSO login, screenshots, DOM snapshots, console logs, and network monitoring.
|
|
4
|
+
|
|
5
|
+
## 🎯 Features
|
|
6
|
+
|
|
7
|
+
### Full Observability
|
|
8
|
+
- ✅ **Automatic Screenshots** - Captured at every test step
|
|
9
|
+
- ✅ **DOM Snapshots** - HTML saved for offline debugging
|
|
10
|
+
- ✅ **Console Logs** - All browser console output collected
|
|
11
|
+
- ✅ **Network Monitoring** - Complete API request/response logs
|
|
12
|
+
- ✅ **Error Tracking** - Page errors and HTTP failures captured
|
|
13
|
+
- ✅ **SSO Authentication** - Automatic login flow handling
|
|
14
|
+
|
|
15
|
+
### Test Coverage
|
|
16
|
+
- ✅ Complete Direct Campaigns workflow
|
|
17
|
+
- ✅ Search functionality with debounce
|
|
18
|
+
- ✅ Pagination (MW Planner design)
|
|
19
|
+
- ✅ View toggle (List/Grid)
|
|
20
|
+
- ✅ Row selection
|
|
21
|
+
- ✅ Campaign actions
|
|
22
|
+
- ✅ Navigation flows
|
|
23
|
+
- ✅ State persistence
|
|
24
|
+
|
|
25
|
+
## 🚀 Quick Start
|
|
26
|
+
|
|
27
|
+
### 1. Install Playwright Browsers
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm run playwright:install
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### 2. Configure Test Credentials (Optional)
|
|
34
|
+
|
|
35
|
+
Copy the example environment file:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
cp .env.test.example .env.test
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Edit `.env.test` with your credentials:
|
|
42
|
+
|
|
43
|
+
```env
|
|
44
|
+
TEST_EMAIL=your_email@example.com
|
|
45
|
+
TEST_PASSWORD=your_password
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 3. Run Autonomous Tests
|
|
49
|
+
|
|
50
|
+
**With UI (Recommended)**
|
|
51
|
+
```bash
|
|
52
|
+
npm run test:e2e:ui
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Headless Mode**
|
|
56
|
+
```bash
|
|
57
|
+
npm run test:e2e
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**Watch Mode with Browser**
|
|
61
|
+
```bash
|
|
62
|
+
npm run test:e2e:headed
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Debug Mode**
|
|
66
|
+
```bash
|
|
67
|
+
npm run test:e2e:debug
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## 📊 Test Output
|
|
71
|
+
|
|
72
|
+
### Directory Structure
|
|
73
|
+
|
|
74
|
+
After running tests, you'll find:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
test-results/
|
|
78
|
+
├── Autonomous_Complete_Flow_Test-should_complete_full_Direct_Campaigns_workflow_with_full_observability/
|
|
79
|
+
│ ├── screenshots/
|
|
80
|
+
│ │ ├── 01-login-page.png
|
|
81
|
+
│ │ ├── 02-after-sso-click.png
|
|
82
|
+
│ │ ├── 03-authenticated-home.png
|
|
83
|
+
│ │ ├── step-01-campaigns-page.png
|
|
84
|
+
│ │ ├── step-02-campaigns-loaded.png
|
|
85
|
+
│ │ ├── step-03-search-results.png
|
|
86
|
+
│ │ ├── step-04-list-view.png
|
|
87
|
+
│ │ ├── step-05-row-selected.png
|
|
88
|
+
│ │ ├── step-06-all-selected.png
|
|
89
|
+
│ │ ├── step-07-next-page.png
|
|
90
|
+
│ │ ├── step-08-actions-menu.png
|
|
91
|
+
│ │ ├── step-09-campaign-details.png
|
|
92
|
+
│ │ ├── step-10-grid-view.png
|
|
93
|
+
│ │ ├── step-11-filter-modal.png
|
|
94
|
+
│ │ ├── step-12-create-button.png
|
|
95
|
+
│ │ └── step-13-final-state.png
|
|
96
|
+
│ └── logs/
|
|
97
|
+
│ ├── console.log
|
|
98
|
+
│ ├── network.json
|
|
99
|
+
│ ├── errors.log (if any)
|
|
100
|
+
│ ├── step-01-campaigns-page.html
|
|
101
|
+
│ ├── step-04-list-view.html
|
|
102
|
+
│ ├── step-09-campaign-details.html
|
|
103
|
+
│ ├── step-10-grid-view.html
|
|
104
|
+
│ └── step-13-final-state.html
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Console Logs
|
|
108
|
+
|
|
109
|
+
View all browser console output:
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
test-results/[test-name]/logs/console.log
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Example:
|
|
116
|
+
```
|
|
117
|
+
[log] 🔐 Starting authentication flow...
|
|
118
|
+
[log] 📸 Screenshot: login page
|
|
119
|
+
[log] ✅ Already authenticated, skipping login
|
|
120
|
+
[log] 📍 Step 1: Navigate to Direct Campaigns page
|
|
121
|
+
[log] 🌐 Request: GET /direct-campaigns
|
|
122
|
+
[log] ✅ HTTP 200: GET /api/direct-campaigns?page=1&limit=12
|
|
123
|
+
[log] ✅ Direct Campaigns page loaded
|
|
124
|
+
...
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Network Logs
|
|
128
|
+
|
|
129
|
+
View all API requests:
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
test-results/[test-name]/logs/network.json
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Example:
|
|
136
|
+
```json
|
|
137
|
+
[
|
|
138
|
+
{
|
|
139
|
+
"url": "http://localhost:5000/api/direct-campaigns?page=1&limit=12",
|
|
140
|
+
"status": 200,
|
|
141
|
+
"method": "GET"
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"url": "http://localhost:5000/api/auth/session",
|
|
145
|
+
"status": 200,
|
|
146
|
+
"method": "GET"
|
|
147
|
+
}
|
|
148
|
+
]
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Error Logs
|
|
152
|
+
|
|
153
|
+
If any errors occur:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
test-results/[test-name]/logs/errors.log
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## 🔐 Authentication Methods
|
|
160
|
+
|
|
161
|
+
The enhanced test fixture supports multiple authentication methods:
|
|
162
|
+
|
|
163
|
+
### 1. SSO Button (Recommended)
|
|
164
|
+
|
|
165
|
+
Automatically detects and clicks SSO button:
|
|
166
|
+
- Looks for buttons with text: "SSO", "Single Sign", "Login with"
|
|
167
|
+
- Handles redirect flow
|
|
168
|
+
- Waits for authentication completion
|
|
169
|
+
|
|
170
|
+
### 2. Email/Password Form
|
|
171
|
+
|
|
172
|
+
Falls back to traditional login:
|
|
173
|
+
- Fills email and password from `.env.test`
|
|
174
|
+
- Submits form
|
|
175
|
+
- Waits for navigation
|
|
176
|
+
|
|
177
|
+
### 3. Already Authenticated
|
|
178
|
+
|
|
179
|
+
Detects if already logged in and skips authentication.
|
|
180
|
+
|
|
181
|
+
### 4. Dev Mode
|
|
182
|
+
|
|
183
|
+
If no login form is found, assumes dev mode and proceeds.
|
|
184
|
+
|
|
185
|
+
## 📝 Test Scenarios
|
|
186
|
+
|
|
187
|
+
### Autonomous Complete Flow
|
|
188
|
+
|
|
189
|
+
The main test covers the entire workflow:
|
|
190
|
+
|
|
191
|
+
1. **Authentication**
|
|
192
|
+
- SSO login with screenshot
|
|
193
|
+
- Session verification
|
|
194
|
+
|
|
195
|
+
2. **Navigation**
|
|
196
|
+
- Navigate to Direct Campaigns
|
|
197
|
+
- Wait for data load
|
|
198
|
+
|
|
199
|
+
3. **Search**
|
|
200
|
+
- Type search query
|
|
201
|
+
- Wait for debounce
|
|
202
|
+
- Verify results
|
|
203
|
+
- Clear search
|
|
204
|
+
|
|
205
|
+
4. **View Toggle**
|
|
206
|
+
- Switch to List view
|
|
207
|
+
- Verify table columns
|
|
208
|
+
- Switch to Grid view
|
|
209
|
+
- Verify cards
|
|
210
|
+
|
|
211
|
+
5. **Selection**
|
|
212
|
+
- Select individual rows
|
|
213
|
+
- Select all rows
|
|
214
|
+
- Unselect
|
|
215
|
+
|
|
216
|
+
6. **Pagination**
|
|
217
|
+
- Verify controls visible
|
|
218
|
+
- Navigate next/previous
|
|
219
|
+
- Test First/Last buttons
|
|
220
|
+
|
|
221
|
+
7. **Actions**
|
|
222
|
+
- Open actions menu
|
|
223
|
+
- Verify menu items
|
|
224
|
+
- Close menu
|
|
225
|
+
|
|
226
|
+
8. **Navigation**
|
|
227
|
+
- Click campaign row
|
|
228
|
+
- Navigate to details
|
|
229
|
+
- Go back
|
|
230
|
+
|
|
231
|
+
9. **Final State**
|
|
232
|
+
- Capture final screenshots
|
|
233
|
+
- Generate summary report
|
|
234
|
+
|
|
235
|
+
### Additional Tests
|
|
236
|
+
|
|
237
|
+
- **Pagination State Persistence** - Verifies page number maintained across navigation
|
|
238
|
+
- **Empty Search Results** - Tests empty state handling
|
|
239
|
+
|
|
240
|
+
## 🔧 Advanced Usage
|
|
241
|
+
|
|
242
|
+
### Custom Test with Enhanced Fixture
|
|
243
|
+
|
|
244
|
+
```typescript
|
|
245
|
+
import { test, expect, takeScreenshot, saveDOMSnapshot, waitForAPIResponse } from './fixtures/enhanced-test';
|
|
246
|
+
|
|
247
|
+
test('my custom test', async ({ authenticatedPage: page, testInfo }) => {
|
|
248
|
+
// Navigate
|
|
249
|
+
await page.goto('/my-page');
|
|
250
|
+
|
|
251
|
+
// Take screenshot
|
|
252
|
+
await takeScreenshot(page, 'my-step', testInfo);
|
|
253
|
+
|
|
254
|
+
// Save DOM
|
|
255
|
+
await saveDOMSnapshot(page, 'my-dom', testInfo);
|
|
256
|
+
|
|
257
|
+
// Wait for specific API
|
|
258
|
+
const response = await waitForAPIResponse(page, '/api/my-endpoint');
|
|
259
|
+
const data = await response.json();
|
|
260
|
+
|
|
261
|
+
// All console logs, network logs, and errors are automatically captured!
|
|
262
|
+
});
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### Helper Functions
|
|
266
|
+
|
|
267
|
+
#### `takeScreenshot(page, name, testInfo)`
|
|
268
|
+
Captures full-page screenshot with timestamp.
|
|
269
|
+
|
|
270
|
+
#### `saveDOMSnapshot(page, name, testInfo)`
|
|
271
|
+
Saves complete HTML for offline inspection.
|
|
272
|
+
|
|
273
|
+
#### `waitForNetworkIdle(page)`
|
|
274
|
+
Waits for all network requests to complete with logging.
|
|
275
|
+
|
|
276
|
+
#### `waitForAPIResponse(page, urlPattern)`
|
|
277
|
+
Waits for specific API response and logs it.
|
|
278
|
+
|
|
279
|
+
## 🐛 Debugging
|
|
280
|
+
|
|
281
|
+
### View Test in Browser
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
npm run test:e2e:headed
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Step Through Test
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
npm run test:e2e:debug
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
This opens Playwright Inspector where you can:
|
|
294
|
+
- Step through each action
|
|
295
|
+
- Inspect elements
|
|
296
|
+
- See console logs in real-time
|
|
297
|
+
- View network requests
|
|
298
|
+
|
|
299
|
+
### View Test Report
|
|
300
|
+
|
|
301
|
+
```bash
|
|
302
|
+
npm run playwright:report
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
Opens HTML report with:
|
|
306
|
+
- Test results
|
|
307
|
+
- Screenshots
|
|
308
|
+
- Videos (for failures)
|
|
309
|
+
- Traces
|
|
310
|
+
|
|
311
|
+
### Check Logs
|
|
312
|
+
|
|
313
|
+
All console and network logs are in:
|
|
314
|
+
```
|
|
315
|
+
test-results/[test-name]/logs/
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
## 🔍 Troubleshooting
|
|
319
|
+
|
|
320
|
+
### Authentication Failing
|
|
321
|
+
|
|
322
|
+
1. **Check credentials** in `.env.test`
|
|
323
|
+
2. **View screenshot** `01-login-page.png`
|
|
324
|
+
3. **Check console logs** for errors
|
|
325
|
+
4. **Update selectors** in `enhanced-test.ts` if login form changed
|
|
326
|
+
|
|
327
|
+
### API Errors
|
|
328
|
+
|
|
329
|
+
1. **Check network logs** `logs/network.json`
|
|
330
|
+
2. **Check error log** `logs/errors.log`
|
|
331
|
+
3. **Verify dev server** is running on port 5000
|
|
332
|
+
|
|
333
|
+
### Test Timeouts
|
|
334
|
+
|
|
335
|
+
1. **Increase timeout** in `playwright.config.ts`
|
|
336
|
+
2. **Check network logs** for slow APIs
|
|
337
|
+
3. **Verify data** is actually loading
|
|
338
|
+
|
|
339
|
+
### Screenshots Not Captured
|
|
340
|
+
|
|
341
|
+
1. **Check permissions** on `test-results/` directory
|
|
342
|
+
2. **Verify testInfo** is passed to helper functions
|
|
343
|
+
3. **Run test** with `--headed` to see what's happening
|
|
344
|
+
|
|
345
|
+
## 📈 Performance Tips
|
|
346
|
+
|
|
347
|
+
### Parallel Testing
|
|
348
|
+
|
|
349
|
+
Run tests in parallel (default):
|
|
350
|
+
```bash
|
|
351
|
+
npm run test:e2e -- --workers=4
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### Specific Test File
|
|
355
|
+
|
|
356
|
+
```bash
|
|
357
|
+
npm run test:e2e autonomous-flow.spec.ts
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
### Specific Test
|
|
361
|
+
|
|
362
|
+
```bash
|
|
363
|
+
npm run test:e2e -- -g "should complete full Direct Campaigns workflow"
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
### Disable Screenshots (Faster)
|
|
367
|
+
|
|
368
|
+
Temporarily comment out `takeScreenshot` calls for faster execution during development.
|
|
369
|
+
|
|
370
|
+
## 🎯 Best Practices
|
|
371
|
+
|
|
372
|
+
1. **Use Enhanced Fixture** - Always use `authenticatedPage` for automatic logging
|
|
373
|
+
2. **Take Screenshots** - At each significant step
|
|
374
|
+
3. **Save DOM** - Before and after major state changes
|
|
375
|
+
4. **Wait for Network** - Use `waitForNetworkIdle()` after navigation
|
|
376
|
+
5. **Check Logs** - Always review console and network logs after failures
|
|
377
|
+
6. **Descriptive Names** - Use clear names for screenshots and DOM snapshots
|
|
378
|
+
|
|
379
|
+
## 🚦 CI/CD Integration (Future)
|
|
380
|
+
|
|
381
|
+
Currently configured for local development only. To add to CI/CD:
|
|
382
|
+
|
|
383
|
+
1. **Set up test environment**
|
|
384
|
+
2. **Add to CI workflow**:
|
|
385
|
+
```yaml
|
|
386
|
+
- name: Run E2E Tests
|
|
387
|
+
run: npm run test:e2e
|
|
388
|
+
env:
|
|
389
|
+
TEST_EMAIL: ${{ secrets.TEST_EMAIL }}
|
|
390
|
+
TEST_PASSWORD: ${{ secrets.TEST_PASSWORD }}
|
|
391
|
+
```
|
|
392
|
+
3. **Upload artifacts**:
|
|
393
|
+
```yaml
|
|
394
|
+
- uses: actions/upload-artifact@v3
|
|
395
|
+
if: always()
|
|
396
|
+
with:
|
|
397
|
+
name: playwright-results
|
|
398
|
+
path: test-results/
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
## 📚 Resources
|
|
402
|
+
|
|
403
|
+
- [Playwright Documentation](https://playwright.dev)
|
|
404
|
+
- [Test Fixtures](https://playwright.dev/docs/test-fixtures)
|
|
405
|
+
- [Debugging](https://playwright.dev/docs/debug)
|
|
406
|
+
- [Best Practices](https://playwright.dev/docs/best-practices)
|
package/e2e/README.md
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# End-to-End Testing with Playwright
|
|
2
|
+
|
|
3
|
+
This directory contains Playwright E2E tests for the Direct Campaigns application. These tests are designed for **local development only** and are not part of the CI/CD pipeline (the frontend is deployed as a static site).
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
### 1. Install Playwright browsers
|
|
8
|
+
|
|
9
|
+
First time setup:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm run playwright:install
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
This will install only Chromium browser for testing.
|
|
16
|
+
|
|
17
|
+
### 2. Ensure dev server is running
|
|
18
|
+
|
|
19
|
+
The tests require the application to be running on `http://localhost:5000`. The Playwright config is set up to automatically start the dev server, but you can also run it manually:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm run dev
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Running Tests
|
|
26
|
+
|
|
27
|
+
### Run all tests (headless)
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm run test:e2e
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Run tests with UI mode (recommended for development)
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm run test:e2e:ui
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
This opens the Playwright UI where you can:
|
|
40
|
+
- See all tests
|
|
41
|
+
- Run individual tests
|
|
42
|
+
- Watch tests run in real-time
|
|
43
|
+
- Debug test failures
|
|
44
|
+
|
|
45
|
+
### Run tests in headed mode (see browser)
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
npm run test:e2e:headed
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Debug tests step-by-step
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
npm run test:e2e:debug
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### View test report
|
|
58
|
+
|
|
59
|
+
After running tests, view the HTML report:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
npm run playwright:report
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Test Structure
|
|
66
|
+
|
|
67
|
+
### Test Files
|
|
68
|
+
|
|
69
|
+
- **`direct-campaigns.spec.ts`** - Tests for Direct Campaigns listing page
|
|
70
|
+
- Page layout and elements
|
|
71
|
+
- Campaign list display
|
|
72
|
+
- Search functionality
|
|
73
|
+
- Row selection
|
|
74
|
+
- Campaign actions (view, edit, delete)
|
|
75
|
+
|
|
76
|
+
- **`pagination.spec.ts`** - Tests for pagination functionality
|
|
77
|
+
- Pagination visibility
|
|
78
|
+
- Navigation (First, Previous, Next, Last)
|
|
79
|
+
- Data accuracy (item counts, page numbers)
|
|
80
|
+
- Mobile vs desktop pagination
|
|
81
|
+
|
|
82
|
+
- **`view-toggle.spec.ts`** - Tests for view toggle functionality
|
|
83
|
+
- List vs Grid view switching
|
|
84
|
+
- View persistence in localStorage
|
|
85
|
+
- Pagination behavior across views
|
|
86
|
+
|
|
87
|
+
### Fixtures
|
|
88
|
+
|
|
89
|
+
- **`fixtures/auth.ts`** - Authentication helper (to be configured with actual login)
|
|
90
|
+
|
|
91
|
+
## Test Coverage
|
|
92
|
+
|
|
93
|
+
### Direct Campaigns Page
|
|
94
|
+
✅ Page header and navigation
|
|
95
|
+
✅ Search with debounce (min 3 characters)
|
|
96
|
+
✅ Campaign table display
|
|
97
|
+
✅ Row selection (individual and select all)
|
|
98
|
+
✅ Campaign actions menu
|
|
99
|
+
✅ Row click navigation
|
|
100
|
+
|
|
101
|
+
### Pagination (MW Planner Design)
|
|
102
|
+
✅ First/Previous/Next/Last buttons
|
|
103
|
+
✅ Page number display ("Page X of Y")
|
|
104
|
+
✅ Item count display ("X to Y of Z")
|
|
105
|
+
✅ Button states (disabled on first/last page)
|
|
106
|
+
✅ Mobile responsive pagination
|
|
107
|
+
✅ Data accuracy across pages
|
|
108
|
+
|
|
109
|
+
### View Toggle
|
|
110
|
+
✅ Grid view (default)
|
|
111
|
+
✅ List view (table)
|
|
112
|
+
✅ View persistence in localStorage
|
|
113
|
+
✅ Selection clearing on view change
|
|
114
|
+
✅ Pagination in both views
|
|
115
|
+
|
|
116
|
+
## Configuration
|
|
117
|
+
|
|
118
|
+
### playwright.config.ts
|
|
119
|
+
|
|
120
|
+
Key settings:
|
|
121
|
+
- **baseURL**: `http://localhost:5000`
|
|
122
|
+
- **timeout**: 30 seconds per test
|
|
123
|
+
- **retries**: 0 (local), 2 (CI)
|
|
124
|
+
- **webServer**: Auto-starts `npm run dev`
|
|
125
|
+
- **reporter**: HTML report
|
|
126
|
+
- **browsers**: Chromium (default), Firefox and WebKit commented out
|
|
127
|
+
|
|
128
|
+
### Customization
|
|
129
|
+
|
|
130
|
+
To test on different browsers, uncomment the desired project in `playwright.config.ts`:
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
projects: [
|
|
134
|
+
{ name: 'chromium', use: { ...devices['Desktop Chrome'] } },
|
|
135
|
+
{ name: 'firefox', use: { ...devices['Desktop Firefox'] } }, // Uncomment
|
|
136
|
+
{ name: 'webkit', use: { ...devices['Desktop Safari'] } }, // Uncomment
|
|
137
|
+
]
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Writing New Tests
|
|
141
|
+
|
|
142
|
+
### Example Test Structure
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
import { test, expect } from '@playwright/test';
|
|
146
|
+
|
|
147
|
+
test.describe('Feature Name', () => {
|
|
148
|
+
test.beforeEach(async ({ page }) => {
|
|
149
|
+
await page.goto('/your-page');
|
|
150
|
+
await page.waitForLoadState('networkidle');
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
test('should do something', async ({ page }) => {
|
|
154
|
+
// Arrange
|
|
155
|
+
const button = page.getByRole('button', { name: 'Click Me' });
|
|
156
|
+
|
|
157
|
+
// Act
|
|
158
|
+
await button.click();
|
|
159
|
+
|
|
160
|
+
// Assert
|
|
161
|
+
await expect(page.getByText('Success')).toBeVisible();
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Best Practices
|
|
167
|
+
|
|
168
|
+
1. **Use data-testid for stability**: Add `data-testid` attributes to important elements
|
|
169
|
+
2. **Wait for network**: Use `page.waitForLoadState('networkidle')` after navigation
|
|
170
|
+
3. **Descriptive names**: Use clear, descriptive test names
|
|
171
|
+
4. **Independent tests**: Each test should be able to run in isolation
|
|
172
|
+
5. **Clean state**: Reset state in `beforeEach` hooks
|
|
173
|
+
6. **Avoid hard-coded waits**: Use `waitForSelector` instead of `waitForTimeout` when possible
|
|
174
|
+
|
|
175
|
+
## Troubleshooting
|
|
176
|
+
|
|
177
|
+
### Tests failing due to timing issues
|
|
178
|
+
|
|
179
|
+
If tests are flaky due to timing:
|
|
180
|
+
- Increase timeout in `playwright.config.ts`
|
|
181
|
+
- Add explicit waits: `await page.waitForSelector('selector')`
|
|
182
|
+
- Use `waitForLoadState('networkidle')` after navigation
|
|
183
|
+
|
|
184
|
+
### Authentication issues
|
|
185
|
+
|
|
186
|
+
The auth fixture in `fixtures/auth.ts` needs to be configured with your actual login flow. Update it with:
|
|
187
|
+
- Correct input selectors
|
|
188
|
+
- Valid test credentials
|
|
189
|
+
- Expected redirect URL after login
|
|
190
|
+
|
|
191
|
+
### Port already in use
|
|
192
|
+
|
|
193
|
+
If port 5000 is already in use:
|
|
194
|
+
- Stop the existing dev server
|
|
195
|
+
- Or change the port in `playwright.config.ts` and your app config
|
|
196
|
+
|
|
197
|
+
### Browser not installed
|
|
198
|
+
|
|
199
|
+
Run the installation command:
|
|
200
|
+
```bash
|
|
201
|
+
npm run playwright:install
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## CI/CD Note
|
|
205
|
+
|
|
206
|
+
⚠️ **Important**: These tests are for local development only. Since the frontend is deployed as a static site, Playwright tests are **not** included in the CI/CD pipeline.
|
|
207
|
+
|
|
208
|
+
If you want to add E2E tests to CI/CD in the future, you would need to:
|
|
209
|
+
1. Set up a test environment with the backend API
|
|
210
|
+
2. Add Playwright to your CI workflow
|
|
211
|
+
3. Configure authentication and test data
|
|
212
|
+
4. Update the `playwright.config.ts` to handle CI mode
|
|
213
|
+
|
|
214
|
+
## Resources
|
|
215
|
+
|
|
216
|
+
- [Playwright Documentation](https://playwright.dev)
|
|
217
|
+
- [Best Practices](https://playwright.dev/docs/best-practices)
|
|
218
|
+
- [Debugging Tests](https://playwright.dev/docs/debug)
|
|
219
|
+
- [Test Assertions](https://playwright.dev/docs/test-assertions)
|