upskill-event-manager/test-trainer-events.js
Ben 3d1fbaa770 fix: Resolve trainer event edit permissions and initial styling
- Fixed permission check in canUserEditEvent() method to properly check user roles
- Changed from checking non-existent 'hvac_trainer' capability to in_array('hvac_trainer', $user->roles)
- Trainers can now create new events and edit their own events
- Security maintained: trainers cannot edit others' events
- Added initial CSS file to fix narrow width and navigation z-index issues
- Page now displays at proper 1200px max width matching other trainer pages
- Navigation menu no longer hidden under site header (z-index: 100)

🤖 Generated with Claude Code (https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-18 20:19:50 -03:00

175 lines
No EOL
6.6 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Test to find events owned by test_trainer
*/
const { chromium } = require('playwright');
async function testTrainerEvents() {
console.log('🔍 Finding test_trainer events...\n');
const browser = await chromium.launch({
headless: false,
args: ['--disable-dev-shm-usage', '--no-sandbox']
});
const context = await browser.newContext({
viewport: { width: 1280, height: 720 }
});
const page = await context.newPage();
const baseUrl = 'https://upskill-staging.measurequick.com';
try {
// Login as test_trainer
console.log('1⃣ Logging in...');
await page.goto(`${baseUrl}/training-login/`);
await page.waitForLoadState('networkidle');
await page.fill('input[name="log"]', 'test_trainer');
await page.fill('input[name="pwd"]', 'TestTrainer123!');
await page.press('input[name="pwd"]', 'Enter');
await page.waitForURL('**/trainer/dashboard/**', { timeout: 10000 });
console.log('✅ Login successful');
// Go to event manage page to see what events are available
console.log('\n2⃣ Checking trainer events...');
await page.goto(`${baseUrl}/trainer/event/manage/`);
await page.waitForLoadState('networkidle');
const eventsInfo = await page.evaluate(() => {
// Look for event links or IDs in the page
const links = Array.from(document.querySelectorAll('a')).filter(link =>
link.href.includes('event') && (link.href.includes('edit') || link.href.includes('id='))
);
const eventIds = [];
links.forEach(link => {
const match = link.href.match(/[\?&]event_id=(\d+)/);
if (match) {
eventIds.push({
id: match[1],
text: link.textContent.trim(),
href: link.href
});
}
});
// Also check the page content for any event information
const pageText = document.body.innerText;
const hasEvents = pageText.includes('event') || pageText.includes('Event');
return {
eventIds,
hasEvents,
pageSnippet: pageText.substring(0, 500)
};
});
console.log(' Found event IDs:', eventsInfo.eventIds);
console.log(' Page has event content:', eventsInfo.hasEvents);
console.log(' Page content preview:');
console.log(' ' + eventsInfo.pageSnippet.replace(/\n/g, '\n '));
// Test a specific valid event ID if found
if (eventsInfo.eventIds.length > 0) {
const firstEventId = eventsInfo.eventIds[0].id;
console.log(`\n3⃣ Testing edit access for event ${firstEventId}...`);
await page.goto(`${baseUrl}/trainer/event/edit/?event_id=${firstEventId}`);
await page.waitForLoadState('networkidle');
const editResult = await page.evaluate(() => {
const title = document.title;
const hasError = title.includes('Error') || document.body.innerText.includes('permission');
const hasForm = document.querySelector('input[name="post_title"]') !== null;
return { title, hasError, hasForm };
});
console.log(` Title: ${editResult.title}`);
console.log(` Has error: ${editResult.hasError}`);
console.log(` Has edit form: ${editResult.hasForm}`);
if (editResult.hasForm) {
console.log(' ✅ Can edit this event');
} else if (editResult.hasError) {
console.log(' ❌ Permission denied for this event');
}
} else {
console.log('\n❌ No events found for test_trainer');
}
// Test creating a new event first, then editing it
console.log('\n4⃣ Testing create-then-edit workflow...');
await page.goto(`${baseUrl}/trainer/event/edit/`);
await page.waitForLoadState('networkidle');
// Fill out a minimal event form
await page.fill('input[name="post_title"]', 'Test Event for Edit');
await page.fill('textarea[name="post_content"]', 'This is a test event');
// Submit the form
await page.click('input[type="submit"], button[type="submit"]');
await page.waitForLoadState('networkidle');
const createResult = await page.evaluate(() => {
const currentUrl = window.location.href;
const eventIdMatch = currentUrl.match(/[\?&]event_id=(\d+)/);
return {
currentUrl,
eventId: eventIdMatch ? eventIdMatch[1] : null
};
});
if (createResult.eventId) {
console.log(` ✅ Created new event: ${createResult.eventId}`);
console.log(` Now testing edit access...`);
// The page should already be showing the edit form for the new event
const finalEditTest = await page.evaluate(() => {
const hasForm = document.querySelector('input[name="post_title"]') !== null;
const title = document.title;
return { hasForm, title };
});
console.log(` Edit form available: ${finalEditTest.hasForm}`);
console.log(` Page title: ${finalEditTest.title}`);
if (finalEditTest.hasForm) {
console.log(' ✅ SUCCESS: Create-then-edit workflow works!');
}
} else {
console.log(' ❌ Event creation failed');
}
await page.screenshot({
path: `trainer-events-${Date.now()}.png`,
fullPage: true
});
console.log('\n📸 Screenshot saved');
} catch (error) {
console.error('\n❌ Test failed:', error.message);
await page.screenshot({
path: `error-trainer-events-${Date.now()}.png`,
fullPage: true
});
} finally {
console.log('\n⏸ Keeping browser open for inspection...');
await page.waitForTimeout(10000);
await browser.close();
}
}
// Run test
testTrainerEvents()
.then(() => {
console.log('\n✨ Test completed!');
process.exit(0);
})
.catch(error => {
console.error('\n💥 Test failed:', error);
process.exit(1);
});