Files
homeproz/tests/property-filters.spec.js
Hanson.xyz Dev acc8ac87a0 wip
2026-01-04 17:50:08 -06:00

213 lines
6.0 KiB
JavaScript
Executable File

// @ts-check
const { test, expect } = require('@playwright/test');
test.describe('Property Filters AJAX', () => {
test('should have homeprozAjax global defined', async ({ page }) => {
await page.goto('/properties/');
// Check if homeprozAjax is defined
const hasAjaxGlobal = await page.evaluate(() => {
return typeof window.homeprozAjax !== 'undefined';
});
console.log('homeprozAjax defined:', hasAjaxGlobal);
if (hasAjaxGlobal) {
const ajaxConfig = await page.evaluate(() => {
return {
ajaxUrl: window.homeprozAjax?.ajaxUrl,
nonce: window.homeprozAjax?.nonce,
archiveUrl: window.homeprozAjax?.archiveUrl
};
});
console.log('AJAX Config:', ajaxConfig);
}
expect(hasAjaxGlobal).toBe(true);
});
test('should have jQuery loaded', async ({ page }) => {
await page.goto('/properties/');
const hasJquery = await page.evaluate(() => {
return typeof window.jQuery !== 'undefined';
});
console.log('jQuery loaded:', hasJquery);
expect(hasJquery).toBe(true);
});
test('should have filter form elements', async ({ page }) => {
await page.goto('/properties/');
// Check for form elements
const filtersForm = page.locator('.filters-form');
const propertyResults = page.locator('#property-results');
await expect(filtersForm).toBeVisible();
await expect(propertyResults).toBeVisible();
// List all select elements
const selects = await page.locator('.filters-form select').all();
console.log('Number of select elements:', selects.length);
for (const select of selects) {
const name = await select.getAttribute('name');
const options = await select.locator('option').count();
console.log(`Select "${name}" has ${options} options`);
}
});
test('should trigger AJAX on dropdown change', async ({ page }) => {
// Listen for network requests
const ajaxRequests = [];
page.on('request', request => {
if (request.url().includes('admin-ajax.php')) {
ajaxRequests.push({
url: request.url(),
postData: request.postData()
});
}
});
const ajaxResponses = [];
page.on('response', async response => {
if (response.url().includes('admin-ajax.php')) {
let body;
try {
body = await response.text();
} catch (e) {
body = 'Could not read body';
}
ajaxResponses.push({
url: response.url(),
status: response.status(),
body: body.substring(0, 500)
});
}
});
// Listen for console errors
const consoleErrors = [];
page.on('console', msg => {
if (msg.type() === 'error') {
consoleErrors.push(msg.text());
}
});
await page.goto('/properties/');
// Wait for page to fully load
await page.waitForLoadState('networkidle');
// Get the sort dropdown (most likely to have multiple options)
const sortSelect = page.locator('select[name="sort"]');
if (await sortSelect.count() > 0) {
console.log('Changing sort dropdown...');
// Change the value
await sortSelect.selectOption('price_low');
// Wait a moment for AJAX
await page.waitForTimeout(2000);
console.log('AJAX Requests made:', ajaxRequests.length);
console.log('AJAX Responses received:', ajaxResponses.length);
if (ajaxRequests.length > 0) {
console.log('Request details:', JSON.stringify(ajaxRequests, null, 2));
}
if (ajaxResponses.length > 0) {
console.log('Response details:', JSON.stringify(ajaxResponses, null, 2));
}
if (consoleErrors.length > 0) {
console.log('Console errors:', consoleErrors);
}
}
// Check if any AJAX request was made
expect(ajaxRequests.length).toBeGreaterThan(0);
});
test('should check for JavaScript errors on page load', async ({ page }) => {
const jsErrors = [];
page.on('pageerror', error => {
jsErrors.push(error.message);
});
page.on('console', msg => {
if (msg.type() === 'error') {
jsErrors.push(msg.text());
}
});
await page.goto('/properties/');
await page.waitForLoadState('networkidle');
console.log('JavaScript errors found:', jsErrors.length);
if (jsErrors.length > 0) {
console.log('Errors:', jsErrors);
}
// This test reports errors but doesn't fail - we want to see what's happening
expect(true).toBe(true);
});
test('manual AJAX call test', async ({ page }) => {
await page.goto('/properties/');
await page.waitForLoadState('networkidle');
// Try making a manual AJAX call to see what happens
const result = await page.evaluate(async () => {
if (typeof window.homeprozAjax === 'undefined') {
return { error: 'homeprozAjax not defined' };
}
if (typeof window.jQuery === 'undefined') {
return { error: 'jQuery not defined' };
}
return new Promise((resolve) => {
window.jQuery.ajax({
url: window.homeprozAjax.ajaxUrl,
type: 'POST',
data: {
action: 'homeproz_filter_properties',
nonce: window.homeprozAjax.nonce,
property_type: '',
property_status: '',
property_location: '',
min_price: '',
max_price: '',
beds: '',
sort: 'newest',
paged: 1
},
success: function(response) {
resolve({ success: true, response: response });
},
error: function(xhr, status, error) {
resolve({
success: false,
status: xhr.status,
statusText: xhr.statusText,
responseText: xhr.responseText?.substring(0, 500),
error: error
});
}
});
});
});
console.log('Manual AJAX result:', JSON.stringify(result, null, 2));
if (result.error) {
console.log('ERROR:', result.error);
}
});
});