dwinzo-sdet/tests/Builder2D/Assets.spec.js

168 lines
6.1 KiB
JavaScript

import { test, expect } from '@playwright/test';
// Forklift coordinates
const forkliftCoordinates = [
{ x: 206, y: 250 },
{ x: 206, y: 281 },
{ x: 200, y: 307 },
{ x: 257, y: 251 },
{ x: 260, y: 277 },
{ x: 255, y: 304 },
];
// AGV coordinates
const agvCoordinates = [
{ x: 309, y: 325 },
{ x: 454, y: 287 },
{ x: 608, y: 282 },
{ x: 305, y: 417 },
{ x: 455, y: 424 },
{ x: 640, y: 173 },
{ x: 875, y: 227 },
{ x: 1059, y: 349 },
{ x: 977, y: 490 },
{ x: 1155, y: 492 },
];
/**
* Common setup function for logging in and switching to full-screen mode.
*/
async function loginAndSetup(page) {
await page.goto('http://185.100.212.76:8200');
await page.getByPlaceholder('Email').fill('ramkumar@testdomin.local');
await page.getByPlaceholder('Password').fill('123456');
await page.getByRole('button', { name: 'Continue', exact: true }).click();
console.log('Switching to full-screen mode...');
await page.keyboard.press('F11'); // Simulate pressing F11 to enter full-screen mode
}
/**
* Common function to move the canvas.
*/
async function moveCanvas(page) {
console.log('Moving canvas to the top position...');
const canvas = page.locator('canvas').first();
const canvasBox = await canvas.boundingBox();
if (!canvasBox) {
throw new Error('Canvas bounding box not found. Ensure the canvas is visible.');
}
const startX = canvasBox.x + canvasBox.width / 2;
const startY = canvasBox.y + canvasBox.height / 2;
await page.mouse.move(startX, startY);
await page.mouse.down();
await page.mouse.move(startX, startY + 100, { steps: 20 });
await page.mouse.wheel(0, 500); // Scroll down 500px
await page.mouse.up();
}
/**
* Function to place an asset on the canvas using simulated drag-and-drop.
* @param {Object} page - Playwright page object
* @param {String} assetSelector - Selector for the asset to select (e.g., '#forklift', '#agv')
* @param {Array} coordinates - Array of {x, y} objects representing drop positions
*/
async function placeAssetOnCanvas(page, assetSelector, coordinates) {
console.log(`Placing asset ${assetSelector} on canvas...`);
// Step 1: Select the "Vehicles" category
console.log('Waiting for #Vehicles to be visible...');
await page.waitForSelector('#Vehicles', { state: 'visible' }); // Wait for the element to be visible
await page.locator('#Vehicles').click();
// Step 2: Locate the asset
const asset = page.locator(assetSelector);
// Step 3: Place the asset at the specified coordinates
for (const { x, y } of coordinates) {
console.log(`Placing asset at (${x}, ${y})`);
const target = page.locator('canvas'); // Target the canvas
// Get bounding boxes for the asset and canvas
const assetBox = await asset.boundingBox();
const canvasBox = await target.boundingBox();
if (!assetBox || !canvasBox) {
throw new Error('Asset or canvas bounding box not found.');
}
// Calculate relative positions
const assetCenterX = assetBox.x + assetBox.width / 2;
const assetCenterY = assetBox.y + assetBox.height / 2;
// Simulate drag-and-drop manually
await page.mouse.move(assetCenterX, assetCenterY); // Move to the asset
await page.mouse.down(); // Press the left mouse button
await page.mouse.move(canvasBox.x + x, canvasBox.y + y, { steps: 50 }); // Move to the target on the canvas
await page.mouse.up(); // Release the left mouse button
// Trigger custom drag-and-drop events
await page.evaluate(
({ assetSelector, targetSelector, x, y }) => {
const asset = document.querySelector(assetSelector);
const target = document.querySelector(targetSelector);
// Trigger drag-and-drop events
const dragStartEvent = new Event('dragstart', { bubbles: true });
asset.dispatchEvent(dragStartEvent);
const dragOverEvent = new Event('dragover', { bubbles: true });
target.dispatchEvent(dragOverEvent);
const dropEvent = new Event('drop', { bubbles: true });
target.dispatchEvent(dropEvent);
},
{ assetSelector, targetSelector: 'canvas', x, y } // Wrap arguments in an object
);
// Add a small delay between placements
await page.waitForTimeout(500);
}
}
/**
* Main test case for adding Forklift and AGV assets.
*/
test('Add Forklift and AGV assets to the canvas', async ({ page }) => {
test.setTimeout(120000); // Set timeout to 2 minutes
// Step 1: Login and setup
await loginAndSetup(page);
// Step 2: Switch to 2D mode
console.log('Switching to 2D mode...');
await page.locator('.toggle-option:has-text("2d")').click();
// Step 3: Move the canvas to the desired position
await moveCanvas(page);
// Step 4: Click the toggle sidebar button
console.log('Toggling sidebar...');
await page.locator(".toggle-sidebar-ui-button.active").click();
await page.waitForTimeout(2000); // Wait for the sidebar to toggle
// Step 5: Open the "Assets" tab
console.log('Opening the Assets tab...');
await page.getByText('Assets').click();
// Step 6: Add Forklift assets
console.log('Adding Forklift assets...');
await placeAssetOnCanvas(page, '#forklift', forkliftCoordinates);
// Step 7: Add AGV assets
console.log('Adding AGV assets...');
await placeAssetOnCanvas(page, '#agv', agvCoordinates);
// Step 8: Take a final screenshot
console.log('Taking a final screenshot...');
await page.screenshot({ path: 'assets-added.png' });
// Step 9: Add assertions to verify assets are placed
console.log('Verifying assets are placed on the canvas...');
const forkliftCount = await page.locator('.forklift-asset').count(); // Replace with the actual selector for forklifts
const agvCount = await page.locator('.agv-asset').count(); // Replace with the actual selector for AGVs
expect(forkliftCount).toBeGreaterThan(0, 'No forklift assets were placed on the canvas.');
expect(agvCount).toBeGreaterThan(0, 'No AGV assets were placed on the canvas.');
console.log('Assertions passed: Assets are successfully placed on the canvas.');
});