/** * @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)); }
/** * @return TodoDeadline */ public function deadline() { if (!$this->deadline) { $this->deadline = TodoDeadline::fromString($this->payload['deadline']); } return $this->deadline; }
/** * @test * @dataProvider getDeadlines */ public function it_correctly_validates_the_deadline($deadline, $inThePast) { $deadline = TodoDeadline::fromString($deadline); $deadlineInThePast = $deadline->isInThePast(); if ($inThePast) { $this->assertTrue($deadlineInThePast); } else { $this->assertFalse($deadlineInThePast); } }
/** * @test * @return Todo $todo * @depends it_marks_an_open_todo_as_expired */ public function it_unmarks_an_expired_todo_when_deadline_is_added(Todo $todo) { $userId = $todo->assigneeId(); $deadline = TodoDeadline::fromString('1 day'); $todo->addDeadline($userId, $deadline); $events = $this->popRecordedEvent($todo); $this->assertEquals(2, count($events)); $this->assertInstanceOf(TodoWasUnmarkedAsExpired::class, $events[1]); return $todo; }
/** * @test * @expectedException \Prooph\ProophessorDo\Model\Todo\Exception\TodoNotOpen * @depends it_adds_a_deadline_to_todo */ public function it_throws_an_exception_if_todo_is_closed(Todo $todo) { $todo->markAsDone(); $todo->addDeadline($todo->assigneeId(), TodoDeadline::fromString('2047-12-11 12:00:00')); }
/** * @param TodoDeadline $deadline * @param TodoStatus $status * @return TodoNotOpen */ public static function triedToAddDeadline(TodoDeadline $deadline, TodoStatus $status) { return new self(sprintf('Tried to deadline %s to a todo with status %s.', $deadline->toString(), $status->toString())); }
public static function deadlineInThePast(TodoDeadline $deadline) { return new self(sprintf('Provided deadline %s is in the past from %s', $deadline->toString(), $deadline->createdOn())); }
/** * @return TodoDeadline */ public function deadline() { return TodoDeadline::fromString($this->payload['deadline']); }
/** * @param TodoStatus $status * @param Todo $todo * @return TodoNotExpired */ public static function withDeadline(TodoDeadline $deadline, Todo $todo) { return new self(sprintf('Tried to mark a non-expired Todo as expired. Todo will expire after the deadline %s.', $deadline->toString())); }