/** * @test * @return Todo $todo */ public function it_marks_an_open_todo_as_expired() { $todoId = TodoId::generate(); $userId = UserId::generate(); $deadline = TodoDeadline::fromString('yesterday'); $events = [TodoWasPosted::byUser($userId, 'Do something that will be forgotten', $todoId, TodoStatus::open()), DeadlineWasAddedToTodo::byUserToDate($todoId, $userId, $deadline)]; $todo = $this->reconstituteAggregateFromHistory(Todo::class, $events); $todo->markAsExpired(); $events = $this->popRecordedEvent($todo); $this->assertEquals(1, count($events)); $this->assertInstanceOf(TodoWasMarkedAsExpired::class, $events[0]); $expectedPayload = ['old_status' => 'open', 'new_status' => 'expired']; $this->assertEquals($expectedPayload, $events[0]->payload()); return $todo; }
/** * @param UserId $userId * @param TodoDeadline $deadline * @return void * @throws Exception\InvalidDeadline * @throws Exception\TodoNotOpen */ public function addDeadline(UserId $userId, TodoDeadline $deadline) { if (!$this->assigneeId()->sameValueAs($userId)) { throw Exception\InvalidDeadline::userIsNotAssignee($userId, $this->assigneeId()); } if ($deadline->isInThePast()) { throw Exception\InvalidDeadline::deadlineInThePast($deadline); } if ($this->status->isDone()) { throw Exception\TodoNotOpen::triedToAddDeadline($deadline, $this->status); } $this->recordThat(DeadlineWasAddedToTodo::byUserToDate($this->todoId, $this->assigneeId, $deadline)); }