diff --git a/composer.json b/composer.json
new file mode 100644
index 00000000..88fc0a3b
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,25 @@
+{
+ "name": "nextcloud/circles",
+ "description": "circles",
+ "minimum-stability": "stable",
+ "license": "agpl",
+ "authors": [
+ {
+ "name": "Maxence Lange",
+ "email": "maxence@nextcloud.com"
+ }
+ ],
+ "require": {
+ "phpunit/phpunit": "6.0.8"
+ },
+ "config": {
+ "vendor-dir": "lib/composer",
+ "optimize-autoloader": true
+ },
+ "autoload": {
+ "psr-4": {
+ "UpdateServer\\": "src/",
+ "Tests\\": "tests/unit/"
+ }
+ }
+}
\ No newline at end of file
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 00000000..d22bfc79
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,1276 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "eaa3873b10f11d28070fcbdc8bb067d7",
+ "packages": [
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3,<8.0-DEV"
+ },
+ "require-dev": {
+ "athletic/athletic": "~0.1.8",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "http://ocramius.github.com/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://github.com/doctrine/instantiator",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "time": "2015-06-14T21:17:01+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "5a5a9fc8025a08d8919be87d6884d5a92520cefe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/5a5a9fc8025a08d8919be87d6884d5a92520cefe",
+ "reference": "5a5a9fc8025a08d8919be87d6884d5a92520cefe",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "doctrine/collections": "1.*",
+ "phpunit/phpunit": "~4.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "homepage": "https://github.com/myclabs/DeepCopy",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "time": "2017-01-26T22:05:40+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
+ "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "time": "2015-12-27T11:43:31+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8331b5efe816ae05461b7ca1e721c01b46bafb3e",
+ "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0@dev",
+ "phpdocumentor/type-resolver": "^0.2.0",
+ "webmozart/assert": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^4.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "time": "2016-09-30T07:12:33+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "0.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb",
+ "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^5.2||^4.8.24"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "time": "2016-11-25T06:54:22+00:00"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "v1.6.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "6c52c2722f8460122f96f86346600e1077ce22cb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/6c52c2722f8460122f96f86346600e1077ce22cb",
+ "reference": "6c52c2722f8460122f96f86346600e1077ce22cb",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.3|^7.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
+ "sebastian/comparator": "^1.1",
+ "sebastian/recursion-context": "^1.0|^2.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^2.0",
+ "phpunit/phpunit": "^4.8 || ^5.6.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Prophecy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "time": "2016-11-21T14:58:47+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "5.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "531553c4795a1df54114342d68ca337d5d81c8a0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/531553c4795a1df54114342d68ca337d5d81c8a0",
+ "reference": "531553c4795a1df54114342d68ca337d5d81c8a0",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.0",
+ "phpunit/php-file-iterator": "^1.3",
+ "phpunit/php-text-template": "^1.2",
+ "phpunit/php-token-stream": "^1.4.11 || ^2.0",
+ "sebastian/code-unit-reverse-lookup": "^1.0",
+ "sebastian/environment": "^2.0",
+ "sebastian/version": "^2.0"
+ },
+ "require-dev": {
+ "ext-xdebug": "^2.5",
+ "phpunit/phpunit": "^6.0"
+ },
+ "suggest": {
+ "ext-xdebug": "^2.5.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "time": "2017-03-01T09:14:18+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "1.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
+ "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "time": "2016-10-03T07:40:28+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "time": "2015-06-21T13:50:34+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "1.0.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+ "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "time": "2017-02-26T11:10:40+00:00"
+ },
+ {
+ "name": "phpunit/php-token-stream",
+ "version": "1.4.11",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+ "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e03f8f67534427a787e21a385a67ec3ca6978ea7",
+ "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Wrapper around PHP's tokenizer extension.",
+ "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+ "keywords": [
+ "tokenizer"
+ ],
+ "time": "2017-02-27T10:12:30+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "6.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "47ee3fa1bca5c50f1d25105201eb20df777bd7b6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/47ee3fa1bca5c50f1d25105201eb20df777bd7b6",
+ "reference": "47ee3fa1bca5c50f1d25105201eb20df777bd7b6",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "myclabs/deep-copy": "^1.3",
+ "php": "^7.0",
+ "phpspec/prophecy": "^1.6.2",
+ "phpunit/php-code-coverage": "^5.0",
+ "phpunit/php-file-iterator": "^1.4",
+ "phpunit/php-text-template": "^1.2",
+ "phpunit/php-timer": "^1.0.6",
+ "phpunit/phpunit-mock-objects": "^4.0",
+ "sebastian/comparator": "^1.2.4 || ^2.0",
+ "sebastian/diff": "^1.2",
+ "sebastian/environment": "^2.0",
+ "sebastian/exporter": "^2.0 || ^3.0",
+ "sebastian/global-state": "^1.1 || ^2.0",
+ "sebastian/object-enumerator": "^2.0 || ^3.0",
+ "sebastian/resource-operations": "^1.0",
+ "sebastian/version": "^2.0"
+ },
+ "conflict": {
+ "phpdocumentor/reflection-docblock": "3.0.2",
+ "phpunit/dbunit": "<3.0"
+ },
+ "require-dev": {
+ "ext-pdo": "*"
+ },
+ "suggest": {
+ "ext-xdebug": "*",
+ "phpunit/php-invoker": "^1.1"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "time": "2017-03-02T15:24:03+00:00"
+ },
+ {
+ "name": "phpunit/phpunit-mock-objects",
+ "version": "4.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+ "reference": "3819745c44f3aff9518fd655f320c4535d541af7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/3819745c44f3aff9518fd655f320c4535d541af7",
+ "reference": "3819745c44f3aff9518fd655f320c4535d541af7",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^7.0",
+ "phpunit/php-text-template": "^1.2",
+ "sebastian/exporter": "^2.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<6.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Mock Object library for PHPUnit",
+ "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+ "keywords": [
+ "mock",
+ "xunit"
+ ],
+ "time": "2017-02-02T10:36:38+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/c36f5e7cfce482fde5bf8d10d41a53591e0198fe",
+ "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "time": "2016-02-13T06:45:14+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "1.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
+ "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/diff": "~1.2",
+ "sebastian/exporter": "~1.2 || ~2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "http://www.github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "time": "2017-01-29T09:50:25+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff"
+ ],
+ "time": "2015-12-08T07:14:41+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
+ "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "time": "2016-11-26T07:53:53+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
+ "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/recursion-context": "~2.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "time": "2016-11-19T08:54:04+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "time": "2015-10-12T03:26:01+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7",
+ "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6",
+ "sebastian/recursion-context": "~2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "time": "2017-02-18T15:18:39+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a",
+ "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "time": "2016-11-19T07:33:16+00:00"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "time": "2015-07-28T20:34:47+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "time": "2016-10-03T07:35:21+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/assert.git",
+ "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f",
+ "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6",
+ "sebastian/version": "^1.0.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "time": "2016-11-23T20:04:58+00:00"
+ }
+ ],
+ "packages-dev": [],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": [],
+ "platform-dev": []
+}
diff --git a/lib/Exceptions/CircleAlreadyExistsException.php b/lib/Exceptions/CircleAlreadyExistsException.php
new file mode 100644
index 00000000..8a32fe34
--- /dev/null
+++ b/lib/Exceptions/CircleAlreadyExistsException.php
@@ -0,0 +1,33 @@
+
+ * @copyright 2017
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Circles\Exceptions;
+
+class CircleAlreadyExistsException extends \Exception {
+
+}
+
+
diff --git a/lib/Exceptions/CircleCreationException.php b/lib/Exceptions/CircleCreationException.php
new file mode 100644
index 00000000..108670d0
--- /dev/null
+++ b/lib/Exceptions/CircleCreationException.php
@@ -0,0 +1,32 @@
+
+ * @copyright 2017
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Circles\Exceptions;
+
+class CircleCreationException extends \Exception {
+
+}
+
diff --git a/lib/Exceptions/MemberAlreadyExistsException.php b/lib/Exceptions/MemberAlreadyExistsException.php
new file mode 100644
index 00000000..f1b9b2f7
--- /dev/null
+++ b/lib/Exceptions/MemberAlreadyExistsException.php
@@ -0,0 +1,32 @@
+
+ * @copyright 2017
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Circles\Exceptions;
+
+class MemberAlreadyExistsException extends \Exception {
+
+}
+
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
new file mode 100644
index 00000000..11cf7702
--- /dev/null
+++ b/tests/bootstrap.php
@@ -0,0 +1,27 @@
+addValidRoot(OC::$SERVERROOT . '/tests');
+
+// Fix for "Autoload path not allowed: .../activity/tests/testcase.php"
+\OC_App::loadApp('circles');
+
+// Fix for "Autoload path not allowed: .../files/lib/activity.php"
+//\OC_App::loadApp('files');
+
+// Fix for "Autoload path not allowed: .../files_sharing/lib/activity.php"
+//\OC_App::loadApp('files_sharing');
+
+
+if (!class_exists('PHPUnit_Framework_TestCase')) {
+ require_once('PHPUnit/Autoload.php');
+}
+
+OC_Hook::clear();
\ No newline at end of file
diff --git a/tests/phpunit.xml b/tests/phpunit.xml
new file mode 100644
index 00000000..cea650ed
--- /dev/null
+++ b/tests/phpunit.xml
@@ -0,0 +1,8 @@
+
+
+
+
+ .
+
+
+
\ No newline at end of file
diff --git a/tests/unit/lib/Api/CirclesTest.php b/tests/unit/lib/Api/CirclesTest.php
new file mode 100644
index 00000000..d7df5b48
--- /dev/null
+++ b/tests/unit/lib/Api/CirclesTest.php
@@ -0,0 +1,41 @@
+
+ * @copyright 2017
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Circles\Tests\Api;
+
+use OCA\Circles\Api\Circles;
+
+class CirclesTest extends \PHPUnit_Framework_TestCase {
+
+ protected function setUp() {}
+//
+// public function testTest() {
+// $this->assertSame(2, Circles::oui('ok'));
+// }
+
+
+
+}
diff --git a/tests/unit/lib/AppInfo/AppTest.php b/tests/unit/lib/AppInfo/AppTest.php
new file mode 100644
index 00000000..5d7f0742
--- /dev/null
+++ b/tests/unit/lib/AppInfo/AppTest.php
@@ -0,0 +1,51 @@
+
+ * @copyright 2017
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Activity\Tests\AppInfo;
+
+use OCA\Circles\Tests\TestCase;
+
+/**
+ * Class AppTest
+ *
+ * @group DB
+ * @package OCA\Circles\Tests\AppInfo
+ */
+class AppTest extends \PHPUnit_Framework_TestCase {
+
+ public function testNavigationEntry() {
+
+ $navigationManager = \OC::$server->getNavigationManager();
+ $navigationManager->clear();
+ $countBefore = count($navigationManager->getAll());
+
+ require '../appinfo/app.php';
+
+ $this->assertCount($countBefore + 1, $navigationManager->getAll());
+ }
+
+
+}
\ No newline at end of file
diff --git a/tests/unit/lib/AppInfo/ApplicationTest.php b/tests/unit/lib/AppInfo/ApplicationTest.php
new file mode 100644
index 00000000..cf6a9248
--- /dev/null
+++ b/tests/unit/lib/AppInfo/ApplicationTest.php
@@ -0,0 +1,107 @@
+
+ * @copyright 2017
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Circles\Tests\AppInfo;
+
+
+use OCA\Circles\AppInfo\Application;
+use OCA\Circles\Controller\NavigationController;
+use OCA\Circles\Controller\CirclesController;
+use OCA\Circles\Controller\MembersController;
+use OCA\Circles\Db\CirclesMapper;
+use OCA\Circles\Db\MembersMapper;
+use OCA\Circles\Service\DatabaseService;
+use OCA\Circles\Service\CirclesService;
+use OCA\Circles\Service\MembersService;
+use OCA\Circles\Service\ConfigService;
+use OCA\Circles\Service\MiscService;
+use OCA\Circles\Exceptions\MemberExists;
+
+
+/**
+ * Class ApplicationTest
+ *
+ * @group DB
+ * @package OCA\Circles\Tests\AppInfo
+ */
+class ApplicationTest extends \PHPUnit_Framework_TestCase {
+
+ /** @var \OCA\Circles\AppInfo\Application */
+ protected $app;
+
+ /** @var \OCP\AppFramework\IAppContainer */
+ protected $container;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->app = new Application();
+ $this->container = $this->app->getContainer();
+ }
+
+ public function testContainerAppName() {
+ $this->app = new Application();
+ $this->assertEquals('circles', $this->container->getAppName());
+ }
+
+
+ public function queryData() {
+ return array(
+ // array(IL10N::class),
+
+ // controller
+ array(NavigationController::class),
+ array('CirclesController', CirclesController::class),
+ array('MembersController', MembersController::class),
+
+ // mapper
+ array('CirclesMapper', CirclesMapper::class),
+ array('MembersMapper', MembersMapper::class),
+
+ // service
+ array('DatabaseService', DatabaseService::class),
+ array('CirclesService', CirclesService::class),
+ array('MembersService', MembersService::class),
+ array('ConfigService', ConfigService::class),
+ array('MiscService', MiscService::class),
+ array('CirclesService', CirclesService::class),
+ );
+ }
+
+ /**
+ * @dataProvider queryData
+ *
+ * @param string $service
+ * @param string $expected
+ */
+ public function testContainerQuery($service, $expected = null) {
+ if ($expected === null) {
+ $expected = $service;
+ }
+
+ $this->assertTrue($this->container->query($service) instanceof $expected);
+ }
+}
\ No newline at end of file
diff --git a/tests/unit/lib/Db/CirclesMapperTest.php b/tests/unit/lib/Db/CirclesMapperTest.php
new file mode 100644
index 00000000..49184027
--- /dev/null
+++ b/tests/unit/lib/Db/CirclesMapperTest.php
@@ -0,0 +1,259 @@
+
+ * @copyright 2017
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+
+namespace OCA\Circles\Tests\Db;
+
+use OCA\Circles\Db\Members;
+use OCA\Circles\Db\CirclesMapper;
+use OCA\Circles\Db\MembersMapper;
+use OCA\Circles\Exceptions\CircleAlreadyExistsException;
+use OCA\Circles\Exceptions\MemberAlreadyExistsException;
+use OCA\Circles\Exceptions\TeamExists;
+use OCA\Circles\Model\Member;
+use OCA\Circles\Model\Circle;
+
+
+/**
+ * Class MembersMapperTest
+ *
+ * @group DB
+ * @package OCA\Circles\Tests\Db
+ */
+class CirclesMapperTest extends \PHPUnit_Framework_TestCase {
+
+ const TEST_CIRCLE_OWNER1 = '_owner1';
+ const TEST_CIRCLE_OWNER2 = '_owner2';
+
+ const TEST_CIRCLE_USER1 = '_user1';
+
+ /** @var \OCA\Circles\Db\CirclesMapper|\PHPUnit_Framework_MockObject_MockObject */
+ protected $circlesMapper;
+
+ /** @var \OCA\Circles\Db\MembersMapper|\PHPUnit_Framework_MockObject_MockObject */
+ protected $membersMapper;
+
+ protected function setUp() {
+
+ $this->circlesMapper = new CirclesMapper(
+ \OC::$server->getDatabaseConnection(),
+ $this->getMockBuilder('OCA\Circles\Service\MiscService')
+ ->disableOriginalConstructor()
+ ->getMock()
+ );
+
+ $this->membersMapper = new MembersMapper(
+ \OC::$server->getDatabaseConnection(),
+ $this->getMockBuilder('OCA\Circles\Service\MiscService')
+ ->disableOriginalConstructor()
+ ->getMock()
+ );
+ }
+
+
+ public function testCircles() {
+
+ $owner1 = new Member();
+ $owner1->setUserId(self::TEST_CIRCLE_OWNER1);
+
+ $owner2 = new Member();
+ $owner2->setUserId(self::TEST_CIRCLE_OWNER2);
+
+ // creating circles.
+ $circles = [];
+ $circles[] =
+ $this->createCircleTest('__test_personal', Circle::CIRCLES_PERSONAL, $owner1, true);
+ $circles[] =
+ $this->createCircleTest('__test_private', Circle::CIRCLES_PRIVATE, $owner1, true);
+ $circles[] =
+ $this->createCircleTest('__test_hidden', Circle::CIRCLES_HIDDEN, $owner1, true);
+ $circles[] =
+ $this->createCircleTest('__test_public', Circle::CIRCLES_PUBLIC, $owner1, true);
+
+ // checking that we can't create circle with same name
+ $this->createCircleTest('__test_private', Circle::CIRCLES_PRIVATE, $owner2, false);
+ $this->createCircleTest('__test_hidden', Circle::CIRCLES_PRIVATE, $owner2, false);
+ $this->createCircleTest('__test_public', Circle::CIRCLES_PRIVATE, $owner2, false);
+ $this->createCircleTest('__test_private', Circle::CIRCLES_HIDDEN, $owner2, false);
+ $this->createCircleTest('__test_hidden', Circle::CIRCLES_HIDDEN, $owner2, false);
+ $this->createCircleTest('__test_public', Circle::CIRCLES_HIDDEN, $owner2, false);
+ $this->createCircleTest('__test_private', Circle::CIRCLES_PUBLIC, $owner2, false);
+ $this->createCircleTest('__test_hidden', Circle::CIRCLES_PUBLIC, $owner2, false);
+ $this->createCircleTest('__test_public', Circle::CIRCLES_PUBLIC, $owner2, false);
+
+
+ // counting the circles created from the real owner point of view
+ $this->assertCount(
+ 1, $this->circlesMapper->findCirclesByUser(
+ $owner1->getUserId(), Circle::CIRCLES_ALL, '_personal', 0
+ )
+ );
+ $this->assertCount(
+ 1, $this->circlesMapper->findCirclesByUser(
+ $owner1->getUserId(), Circle::CIRCLES_ALL, '_private', 0
+ )
+ );
+ $this->assertCount(
+ 1, $this->circlesMapper->findCirclesByUser(
+ $owner1->getUserId(), Circle::CIRCLES_ALL, '_hidden', 0
+ )
+ );
+ $this->assertCount(
+ 1, $this->circlesMapper->findCirclesByUser(
+ $owner1->getUserId(), Circle::CIRCLES_ALL, '_public', 0
+ )
+ );
+
+ // counting the circles created from someone else' point of view
+ $this->assertCount(
+ 0, $this->circlesMapper->findCirclesByUser(
+ $owner2->getUserId(), Circle::CIRCLES_ALL, '_personal', 0
+ )
+ );
+ $this->assertCount(
+ 1, $this->circlesMapper->findCirclesByUser(
+ $owner2->getUserId(), Circle::CIRCLES_ALL, '_private', 0
+ )
+ );
+ $this->assertCount(
+ 0, $this->circlesMapper->findCirclesByUser(
+ $owner2->getUserId(), Circle::CIRCLES_ALL, '_hidden', 0
+ )
+ );
+ $this->assertCount(
+ 1, $this->circlesMapper->findCirclesByUser(
+ $owner2->getUserId(), Circle::CIRCLES_ALL, '__test_hidden', 0
+ )
+ );
+ $this->assertCount(
+ 1, $this->circlesMapper->findCirclesByUser(
+ $owner2->getUserId(), Circle::CIRCLES_ALL, '_public', 0
+ )
+ );
+
+
+ // create user (for hidden circle)
+ $user1 = new Member();
+ $user1->setUserId(self::TEST_CIRCLE_USER1);
+ $user1->setCircleId(
+ self::getTestFromCircles('__test_hidden', $circles)
+ ->getId()
+ );
+ $user1->setLevel(Member::LEVEL_MEMBER);
+ $user1->setStatus(Member::STATUS_MEMBER);
+
+ // checking some access from this user point of view (before adding him to DB)
+ $this->assertCount(
+ 0, $this->circlesMapper->findCirclesByUser(
+ $user1->getUserId(), Circle::CIRCLES_ALL, '_hidden', 0
+ )
+ );
+
+ // add User1 to DB
+ $this->membersMapper->add($user1);
+
+ // checking access after adding user (as member) to DB
+ $this->assertCount(
+ 1, $this->circlesMapper->findCirclesByUser(
+ $user1->getUserId(), Circle::CIRCLES_ALL, '_hidden', 0
+ )
+ );
+
+
+ // create user (for personal circle)
+ $user1 = new Member();
+ $user1->setUserId(self::TEST_CIRCLE_USER1);
+ $user1->setCircleId(
+ self::getTestFromCircles('__test_personal', $circles)
+ ->getId()
+ );
+ $user1->setLevel(Member::LEVEL_MEMBER);
+ $user1->setStatus(Member::STATUS_MEMBER);
+
+ // checking some access from this user point of view (before adding him to DB)
+ $this->assertCount(
+ 0, $this->circlesMapper->findCirclesByUser(
+ $user1->getUserId(), Circle::CIRCLES_ALL, '_personal', 0
+ )
+ );
+
+ // add User1 to DB
+ $this->membersMapper->add($user1);
+
+ // checking non access after adding user (as member) to DB
+ $this->assertCount(
+ 0, $this->circlesMapper->findCirclesByUser(
+ $user1->getUserId(), Circle::CIRCLES_ALL, '_personal', 0
+ )
+ );
+
+
+ //
+ // we delete everything
+ foreach ($circles AS $circle) {
+ $this->membersMapper->removeAllFromCircle($circle);
+ $this->circlesMapper->destroy($circle);
+ }
+
+ }
+
+
+ private static function getTestFromCircles($name, $circles) {
+
+ foreach ($circles AS $circle) {
+ if ($circle->getName() === $name) {
+ return $circle;
+ }
+ }
+
+ return null;
+ }
+
+ private function createCircleTest($name, $type, $owner, $create = true) {
+
+ $circle = new Circle();
+ $circle->setName($name);
+ $circle->setDescription('description');
+ $circle->setType($type);
+ $circle->setOwner($owner);
+
+ if ($create === true) {
+ $this->circlesMapper->create($circle, $owner);
+ $this->membersMapper->add($owner);
+ }
+
+ try {
+ $this->circlesMapper->create($circle, $owner);
+ $this->assertSame(true, false, 'Circle should already exists');
+ } catch (CircleAlreadyExistsException $c) {
+ } catch (\Exception $e) {
+ $this->assertSame(true, false, 'Should returns CircleAlreadyExistsException');
+ }
+
+ return $circle;
+ }
+
+}
\ No newline at end of file
diff --git a/tests/unit/lib/Db/CirclesTest.php b/tests/unit/lib/Db/CirclesTest.php
new file mode 100644
index 00000000..4e04169f
--- /dev/null
+++ b/tests/unit/lib/Db/CirclesTest.php
@@ -0,0 +1,79 @@
+
+ * @copyright 2017
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+
+namespace OCA\Circles\Tests\Db;
+
+use OCA\Circles\Db\Circles;
+use OCA\Circles\Model\Circle;
+use OCA\Circles\Model\Member;
+
+
+/**
+ * Class CirclesTest
+ *
+ * @group DB
+ * @package OCA\Circles\Tests\Db
+ */
+class CirclesTest extends \PHPUnit_Framework_TestCase {
+
+
+ public function testCircles() {
+
+ $date = date("Y-m-d H:i:s");
+
+ $owner = new Member();
+ $owner->setUserId('owner');
+ $user = new Member();
+ $user->setUserID('user');
+
+ $members = array($owner, $user);
+
+ $model = Circle::fromArray(
+ array(
+ 'id' => 1,
+ 'name' => 'test',
+ 'description' => 'description',
+ 'type' => Circle::CIRCLES_ALL,
+ 'creation' => $date,
+ 'count' => sizeof($members),
+ )
+ );
+ $model->setMembers($members);
+
+ $item = new Circles($model);
+
+ $this->assertSame(1, $item->id);
+ $this->assertSame('test', $item->name);
+
+ $this->assertSame('description', $item->description);
+ $this->assertSame(Circle::CIRCLES_ALL, $item->type);
+ $this->assertSame($date, $item->creation);
+ $this->assertSame($members, $item->members);
+ }
+
+
+}
\ No newline at end of file
diff --git a/tests/unit/lib/Db/MembersMapperTest.php b/tests/unit/lib/Db/MembersMapperTest.php
new file mode 100644
index 00000000..d5bf6bda
--- /dev/null
+++ b/tests/unit/lib/Db/MembersMapperTest.php
@@ -0,0 +1,170 @@
+
+ * @copyright 2017
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+
+namespace OCA\Circles\Tests\Db;
+
+use OCA\Circles\Db\Members;
+use OCA\Circles\Db\MembersMapper;
+use OCA\Circles\Exceptions\MemberAlreadyExistsException;
+use OCA\Circles\Exceptions\TeamExists;
+use OCA\Circles\Model\Member;
+
+
+/**
+ * Class MembersMapperTest
+ *
+ * @group DB
+ * @package OCA\Circles\Tests\Db
+ */
+class MembersMapperTest extends \PHPUnit_Framework_TestCase {
+
+ const TEST_MEMBER_1 = '_test_1';
+ const TEST_MEMBER_2 = '_test_2';
+
+ const TEST_CIRCLE_ID = 9999998;
+
+ /** @var \OCA\Circles\Db\MembersMapper|\PHPUnit_Framework_MockObject_MockObject */
+ protected $membersMapper;
+
+ protected function setUp() {
+// $this->db = \OC::$server->getDatabaseConnection();
+// $this->miscService = $this->getMockBuilder('OCA\Circles\Service\MiscService')
+// ->disableOriginalConstructor()
+// ->getMock();
+
+ $this->membersMapper = new MembersMapper(
+ \OC::$server->getDatabaseConnection(),
+ $this->getMockBuilder('OCA\Circles\Service\MiscService')
+ ->disableOriginalConstructor()
+ ->getMock()
+ );
+ }
+
+
+ public function testMembers() {
+
+ $member1 = Member::fromArray(
+ array(
+ 'circle_id' => self::TEST_CIRCLE_ID,
+ 'user_id' => self::TEST_MEMBER_1,
+ 'level' => Member::LEVEL_MEMBER,
+ 'status' => Member::STATUS_MEMBER,
+ 'note' => 'test note',
+ )
+ );
+
+ $member2 = Member::fromArray(
+ array(
+ 'circle_id' => self::TEST_CIRCLE_ID,
+ 'user_id' => self::TEST_MEMBER_2,
+ 'level' => Member::LEVEL_OWNER,
+ 'status' => Member::STATUS_MEMBER,
+ 'note' => 'test note',
+ )
+ );
+
+
+ $this->membersMapper->remove($member1);
+ $this->membersMapper->remove($member2);
+
+ $this->membersMapper->add($member1);
+ $this->membersMapper->add($member2);
+
+ try {
+ $this->membersMapper->add($member1);
+ $this->assertSame(true, false, 'Member should already exists');
+ } catch (MemberAlreadyExistsException $m) {
+ } catch (\Exception $e) {
+ $this->assertSame(true, false, 'Should returns MemberAlreadyExistsException');
+ }
+
+
+ //
+ // get result from database (as moderator)
+ $result1 =
+ $this->membersMapper->getMemberFromCircle(
+ self::TEST_CIRCLE_ID, $member1->getUserId(), true
+ );
+
+ $this->assertSame($result1->getCircleId(), $member1->getCircleId());
+ $this->assertSame($result1->getUserID(), $member1->getUserID());
+ $this->assertSame($result1->getLevel(), $member1->getLevel());
+ $this->assertSame($result1->getStatus(), $member1->getStatus());
+ $this->assertSame($result1->getNote(), $member1->getNote());
+
+ // non-moderator should not get access to note
+ $result1 =
+ $this->membersMapper->getMemberFromCircle(
+ self::TEST_CIRCLE_ID, $member1->getUserId(), false
+ );
+ $this->assertSame(null, $result1->getNote());
+
+
+ //
+ // list of members from a circle (moderator)
+ $membersList = $this->membersMapper->getMembersFromCircle(self::TEST_CIRCLE_ID, true);
+ $this->assertCount(2, $membersList);
+ if (sizeof($membersList) > 0) {
+ $this->assertSame('test note', $membersList[0]->getNote());
+ }
+
+ // list of members from a circle (mom-moderator)
+ $membersList = $this->membersMapper->getMembersFromCircle(self::TEST_CIRCLE_ID, false);
+ $this->assertCount(2, $membersList);
+ if (sizeof($membersList) > 0) {
+ $this->assertSame(null, $membersList[0]->getNote());
+ }
+
+
+ //
+ // Update members
+ $member1->setLevel(Member::LEVEL_NONE);
+ $member1->setStatus(Member::STATUS_NONMEMBER);
+ $this->membersMapper->editMember($member1);
+
+ $result1 =
+ $this->membersMapper->getMemberFromCircle(
+ self::TEST_CIRCLE_ID, $member1->getUserId()
+ );
+
+ // verify
+ $this->assertSame($result1->getCircleId(), $member1->getCircleId());
+ $this->assertSame($result1->getUserID(), $member1->getUserID());
+ $this->assertSame($result1->getLevel(), Member::LEVEL_NONE);
+ $this->assertSame($result1->getStatus(), Member::STATUS_NONMEMBER);
+
+ $this->assertCount(
+ 1, $this->membersMapper->getMembersFromCircle(self::TEST_CIRCLE_ID, false)
+ );
+
+ $this->membersMapper->remove($member1);
+ $this->membersMapper->remove($member2);
+
+ //$this->getMemberFromCircle('test');
+ }
+
+}
\ No newline at end of file
diff --git a/tests/unit/lib/Db/MembersTest.php b/tests/unit/lib/Db/MembersTest.php
new file mode 100644
index 00000000..ec7d7111
--- /dev/null
+++ b/tests/unit/lib/Db/MembersTest.php
@@ -0,0 +1,67 @@
+
+ * @copyright 2017
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+
+namespace OCA\Circles\Tests\Db;
+
+use OCA\Circles\Db\Members;
+use OCA\Circles\Model\Member;
+
+
+/**
+ * Class MembersTest
+ *
+ * @group DB
+ * @package OCA\Circles\Tests\Db
+ */
+class MembersTest extends \PHPUnit_Framework_TestCase {
+
+ public function testMembers() {
+
+ $date = date("Y-m-d H:i:s");
+
+ $model = Member::fromArray(
+ array(
+ 'circle_id' => 1,
+ 'user_id' => 'test',
+ 'level' => Member::LEVEL_OWNER,
+ 'status' => Member::STATUS_MEMBER,
+ 'note' => 'note test',
+ 'joined' => $date,
+ )
+ );
+
+ $item = new Members($model);
+
+ $this->assertSame(1, $item->circleId);
+ $this->assertSame('test', $item->userId);
+ $this->assertSame(Member::LEVEL_OWNER, $item->level);
+ $this->assertSame(Member::STATUS_MEMBER, $item->status);
+ $this->assertSame('note test', $item->note);
+ $this->assertSame($date, $item->joined);
+ }
+
+}
\ No newline at end of file
diff --git a/tests/unit/lib/Model/CircleTest.php b/tests/unit/lib/Model/CircleTest.php
new file mode 100644
index 00000000..dde4f303
--- /dev/null
+++ b/tests/unit/lib/Model/CircleTest.php
@@ -0,0 +1,110 @@
+
+ * @copyright 2017
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Circles\Tests\Model;
+
+use OCA\Circles\Model\Circle;
+use \OCA\Circles\Model\Member;
+
+
+/**
+ * Class CircleTest
+ *
+ * @package OCA\Circles\Tests\Model
+ */
+class CircleTest extends \PHPUnit_Framework_TestCase {
+
+ public function testConst() {
+
+ $this->assertSame(1, Circle::CIRCLES_PERSONAL);
+ $this->assertSame(2, Circle::CIRCLES_HIDDEN);
+ $this->assertSame(4, Circle::CIRCLES_PRIVATE);
+ $this->assertSame(8, Circle::CIRCLES_PUBLIC);
+
+ $this->assertSame(
+ Circle::CIRCLES_PERSONAL + Circle::CIRCLES_HIDDEN + Circle::CIRCLES_PRIVATE
+ + Circle::CIRCLES_PUBLIC,
+ Circle::CIRCLES_ALL
+ );
+ }
+
+ public function testModel() {
+
+ $date = date("Y-m-d H:i:s");
+ $joined = date("H:i:s Y-m-d");
+
+ $owner = new Member();
+ $owner->setUserId('owner');
+ $user = new Member();
+ $user->setUserID('user');
+ $user->setStatus(Member::STATUS_MEMBER);
+ $user->setLevel(Member::LEVEL_MEMBER);
+ $user->setJoined($joined);
+
+ $members = array($owner, $user);
+
+
+ $model = Circle::fromArray(
+ array(
+ 'id' => 1,
+ 'name' => 'test',
+ 'description' => 'description',
+ 'type' => Circle::CIRCLES_ALL,
+ 'creation' => $date,
+ 'count' => sizeof($members),
+ 'owner' => $owner->getUserId(),
+ 'status' => $user->getStatus(),
+ 'level' => $user->getLevel(),
+ 'joined' => $user->getJoined()
+ )
+ );
+
+ $model->setMembers($members);
+
+ $this->assertSame(1, $model->getId());
+ $this->assertSame(
+ 'owner', $model->getOwner()
+ ->getUserId()
+ );
+ $this->assertSame(
+ Member::STATUS_MEMBER, $model->getUser()
+ ->getStatus()
+ );
+ $this->assertSame(
+ Member::LEVEL_MEMBER, $model->getUser()
+ ->getLevel()
+ );
+ $this->assertSame(
+ $joined, $model->getUser()
+ ->getJoined()
+ );
+ $this->assertSame('description', $model->getDescription());
+ $this->assertSame(Circle::CIRCLES_ALL, $model->getType());
+ $this->assertSame($date, $model->getCreation());
+ $this->assertSame($members, $model->getMembers());
+ $this->assertSame(2, $model->getCount());
+ }
+}
diff --git a/tests/unit/lib/Model/MemberTest.php b/tests/unit/lib/Model/MemberTest.php
new file mode 100644
index 00000000..0964e82e
--- /dev/null
+++ b/tests/unit/lib/Model/MemberTest.php
@@ -0,0 +1,78 @@
+
+ * @copyright 2017
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+namespace OCA\Circles\Tests\Model;
+
+use \OCA\Circles\Model\Member;
+
+
+/**
+ * Class MemberTest
+ *
+ * @package OCA\Circles\Tests\Model
+ */
+class MemberTest extends \PHPUnit_Framework_TestCase {
+
+ public function testConst() {
+
+ $this->assertSame(0, Member::LEVEL_NONE);
+ $this->assertSame(1, Member::LEVEL_MEMBER);
+ $this->assertSame(6, Member::LEVEL_MODERATOR);
+ $this->assertSame(8, Member::LEVEL_ADMIN);
+ $this->assertSame(9, Member::LEVEL_OWNER);
+
+ $this->assertSame('Unknown', Member::STATUS_NONMEMBER);
+ $this->assertSame('Invited', Member::STATUS_INVITED);
+ $this->assertSame('Requesting', Member::STATUS_REQUEST);
+ $this->assertSame('Member', Member::STATUS_MEMBER);
+ $this->assertSame('Blocked', Member::STATUS_BLOCKED);
+ $this->assertSame('Kicked', Member::STATUS_KICKED);
+ }
+
+ public function testModel() {
+
+ $date = date("Y-m-d H:i:s");
+
+ $member = Member::fromArray(
+ array(
+ 'circle_id' => 1,
+ 'user_id' => 'test',
+ 'level' => Member::LEVEL_OWNER,
+ 'status' => Member::STATUS_MEMBER,
+ 'note' => 'test note',
+ 'joined' => $date
+ )
+ );
+
+ $this->assertSame(1, $member->getCircleId());
+ $this->assertSame('test', $member->getUserID());
+ $this->assertSame(Member::LEVEL_OWNER, $member->getLevel());
+ $this->assertSame(Member::STATUS_MEMBER, $member->getStatus());
+ $this->assertSame('test note', $member->getNote());
+ $this->assertSame($date, $member->getJoined());
+ $this->assertSame('Owner', $member->getLevelString());
+ }
+}
diff --git a/vendor/autoload.php b/vendor/autoload.php
new file mode 100644
index 00000000..70fc56ed
--- /dev/null
+++ b/vendor/autoload.php
@@ -0,0 +1,7 @@
+
+ * Jordi Boggiano
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
+ *
+ * $loader = new \Composer\Autoload\ClassLoader();
+ *
+ * // register classes with namespaces
+ * $loader->add('Symfony\Component', __DIR__.'/component');
+ * $loader->add('Symfony', __DIR__.'/framework');
+ *
+ * // activate the autoloader
+ * $loader->register();
+ *
+ * // to enable searching the include path (eg. for PEAR packages)
+ * $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier
+ * @author Jordi Boggiano
+ * @see http://www.php-fig.org/psr/psr-0/
+ * @see http://www.php-fig.org/psr/psr-4/
+ */
+class ClassLoader
+{
+ // PSR-4
+ private $prefixLengthsPsr4 = array();
+ private $prefixDirsPsr4 = array();
+ private $fallbackDirsPsr4 = array();
+
+ // PSR-0
+ private $prefixesPsr0 = array();
+ private $fallbackDirsPsr0 = array();
+
+ private $useIncludePath = false;
+ private $classMap = array();
+ private $classMapAuthoritative = false;
+ private $missingClasses = array();
+ private $apcuPrefix;
+
+ public function getPrefixes()
+ {
+ if (!empty($this->prefixesPsr0)) {
+ return call_user_func_array('array_merge', $this->prefixesPsr0);
+ }
+
+ return array();
+ }
+
+ public function getPrefixesPsr4()
+ {
+ return $this->prefixDirsPsr4;
+ }
+
+ public function getFallbackDirs()
+ {
+ return $this->fallbackDirsPsr0;
+ }
+
+ public function getFallbackDirsPsr4()
+ {
+ return $this->fallbackDirsPsr4;
+ }
+
+ public function getClassMap()
+ {
+ return $this->classMap;
+ }
+
+ /**
+ * @param array $classMap Class to filename map
+ */
+ public function addClassMap(array $classMap)
+ {
+ if ($this->classMap) {
+ $this->classMap = array_merge($this->classMap, $classMap);
+ } else {
+ $this->classMap = $classMap;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix, either
+ * appending or prepending to the ones previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param array|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
+ */
+ public function add($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ if ($prepend) {
+ $this->fallbackDirsPsr0 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr0
+ );
+ } else {
+ $this->fallbackDirsPsr0 = array_merge(
+ $this->fallbackDirsPsr0,
+ (array) $paths
+ );
+ }
+
+ return;
+ }
+
+ $first = $prefix[0];
+ if (!isset($this->prefixesPsr0[$first][$prefix])) {
+ $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+
+ return;
+ }
+ if ($prepend) {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixesPsr0[$first][$prefix]
+ );
+ } else {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ $this->prefixesPsr0[$first][$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace, either
+ * appending or prepending to the ones previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param array|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function addPsr4($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ // Register directories for the root namespace.
+ if ($prepend) {
+ $this->fallbackDirsPsr4 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr4
+ );
+ } else {
+ $this->fallbackDirsPsr4 = array_merge(
+ $this->fallbackDirsPsr4,
+ (array) $paths
+ );
+ }
+ } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
+ // Register directories for a new namespace.
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ } elseif ($prepend) {
+ // Prepend directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixDirsPsr4[$prefix]
+ );
+ } else {
+ // Append directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ $this->prefixDirsPsr4[$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix,
+ * replacing any others previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param array|string $paths The PSR-0 base directories
+ */
+ public function set($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirsPsr0 = (array) $paths;
+ } else {
+ $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace,
+ * replacing any others previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param array|string $paths The PSR-4 base directories
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function setPsr4($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirsPsr4 = (array) $paths;
+ } else {
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Turns on searching the include path for class files.
+ *
+ * @param bool $useIncludePath
+ */
+ public function setUseIncludePath($useIncludePath)
+ {
+ $this->useIncludePath = $useIncludePath;
+ }
+
+ /**
+ * Can be used to check if the autoloader uses the include path to check
+ * for classes.
+ *
+ * @return bool
+ */
+ public function getUseIncludePath()
+ {
+ return $this->useIncludePath;
+ }
+
+ /**
+ * Turns off searching the prefix and fallback directories for classes
+ * that have not been registered with the class map.
+ *
+ * @param bool $classMapAuthoritative
+ */
+ public function setClassMapAuthoritative($classMapAuthoritative)
+ {
+ $this->classMapAuthoritative = $classMapAuthoritative;
+ }
+
+ /**
+ * Should class lookup fail if not found in the current class map?
+ *
+ * @return bool
+ */
+ public function isClassMapAuthoritative()
+ {
+ return $this->classMapAuthoritative;
+ }
+
+ /**
+ * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
+ *
+ * @param string|null $apcuPrefix
+ */
+ public function setApcuPrefix($apcuPrefix)
+ {
+ $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;
+ }
+
+ /**
+ * The APCu prefix in use, or null if APCu caching is not enabled.
+ *
+ * @return string|null
+ */
+ public function getApcuPrefix()
+ {
+ return $this->apcuPrefix;
+ }
+
+ /**
+ * Registers this instance as an autoloader.
+ *
+ * @param bool $prepend Whether to prepend the autoloader or not
+ */
+ public function register($prepend = false)
+ {
+ spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+ }
+
+ /**
+ * Unregisters this instance as an autoloader.
+ */
+ public function unregister()
+ {
+ spl_autoload_unregister(array($this, 'loadClass'));
+ }
+
+ /**
+ * Loads the given class or interface.
+ *
+ * @param string $class The name of the class
+ * @return bool|null True if loaded, null otherwise
+ */
+ public function loadClass($class)
+ {
+ if ($file = $this->findFile($class)) {
+ includeFile($file);
+
+ return true;
+ }
+ }
+
+ /**
+ * Finds the path to the file where the class is defined.
+ *
+ * @param string $class The name of the class
+ *
+ * @return string|false The path if found, false otherwise
+ */
+ public function findFile($class)
+ {
+ // class map lookup
+ if (isset($this->classMap[$class])) {
+ return $this->classMap[$class];
+ }
+ if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
+ return false;
+ }
+ if (null !== $this->apcuPrefix) {
+ $file = apcu_fetch($this->apcuPrefix.$class, $hit);
+ if ($hit) {
+ return $file;
+ }
+ }
+
+ $file = $this->findFileWithExtension($class, '.php');
+
+ // Search for Hack files if we are running on HHVM
+ if (false === $file && defined('HHVM_VERSION')) {
+ $file = $this->findFileWithExtension($class, '.hh');
+ }
+
+ if (null !== $this->apcuPrefix) {
+ apcu_add($this->apcuPrefix.$class, $file);
+ }
+
+ if (false === $file) {
+ // Remember that this class does not exist.
+ $this->missingClasses[$class] = true;
+ }
+
+ return $file;
+ }
+
+ private function findFileWithExtension($class, $ext)
+ {
+ // PSR-4 lookup
+ $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
+
+ $first = $class[0];
+ if (isset($this->prefixLengthsPsr4[$first])) {
+ foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
+ if (0 === strpos($class, $prefix)) {
+ foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-4 fallback dirs
+ foreach ($this->fallbackDirsPsr4 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 lookup
+ if (false !== $pos = strrpos($class, '\\')) {
+ // namespaced class name
+ $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
+ . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+ } else {
+ // PEAR-like class name
+ $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
+ }
+
+ if (isset($this->prefixesPsr0[$first])) {
+ foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+ if (0 === strpos($class, $prefix)) {
+ foreach ($dirs as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-0 fallback dirs
+ foreach ($this->fallbackDirsPsr0 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 include paths.
+ if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+ return $file;
+ }
+
+ return false;
+ }
+}
+
+/**
+ * Scope isolated include.
+ *
+ * Prevents access to $this/self from included files.
+ */
+function includeFile($file)
+{
+ include $file;
+}
diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE
new file mode 100644
index 00000000..1a281248
--- /dev/null
+++ b/vendor/composer/LICENSE
@@ -0,0 +1,21 @@
+
+Copyright (c) 2016 Nils Adermann, Jordi Boggiano
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
new file mode 100644
index 00000000..7a91153b
--- /dev/null
+++ b/vendor/composer/autoload_classmap.php
@@ -0,0 +1,9 @@
+= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
+ if ($useStaticLoader) {
+ require_once __DIR__ . '/autoload_static.php';
+
+ call_user_func(\Composer\Autoload\ComposerStaticInit91ad254cd51636fd4865b9a0f6d1b4ef::getInitializer($loader));
+ } else {
+ $map = require __DIR__ . '/autoload_namespaces.php';
+ foreach ($map as $namespace => $path) {
+ $loader->set($namespace, $path);
+ }
+
+ $map = require __DIR__ . '/autoload_psr4.php';
+ foreach ($map as $namespace => $path) {
+ $loader->setPsr4($namespace, $path);
+ }
+
+ $classMap = require __DIR__ . '/autoload_classmap.php';
+ if ($classMap) {
+ $loader->addClassMap($classMap);
+ }
+ }
+
+ $loader->register(true);
+
+ return $loader;
+ }
+}
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
new file mode 100644
index 00000000..ab7f5ad4
--- /dev/null
+++ b/vendor/composer/autoload_static.php
@@ -0,0 +1,15 @@
+