The beginning is here.
5. Automated Testing (Laravel)
Task 1: Write a PHPUnit test to check if the "getAverageRating" method of the "Product" model correctly calculates the average rating of a product based on its reviews.
Solution:
use Tests\TestCase; use App\Models\Product; use App\Models\Review; class ProductTest extends TestCase { public function testGetAverageRating() { $product = Product::factory()->create(); // Create reviews for the product Review::factory()->create(['product_id' => $product->id, 'rating' => 5]); Review::factory()->create(['product_id' => $product->id, 'rating' => 4]); // Calculate the expected average rating (4.5 in this case) $expectedAverage = (5 + 4) / 2; // Test the getAverageRating method $this->assertEquals($expectedAverage, $product->getAverageRating()); } }
Task 2: Write a Dusk test to check if the "Add to Cart" button is functional on the product details page.
Solution:
use Laravel\Dusk\Browser; use Tests\DuskTestCase; class ProductTest extends DuskTestCase { public function testAddToCartButton() { $this->browse(function (Browser $browser) { // Visit the product details page $browser->visit('/products/1'); // Click the "Add to Cart" button $browser->press('Add to Cart'); // Check if the product has been added to the cart $browser->assertSee('Product added to cart successfully'); }); } }
Task 3: Write a test to check if the user receives a 404 response when trying to access a non-existent product page.
Solution:
use Tests\TestCase; class ProductTest extends TestCase { public function testNonExistentProductPage() { $response = $this->get('/products/999'); // Assert that the response has a 404 status code $response->assertStatus(404); } }
6. Virtual Infrastructure Automation (Laravel)
Task 1: Set up a Laravel Forge environment and provision a new server for the application.
Solution: Laravel Forge is a tool for managing servers and deployments. The exact steps would depend on your specific server setup and configurations.
Task 2: Automate the deployment process using a deployment script or a CI/CD pipeline.
Solution: You can use tools like Laravel Envoyer or Jenkins to create a CI/CD pipeline for automated deployments.
Task 3: Implement a scheduled task using Laravel's task scheduling to perform routine maintenance tasks, like clearing cache or generating reports.
Solution: Define the scheduled task in the app/Console/Kernel.php file:
protected function schedule(Schedule $schedule) { // Clear cache every day at midnight $schedule->command('cache:clear')->dailyAt('00:00'); // Generate reports every Sunday at 3 AM $schedule->command('generate:reports')->weeklyOn(0, '03:00'); }
7. Database Schemas (Laravel)
Task 1: Design a database schema for a simple e-commerce system with tables for products, orders, customers, and reviews.
Solution:
Products table migration
// products table migration Schema::create('products', function (Blueprint $table) { $table->id(); $table->string('name'); $table->decimal('price', 8, 2); $table->timestamps(); });
Orders table migration
// orders table migration
Schema::create('orders', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('customer_id');
$table->timestamps();
$table->foreign('customer_id')->references('id')->on('customers');
});Customers table migration
// customers table migration
Schema::create('customers', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamps();
});Reviews table migration
// reviews table migration
Schema::create('reviews', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('product_id');
$table->text('comment');
$table->unsignedTinyInteger('rating');
$table->timestamps();
$table->foreign('product_id')->references('id')->on('products');
});Task 2: Create a database migration to add a "quantity" column to the "products" table.
Solution: Create a new migration file using the 'artisan' command:
php artisan make:migration add_quantity_to_products_table --table=productsUpdate the new migration file with the following code:
public function up() { Schema::table('products', function (Blueprint $table) { $table->unsignedInteger('quantity')->default(0); }); } public function down() { Schema::table('products', function (Blueprint $table) { $table->dropColumn('quantity'); }); }
Task 3: Write a database seed to populate the "products" table with sample data.
Solution: Create a new seeder file using the 'artisan' command:
php artisan make:seeder ProductSeederThen, update the new seeder file with the following code:
use Illuminate\Database\Seeder; use App\Models\Product; class ProductSeeder extends Seeder { public function run() { Product::create(['name' => 'Product 1', 'price' => 10.99, 'quantity' => 100]); Product::create(['name' => 'Product 2', 'price' => 19.99, 'quantity' => 50]); // Add more products as needed } }
Run the seed using the db:seed command:
php artisan db:seed --class=ProductSeeder
Leave a Comment