Compare commits
4 Commits
f61eea9169
...
df0dd98d7c
Author | SHA1 | Date |
---|---|---|
Marcel Kapfer | df0dd98d7c | |
Marcel Kapfer | 0bdffbeb27 | |
Marcel Kapfer | 2358ad70cc | |
Marcel Kapfer | 77cd8f62c9 |
|
@ -1 +1,2 @@
|
|||
vendor/
|
||||
/.phpunit.result.cache
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/todo-list.iml" filepath="$PROJECT_DIR$/.idea/todo-list.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="PhpTestFrameworkVersionCache">
|
||||
<tools_cache>
|
||||
<tool tool_name="PHPUnit">
|
||||
<cache>
|
||||
<versions>
|
||||
<info id="interpreter-cc25df52-c356-4ba0-a7e8-8584ab3c0c28" version="9.5.9" />
|
||||
</versions>
|
||||
</cache>
|
||||
</tool>
|
||||
</tools_cache>
|
||||
</component>
|
||||
</project>
|
|
@ -0,0 +1,116 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="PhpIncludePathManager">
|
||||
<include_path>
|
||||
<path value="$PROJECT_DIR$/vendor/phpunit/php-timer" />
|
||||
<path value="$PROJECT_DIR$/vendor/phpunit/phpunit" />
|
||||
<path value="$PROJECT_DIR$/vendor/phpunit/php-text-template" />
|
||||
<path value="$PROJECT_DIR$/vendor/phpunit/php-invoker" />
|
||||
<path value="$PROJECT_DIR$/vendor/phpunit/php-file-iterator" />
|
||||
<path value="$PROJECT_DIR$/vendor/myclabs/deep-copy" />
|
||||
<path value="$PROJECT_DIR$/vendor/phpunit/php-code-coverage" />
|
||||
<path value="$PROJECT_DIR$/vendor/webmozart/assert" />
|
||||
<path value="$PROJECT_DIR$/vendor/phpspec/prophecy" />
|
||||
<path value="$PROJECT_DIR$/vendor/nikic/php-parser" />
|
||||
<path value="$PROJECT_DIR$/vendor/symfony/polyfill-ctype" />
|
||||
<path value="$PROJECT_DIR$/vendor/sebastian/type" />
|
||||
<path value="$PROJECT_DIR$/vendor/sebastian/diff" />
|
||||
<path value="$PROJECT_DIR$/vendor/phpdocumentor/reflection-docblock" />
|
||||
<path value="$PROJECT_DIR$/vendor/sebastian/lines-of-code" />
|
||||
<path value="$PROJECT_DIR$/vendor/phpdocumentor/type-resolver" />
|
||||
<path value="$PROJECT_DIR$/vendor/sebastian/object-enumerator" />
|
||||
<path value="$PROJECT_DIR$/vendor/phpdocumentor/reflection-common" />
|
||||
<path value="$PROJECT_DIR$/vendor/sebastian/comparator" />
|
||||
<path value="$PROJECT_DIR$/vendor/sebastian/code-unit" />
|
||||
<path value="$PROJECT_DIR$/vendor/sebastian/cli-parser" />
|
||||
<path value="$PROJECT_DIR$/vendor/theseer/tokenizer" />
|
||||
<path value="$PROJECT_DIR$/vendor/sebastian/exporter" />
|
||||
<path value="$PROJECT_DIR$/vendor/sebastian/version" />
|
||||
<path value="$PROJECT_DIR$/vendor/composer" />
|
||||
<path value="$PROJECT_DIR$/vendor/sebastian/complexity" />
|
||||
<path value="$PROJECT_DIR$/vendor/sebastian/recursion-context" />
|
||||
<path value="$PROJECT_DIR$/vendor/sebastian/resource-operations" />
|
||||
<path value="$PROJECT_DIR$/vendor/sebastian/code-unit-reverse-lookup" />
|
||||
<path value="$PROJECT_DIR$/vendor/sebastian/global-state" />
|
||||
<path value="$PROJECT_DIR$/vendor/sebastian/environment" />
|
||||
<path value="$PROJECT_DIR$/vendor/sebastian/object-reflector" />
|
||||
<path value="$PROJECT_DIR$/vendor/phar-io/version" />
|
||||
<path value="$PROJECT_DIR$/vendor/phar-io/manifest" />
|
||||
<path value="$PROJECT_DIR$/vendor/doctrine/instantiator" />
|
||||
</include_path>
|
||||
</component>
|
||||
<component name="PhpInterpreters">
|
||||
<interpreters>
|
||||
<interpreter id="cc25df52-c356-4ba0-a7e8-8584ab3c0c28" name="Debian" home="\\wsl$\Debian/usr/bin/php" debugger_id="php.debugger.XDebug">
|
||||
<remote_data INTERPRETER_PATH="/usr/bin/php" HELPERS_PATH="" INITIALIZED="false" VALID="true" RUN_AS_ROOT_VIA_SUDO="false" DISTRIBUTION_ID="Debian" />
|
||||
</interpreter>
|
||||
</interpreters>
|
||||
</component>
|
||||
<component name="PhpInterpretersPhpInfoCache">
|
||||
<phpInfoCache>
|
||||
<interpreter name="Debian">
|
||||
<phpinfo binary_type="PHP" php_cli="/usr/bin/php7.4" path_separator=":" remote_host="172.24.192.1" version="7.4.21">
|
||||
<additional_php_ini>/etc/php/7.4/cli/conf.d/10-opcache.ini, /etc/php/7.4/cli/conf.d/10-pdo.ini, /etc/php/7.4/cli/conf.d/15-xml.ini, /etc/php/7.4/cli/conf.d/20-calendar.ini, /etc/php/7.4/cli/conf.d/20-ctype.ini, /etc/php/7.4/cli/conf.d/20-curl.ini, /etc/php/7.4/cli/conf.d/20-dom.ini, /etc/php/7.4/cli/conf.d/20-exif.ini, /etc/php/7.4/cli/conf.d/20-ffi.ini, /etc/php/7.4/cli/conf.d/20-fileinfo.ini, /etc/php/7.4/cli/conf.d/20-ftp.ini, /etc/php/7.4/cli/conf.d/20-gettext.ini, /etc/php/7.4/cli/conf.d/20-iconv.ini, /etc/php/7.4/cli/conf.d/20-json.ini, /etc/php/7.4/cli/conf.d/20-mbstring.ini, /etc/php/7.4/cli/conf.d/20-phar.ini, /etc/php/7.4/cli/conf.d/20-posix.ini, /etc/php/7.4/cli/conf.d/20-readline.ini, /etc/php/7.4/cli/conf.d/20-shmop.ini, /etc/php/7.4/cli/conf.d/20-simplexml.ini, /etc/php/7.4/cli/conf.d/20-sockets.ini, /etc/php/7.4/cli/conf.d/20-sysvmsg.ini, /etc/php/7.4/cli/conf.d/20-sysvsem.ini, /etc/php/7.4/cli/conf.d/20-sysvshm.ini, /etc/php/7.4/cli/conf.d/20-tokenizer.ini, /etc/php/7.4/cli/conf.d/20-xmlreader.ini, /etc/php/7.4/cli/conf.d/20-xmlwriter.ini, /etc/php/7.4/cli/conf.d/20-xsl.ini, /etc/php/7.4/cli/conf.d/20-zip.ini</additional_php_ini>
|
||||
<configuration_file>/etc/php/7.4/cli/php.ini</configuration_file>
|
||||
<configuration_options>
|
||||
<configuration_option name="include_path" value=".:/usr/share/php" />
|
||||
</configuration_options>
|
||||
<debuggers />
|
||||
<loaded_extensions>
|
||||
<extension name="Core" />
|
||||
<extension name="FFI" />
|
||||
<extension name="PDO" />
|
||||
<extension name="Phar" />
|
||||
<extension name="Reflection" />
|
||||
<extension name="SPL" />
|
||||
<extension name="SimpleXML" />
|
||||
<extension name="Zend OPcache" />
|
||||
<extension name="calendar" />
|
||||
<extension name="ctype" />
|
||||
<extension name="curl" />
|
||||
<extension name="date" />
|
||||
<extension name="dom" />
|
||||
<extension name="exif" />
|
||||
<extension name="fileinfo" />
|
||||
<extension name="filter" />
|
||||
<extension name="ftp" />
|
||||
<extension name="gettext" />
|
||||
<extension name="hash" />
|
||||
<extension name="iconv" />
|
||||
<extension name="json" />
|
||||
<extension name="libxml" />
|
||||
<extension name="mbstring" />
|
||||
<extension name="openssl" />
|
||||
<extension name="pcntl" />
|
||||
<extension name="pcre" />
|
||||
<extension name="posix" />
|
||||
<extension name="readline" />
|
||||
<extension name="session" />
|
||||
<extension name="shmop" />
|
||||
<extension name="sockets" />
|
||||
<extension name="sodium" />
|
||||
<extension name="standard" />
|
||||
<extension name="sysvmsg" />
|
||||
<extension name="sysvsem" />
|
||||
<extension name="sysvshm" />
|
||||
<extension name="tokenizer" />
|
||||
<extension name="xml" />
|
||||
<extension name="xmlreader" />
|
||||
<extension name="xmlwriter" />
|
||||
<extension name="xsl" />
|
||||
<extension name="zip" />
|
||||
<extension name="zlib" />
|
||||
</loaded_extensions>
|
||||
</phpinfo>
|
||||
</interpreter>
|
||||
</phpInfoCache>
|
||||
</component>
|
||||
<component name="PhpProjectSharedConfiguration" php_language_level="8.0">
|
||||
<option name="suggestChangeDefaultLanguageLevel" value="false" />
|
||||
</component>
|
||||
<component name="PhpUnit">
|
||||
<phpunit_settings>
|
||||
<PhpUnitSettings custom_loader_path="$PROJECT_DIR$/vendor/autoload.php" />
|
||||
</phpunit_settings>
|
||||
</component>
|
||||
</project>
|
|
@ -0,0 +1,47 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="WEB_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/spec" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" packagePrefix="MMK2410\MyTodoList\" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-timer" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/phpunit" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-text-template" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-invoker" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-file-iterator" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/myclabs/deep-copy" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-code-coverage" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/webmozart/assert" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpspec/prophecy" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/nikic/php-parser" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-ctype" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/type" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/diff" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpdocumentor/reflection-docblock" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/lines-of-code" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpdocumentor/type-resolver" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/object-enumerator" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpdocumentor/reflection-common" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/comparator" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/code-unit" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/cli-parser" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/theseer/tokenizer" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/exporter" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/version" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/composer" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/complexity" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/recursion-context" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/resource-operations" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/code-unit-reverse-lookup" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/global-state" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/environment" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/object-reflector" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phar-io/version" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phar-io/manifest" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/instantiator" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
|
@ -1,33 +0,0 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace MMK2410\MyTodoList;
|
||||
|
||||
final class Email
|
||||
{
|
||||
private $email;
|
||||
|
||||
private function __construct(string $email)
|
||||
{
|
||||
$this->ensureIsValidEmail($email);
|
||||
$this->email = $email;
|
||||
}
|
||||
|
||||
public static function fromString(string $email): self
|
||||
{
|
||||
return new self($email);
|
||||
}
|
||||
|
||||
public function __toString(): string
|
||||
{
|
||||
return $this->email;
|
||||
}
|
||||
|
||||
private function ensureIsValidEmail(string $email): void
|
||||
{
|
||||
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||
throw new \InvalidArgumentException(
|
||||
sprintf("%s is not a valid email address", $email)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace MMK2410\MyTodoList;
|
||||
|
||||
class Todo
|
||||
{
|
||||
const ExceptionMsgInvalidTitle = "Empty task title not allowed";
|
||||
|
||||
private string $title;
|
||||
private string $state;
|
||||
|
||||
public function __construct(string $title)
|
||||
{
|
||||
$this->validateTitle($title);
|
||||
$this->title = $title;
|
||||
$this->state = TodoStates::Todo;
|
||||
}
|
||||
|
||||
public function getTitle(): string
|
||||
{
|
||||
return $this->title;
|
||||
}
|
||||
|
||||
public function setTitle(string $title): void
|
||||
{
|
||||
$this->validateTitle($title);
|
||||
$this->title = $title;
|
||||
}
|
||||
|
||||
public function getStatus(): string
|
||||
{
|
||||
return $this->state;
|
||||
}
|
||||
|
||||
public function setState(string $state): void
|
||||
{
|
||||
$this->validateState($state);
|
||||
$this->state = $state;
|
||||
}
|
||||
|
||||
private function validateTitle(string $title): void
|
||||
{
|
||||
if (empty($title)) {
|
||||
throw new \InvalidArgumentException(self::ExceptionMsgInvalidTitle);
|
||||
}
|
||||
}
|
||||
|
||||
private function validateState(string $state): void
|
||||
{
|
||||
$reflect = new \ReflectionClass(TodoStates::class);
|
||||
$constantFound = $reflect->getConstant($state);
|
||||
if ($constantFound === FALSE) {
|
||||
throw new \InvalidArgumentException("Invalid state tried to set.");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
<?php
|
||||
|
||||
namespace MMK2410\MyTodoList;
|
||||
|
||||
abstract class TodoStates
|
||||
{
|
||||
const Todo = "Todo";
|
||||
const Done = "Done";
|
||||
}
|
|
@ -1,27 +0,0 @@
|
|||
<?php declare(strict_types=1);
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use MMK2410\MyTodoList\Email;
|
||||
|
||||
final class EmailTest extends TestCase
|
||||
{
|
||||
private $email = 'user@example.com';
|
||||
|
||||
public function testCanBeCreatedFromValidEmailAddress(): void {
|
||||
$this->assertInstanceOf(
|
||||
Email::class,
|
||||
Email::fromString($this->email)
|
||||
);
|
||||
}
|
||||
|
||||
public function testCannotBeCreatedFromInvalidEmailAddress(): void {
|
||||
$this->expectException(InvalidArgumentException::class);
|
||||
Email::fromString('invalid');
|
||||
}
|
||||
|
||||
public function testCanBeUsedAsString(): void {
|
||||
$this->assertEquals(
|
||||
$this->email,
|
||||
Email::fromString($this->email)
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,67 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
use MMK2410\MyTodoList\Todo;
|
||||
use MMK2410\MyTodoList\TodoStates;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class TodoTest extends TestCase
|
||||
{
|
||||
public function testCreateTodo(): void
|
||||
{
|
||||
$title = "Some task";
|
||||
$todo = new Todo($title);
|
||||
$this->assertEquals(
|
||||
$title,
|
||||
$todo->getTitle(),
|
||||
"Expected title '$title', but got '{$todo->getTitle()}'"
|
||||
);
|
||||
}
|
||||
|
||||
public function testDontCreateEmptyTodo(): void
|
||||
{
|
||||
$this->expectException(\InvalidArgumentException::class);
|
||||
$this->expectExceptionMessage(Todo::ExceptionMsgInvalidTitle);
|
||||
new Todo("");
|
||||
}
|
||||
|
||||
public function testUpdateTitle(): void
|
||||
{
|
||||
$anotherTitle = "Another title";
|
||||
$todo = new Todo("Some title");
|
||||
$todo->setTitle($anotherTitle);
|
||||
$this->assertEquals(
|
||||
$anotherTitle,
|
||||
$todo->getTitle(),
|
||||
"Expected new title $anotherTitle, but got {$todo->getTitle()}"
|
||||
);
|
||||
}
|
||||
|
||||
public function testNewTodoState(): void
|
||||
{
|
||||
$todo = new Todo("stub");
|
||||
$this->assertEquals(
|
||||
TodoStates::Todo,
|
||||
$todo->getStatus(),
|
||||
"Expected todo state 'Todo', but got {$todo->getStatus()}"
|
||||
);
|
||||
}
|
||||
|
||||
public function testChangeTodoState(): void
|
||||
{
|
||||
$todo = new Todo("stub");
|
||||
$todo->setState(TodoStates::Done);
|
||||
$this->assertEquals(
|
||||
TodoStates::Done,
|
||||
$todo->getStatus(),
|
||||
"Expected todo state 'Done', but got {$todo->getStatus()}"
|
||||
);
|
||||
}
|
||||
|
||||
public function testSetBogusTodoState(): void
|
||||
{
|
||||
$todo = new Todo("stub");
|
||||
$this->expectException(\InvalidArgumentException::class);
|
||||
$this->expectExceptionMessage("Invalid state tried to set.");
|
||||
$todo->setState("bogus");
|
||||
}
|
||||
}
|
Reference in New Issue