|
2 | 2 |
|
3 | 3 | namespace PhpSchool\PhpWorkshopTest\Factory;
|
4 | 4 |
|
| 5 | +use PhpSchool\CliMenu\MenuItem\SelectableItem; |
| 6 | +use PhpSchool\PhpWorkshop\Event\EventInterface; |
5 | 7 | use Psr\Container\ContainerInterface;
|
6 | 8 | use PhpSchool\CliMenu\CliMenu;
|
7 | 9 | use PhpSchool\PhpWorkshop\Command\CreditsCommand;
|
@@ -68,6 +70,84 @@ public function testFactoryReturnsInstance(): void
|
68 | 70 |
|
69 | 71 |
|
70 | 72 | $factory = new MenuFactory();
|
71 |
| - $this->assertInstanceOf(CliMenu::class, $factory($container)); |
| 73 | + |
| 74 | + $factory($container); |
| 75 | + } |
| 76 | + |
| 77 | + public function testSelectExercise(): void |
| 78 | + { |
| 79 | + $container = $this->createMock(ContainerInterface::class); |
| 80 | + $userStateSerializer = $this->createMock(UserStateSerializer::class); |
| 81 | + $userStateSerializer |
| 82 | + ->expects($this->once()) |
| 83 | + ->method('deSerialize') |
| 84 | + ->willReturn(new UserState()); |
| 85 | + |
| 86 | + $exerciseRepository = $this->createMock(ExerciseRepository::class); |
| 87 | + $exercise = $this->createMock(ExerciseInterface::class); |
| 88 | + $exercise |
| 89 | + ->method('getName') |
| 90 | + ->willReturn('Exercise'); |
| 91 | + $exerciseRepository |
| 92 | + ->expects($this->once()) |
| 93 | + ->method('findAll') |
| 94 | + ->willReturn([$exercise]); |
| 95 | + |
| 96 | + $terminal = $this->createMock(Terminal::class); |
| 97 | + $terminal |
| 98 | + ->method('getWidth') |
| 99 | + ->willReturn(70); |
| 100 | + |
| 101 | + $eventDispatcher = $this->createMock(EventDispatcher::class); |
| 102 | + $eventDispatcher |
| 103 | + ->expects(self::exactly(2)) |
| 104 | + ->method('dispatch') |
| 105 | + ->withConsecutive( |
| 106 | + [ |
| 107 | + self::callback(function ($event) { |
| 108 | + return $event instanceof EventInterface && $event->getName() === 'exercise.selected'; |
| 109 | + }) |
| 110 | + ], |
| 111 | + [ |
| 112 | + self::callback(function ($event) { |
| 113 | + return $event instanceof EventInterface && $event->getName() === 'exercise.selected.exercise'; |
| 114 | + }) |
| 115 | + ] |
| 116 | + ); |
| 117 | + |
| 118 | + $exerciseRenderer = $this->createMock(ExerciseRenderer::class); |
| 119 | + $exerciseRenderer->expects(self::once()) |
| 120 | + ->method('__invoke') |
| 121 | + ->with(self::isInstanceOf(CliMenu::class)); |
| 122 | + |
| 123 | + $services = [ |
| 124 | + UserStateSerializer::class => $userStateSerializer, |
| 125 | + ExerciseRepository::class => $exerciseRepository, |
| 126 | + ExerciseRenderer::class => $exerciseRenderer, |
| 127 | + HelpCommand::class => $this->createMock(HelpCommand::class), |
| 128 | + CreditsCommand::class => $this->createMock(CreditsCommand::class), |
| 129 | + ResetProgress::class => $this->createMock(ResetProgress::class), |
| 130 | + 'workshopLogo' => 'LOGO', |
| 131 | + 'bgColour' => 'black', |
| 132 | + 'fgColour' => 'green', |
| 133 | + 'workshopTitle' => 'TITLE', |
| 134 | + WorkshopType::class => WorkshopType::STANDARD(), |
| 135 | + EventDispatcher::class => $eventDispatcher, |
| 136 | + Terminal::class => $terminal |
| 137 | + ]; |
| 138 | + |
| 139 | + $container |
| 140 | + ->method('get') |
| 141 | + ->willReturnCallback(function ($name) use ($services) { |
| 142 | + return $services[$name]; |
| 143 | + }); |
| 144 | + |
| 145 | + |
| 146 | + $factory = new MenuFactory(); |
| 147 | + |
| 148 | + $menu = $factory($container); |
| 149 | + |
| 150 | + $firstExercise = $menu->getItemByIndex(6); |
| 151 | + $menu->executeAsSelected($firstExercise); |
72 | 152 | }
|
73 | 153 | }
|
0 commit comments