factory()->for($this->user)->create(); } /** * @doesNotPerformAssertions */ public function testCanViewInstance(): void { $this->setName('can *not* view instance'); // Journal entries are not independently viewable. } /** * @doesNotPerformAssertions */ public function testCanEditInstance(): void { $this->setName('can *not* edit instance'); // Journal entries are not editable. } public function testCanAddInstance(): void { $create_url = action([$this->class(), 'createFromNutrients']); $response = $this->get($create_url); $response->assertOk(); $instance = $this->factory()->make(); $store_url = action([$this->class(), 'storeFromNutrients']); $response = $this->post($store_url, $instance->toArray()); $response->assertSessionHasNoErrors(); } public function testCanAddInstanceFromIngredientsGrouped(): void { $create_url = action([$this->class(), 'create']); $response = $this->get($create_url); $response->assertOk(); $data = $this->createIngredientsDataArray(); $store_url = action([$this->class(), 'store']); $response = $this->post($store_url, $data); $response->assertSessionHasNoErrors(); } public function testCanAddInstanceFromIngredientsUnGrouped(): void { $data = $this->createIngredientsDataArray(); $data['group_entries'] = false; $store_url = action([$this->class(), 'store']); $response = $this->post($store_url, $data); $response->assertSessionHasNoErrors(); } public function testSessionKeepsOldInput(): void { $data = $this->createIngredientsDataArray(); // Set first amount to an invalid string. $data['ingredients']['amount'][0] = 'abcd'; $create_url = action([$this->class(), 'create']); $store_url = action([$this->class(), 'store']); $response = $this->from($create_url)->post($store_url, $data); $response->assertRedirect($create_url); $response->assertSessionHasErrors(); $response->assertSessionHasInput('ingredients', $data['ingredients']); $this->followingRedirects() ->from($create_url) ->post($store_url, $data); $this->assertEquals($create_url, url()->current()); } /** * Create a test array for creating an entry from ingredients data. */ private function createIngredientsDataArray(): array { // Create ingredients based on ingredient amounts. $ingredients = [ 'date' => [], 'meal' => [], 'amount' => [], 'unit' => [], 'id' => [], 'type' => [], ]; $ingredient_amounts = IngredientAmount::factory() ->count(10) ->make(['parent_id' => null, 'parent_type' => null]); /** @var \App\Models\IngredientAmount $ingredient_amount */ foreach ($ingredient_amounts as $ingredient_amount) { $ingredients['date'][] = $this->faker->dateTimeThisMonth->format('Y-m-d'); $ingredients['meal'][] = $this->user->meals_enabled->pluck('value')->random(); $ingredients['name'][] = $ingredient_amount->ingredient->name; $ingredients['amount'][] = $ingredient_amount->amount; $ingredients['unit'][] = $ingredient_amount->unit; $ingredients['id'][] = $ingredient_amount->ingredient->id; $ingredients['type'][] = $ingredient_amount->ingredient->type; } return ['ingredients' => $ingredients, 'group_entries' => true]; } }