184 lines
No EOL
6.7 KiB
TypeScript
184 lines
No EOL
6.7 KiB
TypeScript
import { STAGING_URL, PATHS, TIMEOUTS } from './config/staging-config';
|
|
import { test, expect, Page } from '@playwright/test';
|
|
import * as dotenv from 'dotenv';
|
|
import { resolve } from 'path';
|
|
|
|
dotenv.config({ path: resolve(__dirname, '../../../../.env') });
|
|
|
|
test.use({
|
|
screenshot: 'only-on-failure',
|
|
video: 'retain-on-failure',
|
|
trace: 'retain-on-failure',
|
|
actionTimeout: 30000,
|
|
timeout: 120000, // 2 minutes per test
|
|
});
|
|
|
|
test.describe('Event Creation via API', () => {
|
|
const stagingUrl = process.env.UPSKILL_STAGING_URL || 'https://upskill-staging.measurequick.com';
|
|
|
|
test('creates event via WordPress AJAX API', async ({ page, request }) => {
|
|
const username = 'test_trainer';
|
|
const password = 'Test123!';
|
|
|
|
// Step 1: Login to get cookies and nonce
|
|
await page.goto(stagingUrl + '/community-login/', { waitUntil: 'domcontentloaded' });
|
|
await page.fill('input#user_login', username);
|
|
await page.fill('input#user_pass', password);
|
|
await page.getByRole('button', { name: /log in/i }).click();
|
|
await page.waitForURL(/hvac-dashboard|manage-event/, { timeout: 30000 });
|
|
|
|
// Get the cookies from the logged-in session
|
|
const cookies = await page.context().cookies();
|
|
|
|
// Navigate to the event creation page to get the nonce
|
|
await page.goto(stagingUrl + '/manage-event/', { waitUntil: 'domcontentloaded' });
|
|
|
|
// Extract nonce and form data from the page
|
|
const formData = await page.evaluate(() => {
|
|
const form = document.querySelector('form');
|
|
if (!form) return null;
|
|
|
|
// Get nonce values
|
|
const nonceInput = document.querySelector('input[name="_wpnonce"]') as HTMLInputElement;
|
|
const nonce = nonceInput?.value || '';
|
|
|
|
// Get any other hidden fields
|
|
const hiddenInputs: Record<string, string> = {};
|
|
form.querySelectorAll('input[type="hidden"]').forEach((input) => {
|
|
const name = (input as HTMLInputElement).name;
|
|
const value = (input as HTMLInputElement).value;
|
|
if (name) hiddenInputs[name] = value;
|
|
});
|
|
|
|
return { nonce, hiddenInputs };
|
|
});
|
|
|
|
if (!formData) {
|
|
throw new Error('Could not extract form data');
|
|
}
|
|
|
|
// Step 2: Create event via AJAX
|
|
const now = new Date();
|
|
const uniqueTitle = `HVAC Training ${now.toISOString().split('.')[0].replace(/[-T:]/g, '')}`;
|
|
const eventDate = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);
|
|
const dateStr = eventDate.toISOString().split('T')[0];
|
|
|
|
// Build the request data
|
|
const eventData = {
|
|
post_title: uniqueTitle,
|
|
post_content: `This is a test event created on ${now.toISOString()}. This event covers HVAC training basics.`,
|
|
tcepostcontent: `This is a test event created on ${now.toISOString()}. This event covers HVAC training basics.`,
|
|
EventStartDate: dateStr,
|
|
EventEndDate: dateStr,
|
|
EventStartTime: '09:00',
|
|
EventEndTime: '17:00',
|
|
'venue[Venue]': 'New Test Venue',
|
|
'venue[Address]': '789 Test St',
|
|
'venue[City]': 'Test City',
|
|
'venue[Province]': 'BC',
|
|
'venue[Country]': 'Canada',
|
|
'venue[Zip]': 'V1X 1X1',
|
|
EventOrganizerID: '0',
|
|
ticket_price: '100',
|
|
ticket_quantity: '20',
|
|
_wpnonce: formData.nonce,
|
|
...formData.hiddenInputs
|
|
};
|
|
|
|
// Try direct form submission via AJAX
|
|
const response = await request.post(stagingUrl + '/wp-admin/admin-ajax.php', {
|
|
headers: {
|
|
'Cookie': cookies.map(c => `${c.name}=${c.value}`).join('; '),
|
|
'Content-Type': 'application/x-www-form-urlencoded'
|
|
},
|
|
form: {
|
|
action: 'tribe_events_community_save',
|
|
...eventData
|
|
}
|
|
});
|
|
|
|
const responseText = await response.text();
|
|
console.log('AJAX Response:', responseText);
|
|
|
|
// If AJAX doesn't work, try direct POST to the form action
|
|
if (!response.ok || responseText.includes('error')) {
|
|
const formAction = await page.getAttribute('form', 'action') || stagingUrl + '/manage-event/';
|
|
|
|
const directResponse = await request.post(formAction, {
|
|
headers: {
|
|
'Cookie': cookies.map(c => `${c.name}=${c.value}`).join('; '),
|
|
'Content-Type': 'application/x-www-form-urlencoded'
|
|
},
|
|
form: eventData
|
|
});
|
|
|
|
console.log('Direct POST response status:', directResponse.status());
|
|
const directResponseText = await directResponse.text();
|
|
|
|
if (directResponseText.includes(uniqueTitle) || directResponseText.includes('Event submitted')) {
|
|
console.log('Event created successfully via direct POST!');
|
|
} else {
|
|
throw new Error('Event creation failed via API');
|
|
}
|
|
}
|
|
});
|
|
|
|
test('creates event via REST API', async ({ page, request }) => {
|
|
const username = 'test_trainer';
|
|
const password = 'Test123!';
|
|
|
|
// Step 1: Login to get authentication token
|
|
await page.goto(stagingUrl + '/community-login/', { waitUntil: 'domcontentloaded' });
|
|
await page.fill('input#user_login', username);
|
|
await page.fill('input#user_pass', password);
|
|
await page.getByRole('button', { name: /log in/i }).click();
|
|
await page.waitForURL(/hvac-dashboard|manage-event/, { timeout: 30000 });
|
|
|
|
// Get cookies for authentication
|
|
const cookies = await page.context().cookies();
|
|
|
|
// Try the REST API
|
|
const now = new Date();
|
|
const uniqueTitle = `HVAC Training ${now.toISOString().split('.')[0].replace(/[-T:]/g, '')}`;
|
|
const eventDate = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);
|
|
|
|
// REST API payload based on The Events Calendar documentation
|
|
const eventPayload = {
|
|
title: uniqueTitle,
|
|
description: `This is a test event created on ${now.toISOString()}. This event covers HVAC training basics.`,
|
|
start_date: eventDate.toISOString(),
|
|
end_date: eventDate.toISOString(),
|
|
venue: {
|
|
venue: 'New Test Venue',
|
|
address: '789 Test St',
|
|
city: 'Test City',
|
|
province: 'BC',
|
|
country: 'Canada',
|
|
zip: 'V1X 1X1'
|
|
}
|
|
};
|
|
|
|
try {
|
|
// Try the official TEC REST API endpoint
|
|
const response = await request.post(stagingUrl + '/wp-json/tribe/events/v1/events', {
|
|
headers: {
|
|
'Cookie': cookies.map(c => `${c.name}=${c.value}`).join('; '),
|
|
'Content-Type': 'application/json'
|
|
},
|
|
data: eventPayload
|
|
});
|
|
|
|
const responseData = await response.json();
|
|
console.log('REST API Response:', JSON.stringify(responseData, null, 2));
|
|
|
|
if (response.ok && responseData.id) {
|
|
console.log('Event created successfully via REST API!');
|
|
console.log('Event ID:', responseData.id);
|
|
} else {
|
|
console.error('REST API failed:', responseData);
|
|
}
|
|
} catch (error) {
|
|
console.error('REST API error:', error);
|
|
}
|
|
});
|
|
}); |