- Added TaskDialog component with functionality to create and edit tasks. - Integrated form validation and error handling for task inputs. - Implemented step management within tasks, including adding and deleting steps. - Styled TaskDialog with CSS for improved user experience. feat: Create SmartPackagesRoutes for navigation and routing - Established routing for smart packages, including create and edit functionalities. - Added loading state management for better user feedback during data fetching. - Integrated SmartPackagesMenu for navigation within the smart packages section. feat: Add utility functions for formatting data - Implemented formatting utilities for currency, time, date, and percentages. - Ensured consistent formatting across the application for better readability. chore: Update database schema for smart packages - Extended material_packages table with new fields for estimated hours, hourly rate, and difficulty level. - Created smart_package_tasks and smart_package_steps tables for task management. - Added foreign key relationships and indexes for improved database performance. test: Add API tests for smart packages functionality - Created test suite for validating smart packages API endpoints. - Included tests for CRUD operations on smart packages and retrieval of categories and types.
115 lines
4.1 KiB
JavaScript
115 lines
4.1 KiB
JavaScript
const axios = require('axios');
|
|
|
|
// Konfiguration
|
|
const API_BASE_URL = process.env.API_URL || 'http://127.0.0.1:4032/api';
|
|
|
|
/**
|
|
* Smart Pakker API Test
|
|
*
|
|
* Denne test kontrollerer at Smart Pakker API endepunkterne fungerer korrekt
|
|
*/
|
|
async function testSmartPackagesAPI() {
|
|
console.log('🧪 SMART PAKKER API TEST');
|
|
console.log('=========================');
|
|
|
|
try {
|
|
// Test GET /api/smart-packages
|
|
console.log('\n📋 Test: Henter alle smart pakker');
|
|
const allPackages = await axios.get(`${API_BASE_URL}/smart-packages`);
|
|
console.log(`✅ Status: ${allPackages.status}`);
|
|
console.log(`✅ Pakker fundet: ${allPackages.data.packages?.length || 0}`);
|
|
|
|
// Opret test pakke
|
|
console.log('\n📦 Test: Opretter ny smart pakke');
|
|
const newPackageData = {
|
|
name: 'Test Smart Pakke',
|
|
description: 'Dette er en test pakke',
|
|
category: 'tag',
|
|
package_type: 'standard',
|
|
difficulty_level: 2,
|
|
estimated_hours: 10,
|
|
hourly_rate: 580,
|
|
installation_notes: 'Test installation noter',
|
|
is_template: false,
|
|
materials: [],
|
|
tasks: [
|
|
{
|
|
name: 'Test opgave 1',
|
|
description: 'Testbeskrivelse af opgave 1',
|
|
hours: 2.5,
|
|
rate: 580,
|
|
task_order: 1
|
|
}
|
|
],
|
|
created_by: 'test-script'
|
|
};
|
|
|
|
let createdPackage;
|
|
try {
|
|
createdPackage = await axios.post(`${API_BASE_URL}/smart-packages`, newPackageData);
|
|
console.log(`✅ Status: ${createdPackage.status}`);
|
|
console.log(`✅ Oprettet pakke ID: ${createdPackage.data.packageId}`);
|
|
|
|
// Hent detaljer om den oprettede pakke
|
|
console.log(`\n🔍 Test: Henter detaljer for pakke ID ${createdPackage.data.packageId}`);
|
|
const packageDetails = await axios.get(`${API_BASE_URL}/smart-packages/${createdPackage.data.packageId}`);
|
|
console.log(`✅ Status: ${packageDetails.status}`);
|
|
console.log(`✅ Pakke navn: ${packageDetails.data.package.name}`);
|
|
console.log(`✅ Antal opgaver: ${packageDetails.data.tasks?.length || 0}`);
|
|
|
|
// Opdater pakken
|
|
console.log(`\n✏️ Test: Opdaterer pakke ID ${createdPackage.data.packageId}`);
|
|
const updateResponse = await axios.put(
|
|
`${API_BASE_URL}/smart-packages/${createdPackage.data.packageId}`,
|
|
{
|
|
...newPackageData,
|
|
name: 'Test Smart Pakke (Opdateret)',
|
|
estimated_hours: 12
|
|
}
|
|
);
|
|
console.log(`✅ Status: ${updateResponse.status}`);
|
|
|
|
// Slet test pakken
|
|
console.log(`\n🗑️ Test: Sletter pakke ID ${createdPackage.data.packageId}`);
|
|
const deleteResponse = await axios.delete(`${API_BASE_URL}/smart-packages/${createdPackage.data.packageId}`);
|
|
console.log(`✅ Status: ${deleteResponse.status}`);
|
|
|
|
} catch (error) {
|
|
console.error('❌ Fejl i test af CRUD operationer:', error.message);
|
|
if (error.response) {
|
|
console.error('Fejlrespons data:', error.response.data);
|
|
}
|
|
}
|
|
|
|
// Test kategorier og pakketyper
|
|
console.log('\n📊 Test: Henter Smart Pakke kategorier');
|
|
try {
|
|
const categories = await axios.get(`${API_BASE_URL}/smart-packages/categories`);
|
|
console.log(`✅ Status: ${categories.status}`);
|
|
console.log(`✅ Antal kategorier: ${categories.data.categories?.length || 0}`);
|
|
} catch (error) {
|
|
console.error('❌ Fejl ved hentning af kategorier:', error.message);
|
|
}
|
|
|
|
console.log('\n📊 Test: Henter Smart Pakke typer');
|
|
try {
|
|
const types = await axios.get(`${API_BASE_URL}/smart-packages/types`);
|
|
console.log(`✅ Status: ${types.status}`);
|
|
console.log(`✅ Antal typer: ${types.data.types?.length || 0}`);
|
|
} catch (error) {
|
|
console.error('❌ Fejl ved hentning af pakketyper:', error.message);
|
|
}
|
|
|
|
console.log('\n✅ SMART PAKKER API TEST AFSLUTTET');
|
|
|
|
} catch (error) {
|
|
console.error('❌ Generel fejl i Smart Pakker API test:', error.message);
|
|
if (error.response) {
|
|
console.error('Status:', error.response.status);
|
|
console.error('Data:', error.response.data);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Kør testen
|
|
testSmartPackagesAPI(); |