diff --git a/composer.json b/composer.json index cafe155..7db8ee4 100644 --- a/composer.json +++ b/composer.json @@ -8,18 +8,17 @@ } ], "autoload": { - "classmap": [ - "src/Client.php", - "src/Settings.php", - "src/Collection.php" - ] + "psr-4": { + "PocketBase\\": "src/", + "PocketBase\\ViewModel\\": "src/viewModel" + } }, "require": { - "php": "^8.1|^8.2", + "php": "^8.3|^8.4", "ext-curl": "*" }, "require-dev": { - "phpunit/phpunit": "^11.5", - "tomasvotruba/phpunit-json-result-printer": "^0.2.1" + "tomasvotruba/phpunit-json-result-printer": "^0.2.1", + "phpunit/phpunit": "^11.5" } } diff --git a/composer.lock b/composer.lock index 45efed8..88ec084 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e3ef1b1407a46f944e79ec18eb6f6a9b", + "content-hash": "a3032883f5e5af1996fb350351fc84ac", "packages": [], "packages-dev": [ { @@ -568,16 +568,16 @@ }, { "name": "phpunit/phpunit", - "version": "11.5.2", + "version": "11.5.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "153d0531b9f7e883c5053160cad6dd5ac28140b3" + "reference": "c9bd61aab12f0fc5e82ecfe621ff518a1d1f1049" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/153d0531b9f7e883c5053160cad6dd5ac28140b3", - "reference": "153d0531b9f7e883c5053160cad6dd5ac28140b3", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c9bd61aab12f0fc5e82ecfe621ff518a1d1f1049", + "reference": "c9bd61aab12f0fc5e82ecfe621ff518a1d1f1049", "shasum": "" }, "require": { @@ -598,7 +598,7 @@ "phpunit/php-timer": "^7.0.1", "sebastian/cli-parser": "^3.0.2", "sebastian/code-unit": "^3.0.2", - "sebastian/comparator": "^6.2.1", + "sebastian/comparator": "^6.3.0", "sebastian/diff": "^6.0.2", "sebastian/environment": "^7.2.0", "sebastian/exporter": "^6.3.0", @@ -649,7 +649,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.2" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.8" }, "funding": [ { @@ -665,7 +665,7 @@ "type": "tidelift" } ], - "time": "2024-12-21T05:51:08+00:00" + "time": "2025-02-18T06:26:59+00:00" }, { "name": "sebastian/cli-parser", @@ -1742,7 +1742,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^8.1|^8.2", + "php": "^8.3|^8.4", "ext-curl": "*" }, "platform-dev": [], diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..247e2bb --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,12 @@ +services: + pocketbase_php_sdk: + image: ghcr.io/muchobien/pocketbase:latest + container_name: pocketbase_php_sdk + restart: unless-stopped + ports: + - "7090:8090" + healthcheck: # optional, recommended since v0.10.0 + test: wget --no-verbose --tries=1 --spider http://localhost:8090/api/health || exit 1 + interval: 5s + timeout: 5s + retries: 5 \ No newline at end of file diff --git a/mailer.go b/mailer.go deleted file mode 100644 index ca36ca3..0000000 --- a/mailer.go +++ /dev/null @@ -1,104 +0,0 @@ -package main - -import ( - "bytes" - "encoding/json" - "flag" - "fmt" - "log" - "net/smtp" - "os/exec" - "time" -) - -func main() { - now := time.Now() - - // Define flags - smtpPass := flag.String("password", "", "SMTP password") - sender := flag.String("sender", "", "SMTP sender") - smtpUser := flag.String("user", "", "SMTP username") - - // Parse the flags - flag.Parse() - - // Check if required flags are provided - if *smtpPass == "" { - log.Fatal("Error: Password is required. Use -password flag.") - } - if *smtpUser == "" { - log.Fatal("Error: SMTP username is required. Use -user flag.") - } - if *sender == "" { - log.Fatal("Error: Sender email is required. Use -sender flag.") - } - - // Format the date as YYYY-MM-DD - currentDate := now.Format("01.02.2006") - - recipient := "support@jonathan-martz.de" - subject := "PHPUnit - PocketBase PHP SDK - " + currentDate - smtpHost := "smtps.udag.de" // Replace with your SMTP host - smtpPort := "587" // Replace with your SMTP port - - // Run PHPUnit with combined stdout and stderr - cmd := exec.Command("php", "vendor/bin/phpunit") - var output bytes.Buffer - cmd.Stdout = &output - cmd.Stderr = &output - - if err := cmd.Run(); err != nil { - log.Printf("PHPUnit command failed: %v", err) - } - - // Check if output is empty - if output.Len() == 0 { - log.Fatal("PHPUnit output is empty. Please check your configuration.") - } - - // Parse the JSON output - var result map[string]interface{} - if err := json.Unmarshal(output.Bytes(), &result); err != nil { - log.Fatalf("Failed to parse JSON output: %v", err) - } - - // Extract the 'counts' field - counts, ok := result["counts"].(map[string]interface{}) - if !ok { - log.Fatal("Counts field not found in PHPUnit output.") - } - - // Check if 'fails' is greater than 0 - failed, ok := counts["failed"].(float64) - if !ok { - log.Fatal("'fails' field not found in counts.") - } - - if failed > 0 { - // Serialize the counts field to JSON for the email body - countsJSON, err := json.MarshalIndent(counts, "", " ") - if err != nil { - log.Fatalf("Failed to serialize counts to JSON: %v", err) - } - - // Prepare the email body - emailBody := fmt.Sprintf("Subject: %s\r\n\r\n%s", subject, string(countsJSON)) - - // Connect to the SMTP server - auth := smtp.PlainAuth("", *smtpUser, *smtpPass, smtpHost) - err = smtp.SendMail( - smtpHost+":"+smtpPort, - auth, - *sender, - []string{recipient}, - []byte(emailBody), - ) - if err != nil { - log.Fatalf("Failed to send email: %v", err) - } - - log.Println("Test results sent to", recipient) - } else { - log.Println("No failures detected. No email sent.") - } -} \ No newline at end of file diff --git a/phpunit.xml b/phpunit.xml index 1e4d787..6ab7e2d 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -5,7 +5,6 @@ cacheDirectory=".phpunit.cache" executionOrder="depends,defects" shortenArraysForExportThreshold="10" - requireCoverageMetadata="true" beStrictAboutCoverageMetadata="true" beStrictAboutOutputDuringTests="true" displayDetailsOnPhpunitDeprecations="true" @@ -17,9 +16,10 @@ tests - + + diff --git a/src/AuthTest.php b/src/AuthTest.php deleted file mode 100644 index 5acaff2..0000000 --- a/src/AuthTest.php +++ /dev/null @@ -1,46 +0,0 @@ -url = getenv('POCKETBASE_URL') ?: 'https://admin.pocketbase.dev'; - $this->collection = new Collection($this->url, 'users'); - } - public function testAuthUser(): void - { - $actual = $this->collection->authAsUser('support@jonathan-martz.de', 'rockt'); - $expected = '{"data":{},"message":"Failed to authenticate.","status":400}'; - - $this->assertEquals($expected, trim($actual, PHP_EOL)); - } - - public function testAuthSuperUser(): void - { - $this->collection = new Collection($this->url, '_superusers'); - $actual = $this->collection->authAsAdmin('admin@jonathan-martz.de', 'rockt'); - $expected = '{"data":{},"message":"Failed to authenticate.","status":400}'; - - $this->assertEquals($expected, trim($actual, PHP_EOL)); - } - - public function testAuthSuperUser2(): void - { - $this->collection = new Collection($this->url, '_superusers'); - - $actual = $this->collection->authAsAdmin('admin@jonathan-martz.de', 'rockt'); - - $data = json_decode($actual,true); - $this->assertArrayHasKey('record',$data); - $this->assertArrayHasKey('token',$data); - $this->assertCount(8,$data['record']); - } -} \ No newline at end of file diff --git a/src/Client.php b/src/Client.php index baebd31..eafedc7 100644 --- a/src/Client.php +++ b/src/Client.php @@ -1,34 +1,52 @@ url = $url; + $this->baseurl = $baseurl ?? 'http://localhost:7090'; + $this->http = new HttpClient(); + $this->token = ''; } - public function collection(string $collection): Collection + public function collection(string $name): Collection { - return new Collection($this->url ,$collection, $this->token); + return new Collection($this->baseurl, $name); } - public function settings(): Settings - { - return new Settings($this->url, $this->token); + public function setBaseUrl($baseurl){ + $this->baseurl = $baseurl; } - public function setAuthToken(string $token): void - { - $this->token = $token; + public function getBaseUrl(){ + return $this->baseurl; } - public function getAuthToken(): string + public function getToken(): ?string { return $this->token; } -} + + public function setToken(?string $token): void + { + $this->token = $token; + } + + public function getHttp(): HttpClient + { + return $this->http; + } + + public function setHttp(HttpClient $http): Client + { + $this->http = $http; + return $this; + } +} \ No newline at end of file diff --git a/src/Collection.php b/src/Collection.php index 8e411a4..b7117cf 100644 --- a/src/Collection.php +++ b/src/Collection.php @@ -1,213 +1,146 @@ url = $url; - $this->collection = $collection; - if (!empty($token)) { - self::$token = $token; - } + return $this->path; } - /** - * @param int $start - * @param int $end - * @param array $queryParams - * @return array - */ - public function getList(int $start = 1, int $end = 50, array $queryParams = []): array + public function setPath(string $path): Collection { - $queryParams['perPage'] = $end; + $this->path = $path; + return $this; + } + + public function __construct(string $url = null, string $name = 'users') + { + $this->name = $name; + $this->http = new HttpClient(); + $this->client = new Client(); + } + + public function getFullList(int $batch, $bodyParams = [], array $queryParams = []): RecordListViewModel + { + $queryParams['limit'] = $batch; $getParams = !empty($queryParams) ? http_build_query($queryParams) : ""; - $response = $this->doRequest($this->url . "/api/collections/" . $this->collection . "/records?" . $getParams, 'GET'); - - return json_decode($response, JSON_FORCE_OBJECT); + return new RecordListViewModel( + json_decode( + $this->http->doRequest( + $this->client->getBaseUrl() . $this->path . '?' . $getParams, + 'GET', + $bodyParams, + $this->client->token + ), + true) + ); } - /** - * @param string $recordId - * @param string $field - * @param string $filepath - * @return void - */ - public function upload(string $recordId, string $field, string $filepath): void + public function getList(int $page, int $limit, $bodyParams = [], array $queryParams = []): RecordListViewModel { - $ch = curl_init($this->url . "/api/collections/" . $this->collection . "/records/" . $recordId); - curl_setopt_array($ch, array( - CURLOPT_CUSTOMREQUEST => 'PATCH', - CURLOPT_POSTFIELDS => array( - $field => new \CURLFile($filepath) - ) - )); - - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - - $headers = array('Content-Type: multipart/form-data'); - - curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); - - $response = curl_exec($ch); - } - - /** - * @param string $email - * @param string $password - * @return void - */ - public function authAsUser(string $email, string $password): string - { - $result = $this->doRequest($this->url . "/api/collections/users/auth-with-password", 'POST', ['identity' => $email, 'password' => $password]); - if (!empty($result['token'])) { - self::$token = $result['token']; - } - return $result; - } - - /** - * @param int $batch - * @param array $queryParams - * @return array - */ - public function getFullList(array $queryParams, int $batch = 200): array - { - $queryParams = [... $queryParams, 'perPage' => $batch]; $getParams = !empty($queryParams) ? http_build_query($queryParams) : ""; - $response = $this->doRequest($this->url . "/api/collections/" . $this->collection . "/records?" . $getParams, 'GET'); - - return json_decode($response, JSON_FORCE_OBJECT); + return new RecordListViewModel(json_decode( + $this->http->doRequest( + $this->client->getBaseUrl() . $this->path . '?' . $getParams, + 'GET', + $bodyParams, + $this->client->token + ), true)); } - /** - * @param string $filter - * @param array $queryParams - * @return array - */ - public function getFirstListItem(string $filter, array $queryParams = []): array + public function authAsUser(string $email, string $password): ?string { - $queryParams['perPage'] = 1; $getParams = !empty($queryParams) ? http_build_query($queryParams) : ""; - $response = $this->doRequest($this->url . "/api/collections/" . $this->collection . "/records?" . $getParams, 'GET'); - return json_decode($response, JSON_FORCE_OBJECT)['items'][0]; + $data = json_decode( + $this->http->doRequest( + $this->client->getBaseUrl() . '/api/collections/users/auth-with-password' . '?' . $getParams, + 'POST', + [ + 'identity' => $email, + 'password' => $password, + ] + ), true); + return $data['token']; } - /** - * @param array $bodyParams - * @param array $queryParams - * @return void - */ - public function create(array $bodyParams = [], array $queryParams = []): string + public function authAsAdmin(string $email, string $password): ?string { - return $this->doRequest($this->url . "/api/collections/" . $this->collection . "/records", 'POST', $bodyParams); + $getParams = !empty($queryParams) ? http_build_query($queryParams) : ""; + $data = json_decode($this->http->doRequest( + $this->client->baseurl . "/api/collections/_superusers/auth-with-password" . '?' . $getParams, + 'POST', + [ + 'identity' => $email, + 'password' => $password, + ]), true); + return $data['token']; } - /** - * @param string $recordId - * @param array $bodyParams - * @param array $queryParams - * @return void - */ - public function update(string $recordId, array $bodyParams = [], array $queryParams = []): void + public function create(array $bodyParams, array $queryParams = []): CustomRecordViewModel { - // Todo bodyParams equals json, currently workaround - $this->doRequest($this->url . "/api/collections/" . $this->collection . "/records/" . $recordId, 'PATCH', $bodyParams); + $getParams = !empty($queryParams) ? http_build_query($queryParams) : ""; + + return new CustomRecordViewModel(json_decode( + $this->http->doRequest( + $this->client->getBaseUrl() . $this->getPath() . '?' . $getParams, + 'POST', + $bodyParams, + $this->client->token + ), true) ?? []); } - /** - * @param string $recordId - * @param array $queryParams - * @return void - */ - public function delete(string $recordId, array $queryParams = []): void + public function update($id, $bodyParams, $token = '', array $queryParams = []): RecordViewModel { - $this->doRequest($this->url . "/api/collections/" . $this->collection . "/records/" . $recordId, 'DELETE'); + $getParams = !empty($queryParams) ? http_build_query($queryParams) : ""; + return new RecordViewModel(json_decode($this->http->doRequest( + $this->client->getBaseUrl() . '/api/collections/test/records/' . $id . '?' . $getParams + , 'PATCH', json_encode($bodyParams), $token), true)); } - /** - * @param string $recordId - * @param string $url - * @param string $method - * @return bool|string - */ - public function doRequest(string $url, string $method, $bodyParams = []): string + public function getOne($id, $token = '', array $queryParams = []): CustomRecordViewModel { - // TODO move doRequestIntoService ? - // TODO replace curl with HttpClient - $ch = curl_init(); - - if (self::$token != '') { - $headers = array( - 'Content-Type:application/json', - 'Authorization: ' . self::$token - ); - curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); - } - - if ($bodyParams) { - curl_setopt($ch, CURLOPT_POSTFIELDS, $bodyParams); - } - - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); - $output = curl_exec($ch); - curl_close($ch); - - return $output; + $getParams = !empty($queryParams) ? http_build_query($queryParams) : ""; + return new CustomRecordViewModel(json_decode($this->http->doRequest( + $this->client->getBaseUrl() . '/api/collections/test/records/' . $id . '?' . $getParams# + , 'GET', [], $token), true)); } - /** - * @param string $recordId - * @param array $queryParams - * @return mixed - */ - public function getOne(string $recordId, array $queryParams = []): array + public function delete($id, $token = '', array $queryParams = []): CustomRecordViewModel { - $output = $this->doRequest($this->url . "/api/collections/" . $this->collection . "/records/" . $recordId, 'GET'); - return json_decode($output, JSON_FORCE_OBJECT); + $getParams = !empty($queryParams) ? http_build_query($queryParams) : ""; + return new CustomRecordViewModel(json_decode($this->http->doRequest( + $this->client->getBaseUrl() . '/api/collections/test/records/' . $id . '?' . $getParams + , 'DELETE', [], $token), true)); } - /** - * @param string $email - * @param string $password - * @return void - */ - public function authAsAdmin(string $email, string $password): string + public function setClient(Client $client): void { - $bodyParams['identity'] = $email; - $bodyParams['password'] = $password; - $output = $this->doRequest($this->url . "/api/collections/_superusers/auth-with-password", 'POST', $bodyParams); - $token = json_decode($output, true)['token']; - if ($token) { - self::$token = $token; - } - - return $output; + $this->client = $client; } -} + + public function getName(): string + { + return $this->name; + } + + public function getAuthToken(): ?string + { + return $this->client->token; + } + + public function setHttp(HttpClient $httpClient): void + { + $this->http = $httpClient; + } +} \ No newline at end of file diff --git a/src/HttpClient.php b/src/HttpClient.php new file mode 100644 index 0000000..a101a8e --- /dev/null +++ b/src/HttpClient.php @@ -0,0 +1,31 @@ +url = $url; - self::$token = $token; - } - - public function authAsAdmin(string $email, string $password): void - { - $bodyParams['identity'] = $email; - $bodyParams['password'] = $password; - $output = $this->doRequest($this->url . "/api/collections/_superusers/auth-with-password", 'POST', $bodyParams); - $data = json_decode($output, true); - self::$token = $data['token'] ?? ''; - } - - public function doRequest(string $url, string $method, $bodyParams = []): string - { - $ch = curl_init(); - - if (self::$token != '') { - $headers = array( - 'Content-Type:application/json', - 'Authorization: ' . self::$token - ); - curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); - } - - if ($bodyParams) { - curl_setopt($ch, CURLOPT_POSTFIELDS, $bodyParams); - } - - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); - $output = curl_exec($ch); - curl_close($ch); - - return $output; - } - - public function getAll():array - { - return json_decode($this->doRequest($this->url . '/api/settings', 'GET', []), true); - } - - public function update($bodyParam):array{ - return json_decode($this->doRequest($this->url . '/api/settings', 'PATCH', json_encode($bodyParam)), true); - } -} diff --git a/src/SuperUser.php b/src/SuperUser.php deleted file mode 100644 index 6da5bfe..0000000 --- a/src/SuperUser.php +++ /dev/null @@ -1,8 +0,0 @@ - $item){ + $this->$key = $item; + } + + parent::__construct($data); + } +} \ No newline at end of file diff --git a/src/viewModel/RecordListViewModel.php b/src/viewModel/RecordListViewModel.php new file mode 100644 index 0000000..8788448 --- /dev/null +++ b/src/viewModel/RecordListViewModel.php @@ -0,0 +1,88 @@ +setItems($data['items']); + } + if (key_exists('page', $data)) { + $this->setPage($data['page']); + } + if (key_exists('perPage', $data)) { + $this->setPerPage($data['perPage']); + } + if (key_exists('totalItems', $data)) { + $this->setTotalItems($data['totalItems']); + } + if (key_exists('totalPages', $data)) { + $this->setTotalPages($data['totalPages']); + } + + parent::__construct($data); + } + + public function setTotalItems(int $totalItems): RecordListViewModel + { + $this->totalItems = $totalItems; + return $this; + } + + + public function getItems(): array + { + return $this->items; + } + + public function setItems(array $items): RecordListViewModel + { + $this->items = $items; + return $this; + } + + public function getPage(): int + { + return $this->page; + } + + public function setPage(int $page): RecordListViewModel + { + $this->page = $page; + return $this; + } + + public function getPerPage(): int + { + return $this->perPage; + } + + public function setPerPage(int $perPage): RecordListViewModel + { + $this->perPage = $perPage; + return $this; + } + + public function getTotalItems(): int + { + return $this->totalItems; + } + + public function getTotalPages(): int + { + return $this->totalPages; + } + + public function setTotalPages(int $totalPages): void + { + $this->totalPages = $totalPages; + } +} \ No newline at end of file diff --git a/src/viewModel/RecordViewModel.php b/src/viewModel/RecordViewModel.php new file mode 100644 index 0000000..f00717f --- /dev/null +++ b/src/viewModel/RecordViewModel.php @@ -0,0 +1,86 @@ +setId($data['id']); + } + if(key_exists('updated', $data)){ + $this->setUpdated($data['updated']); + } + if(key_exists('created', $data)){ + $this->setCreated($data['created']); + } + if(key_exists('collectionName', $data)){ + $this->setCollectionName($data['collectionName']); + } + if(key_exists('collectionId', $data)){ + $this->setCollectionId($data['collectionId']); + } + } + + public function getCollectionName(): string + { + return $this->collectionName; + } + + public function setCollectionName(string $collectionName): RecordViewModel + { + $this->collectionName = $collectionName; + return $this; + } + + public function getCollectionId(): string + { + return $this->collectionId; + } + + public function setCollectionId(string $collectionId): RecordViewModel + { + $this->collectionId = $collectionId; + return $this; + } + + public function getCreated(): string + { + return $this->created; + } + + public function setCreated(string $created): RecordViewModel + { + $this->created = $created; + return $this; + } + + public function getUpdated(): string + { + return $this->updated; + } + + public function setUpdated(string $updated): RecordViewModel + { + $this->updated = $updated; + return $this; + } + + public function getId(): string + { + return $this->id; + } + + public function setId(string $id): RecordViewModel + { + $this->id = $id; + return $this; + } +} \ No newline at end of file diff --git a/src/viewModels/CollectionItem.php b/src/viewModels/CollectionItem.php deleted file mode 100644 index 40c2523..0000000 --- a/src/viewModels/CollectionItem.php +++ /dev/null @@ -1,14 +0,0 @@ -collection = new Collection($url, 'users'); - } - - public function test_getOne(): void - { - $id = '6588yk36406qqv1'; - $actual = $this->collection->getFirstListItem('id="'.$id.'"'); - $expected = [ - 'avatar' => '', - 'collectionId' => '_pb_users_auth_', - 'collectionName' => 'users', - 'created' => '2025-01-21 21:22:47.002Z', - 'emailVisibility' => false, - 'id' => '6588yk36406qqv1', - 'name' => 'Jonathan Martz', - 'updated' => '2025-01-21 21:22:47.002Z', - 'verified' => true - ]; - - $this->assertEquals($expected, $actual); - $this->assertCount(9, $actual); - } - - public function test_getOneWrongId(): void - { - $id = '6588yk36406qqva'; - $actual = $this->collection->getFirstListItem('id="'.$id.'"'); - $expected = [ - 'avatar' => '', - 'collectionId' => '_pb_users_auth_', - 'collectionName' => 'users', - 'created' => '2025-01-21 21:22:47.002Z', - 'emailVisibility' => false, - 'id' => '6588yk36406qqv1', - 'name' => 'Jonathan Martz', - 'updated' => '2025-01-21 21:22:47.002Z', - 'verified' => true - ]; - - $this->assertEquals($expected, $actual); - $this->assertCount(9,$actual); - } -} \ No newline at end of file diff --git a/tests/CollectionGetFullListTest.php b/tests/CollectionGetFullListTest.php deleted file mode 100644 index 70bc6de..0000000 --- a/tests/CollectionGetFullListTest.php +++ /dev/null @@ -1,28 +0,0 @@ -url = getenv('POCKETBASE_URL') ?: 'https://admin.pocketbase.dev'; - $this->collection = new Collection($this->url, 'users'); - } - - public function test_getFullList_gettingArrayWithOneUser(): void - { - $actual = $this->collection->getFullList([],100); - - $this->assertArrayHasKey('items', $actual, 'Key "items" does not exist in the response.'); - $this->assertArrayHasKey('page', $actual, 'Key "page" does not exist in the response.'); - $this->assertArrayHasKey('perPage', $actual, 'Key "perPage" does not exist in the response.'); - $this->assertArrayHasKey('totalItems', $actual, 'Key "totalItems" does not exist in the response.'); - $this->assertArrayHasKey('totalPages', $actual, 'Key "totalPages" does not exist in the response.'); - $this->assertCount(1, $actual['items'], 'Expected no items in the response.'); - } -} \ No newline at end of file diff --git a/tests/CollectionGetListTest.php b/tests/CollectionGetListTest.php deleted file mode 100644 index a25cbd8..0000000 --- a/tests/CollectionGetListTest.php +++ /dev/null @@ -1,76 +0,0 @@ -url = getenv('POCKETBASE_URL') ?: 'https://admin.pocketbase.dev'; - $this->collection = new Collection($this->url, 'users'); - } - - public function test_getList_gettingArrayWithOneItem(): void - { - $actual = $this->collection->getList(1, 10); - - $this->assertArrayHasKey('items', $actual, 'Key "items" does not exist in the response.'); - $this->assertArrayHasKey('page', $actual, 'Key "page" does not exist in the response.'); - $this->assertArrayHasKey('perPage', $actual, 'Key "perPage" does not exist in the response.'); - $this->assertArrayHasKey('totalItems', $actual, 'Key "totalItems" does not exist in the response.'); - $this->assertArrayHasKey('totalPages', $actual, 'Key "totalPages" does not exist in the response.'); - $this->assertCount(1, $actual['items'], 'Expected no items in the response.'); - } - - public function test_getListWithContainsMartz(): void - { - $actual = $this->collection->getList(1, 10, ['filter'=>'name~"%Martz%"']); - - $this->assertArrayHasKey('items', $actual, 'Key "items" does not exist in the response.'); - $this->assertArrayHasKey('page', $actual, 'Key "page" does not exist in the response.'); - $this->assertArrayHasKey('perPage', $actual, 'Key "perPage" does not exist in the response.'); - $this->assertArrayHasKey('totalItems', $actual, 'Key "totalItems" does not exist in the response.'); - $this->assertArrayHasKey('totalPages', $actual, 'Key "totalPages" does not exist in the response.'); - $this->assertCount(1, $actual['items'], 'Expected no items in the response.'); - } - - public function test_getListStartsWithMartz(): void - { - $actual = $this->collection->getList(1, 10, ['filter'=>'name~"Martz%"']); - - $this->assertArrayHasKey('items', $actual, 'Key "items" does not exist in the response.'); - $this->assertArrayHasKey('page', $actual, 'Key "page" does not exist in the response.'); - $this->assertArrayHasKey('perPage', $actual, 'Key "perPage" does not exist in the response.'); - $this->assertArrayHasKey('totalItems', $actual, 'Key "totalItems" does not exist in the response.'); - $this->assertArrayHasKey('totalPages', $actual, 'Key "totalPages" does not exist in the response.'); - $this->assertCount(0, $actual['items'], 'Expected no items in the response.'); - } - - public function test_getListStartWithJonathan(): void - { - $actual = $this->collection->getList(1, 10, ['filter'=>'name~"Jonathan%"']); - - $this->assertArrayHasKey('items', $actual, 'Key "items" does not exist in the response.'); - $this->assertArrayHasKey('page', $actual, 'Key "page" does not exist in the response.'); - $this->assertArrayHasKey('perPage', $actual, 'Key "perPage" does not exist in the response.'); - $this->assertArrayHasKey('totalItems', $actual, 'Key "totalItems" does not exist in the response.'); - $this->assertArrayHasKey('totalPages', $actual, 'Key "totalPages" does not exist in the response.'); - $this->assertCount(1, $actual['items'], 'Expected no items in the response.'); - } - - public function test_getListCheckingDifferentName(): void - { - $actual = $this->collection->getList(1, 10, ['filter'=>'name~"%Sibylle%"']); - - $this->assertArrayHasKey('items', $actual, 'Key "items" does not exist in the response.'); - $this->assertArrayHasKey('page', $actual, 'Key "page" does not exist in the response.'); - $this->assertArrayHasKey('perPage', $actual, 'Key "perPage" does not exist in the response.'); - $this->assertArrayHasKey('totalItems', $actual, 'Key "totalItems" does not exist in the response.'); - $this->assertArrayHasKey('totalPages', $actual, 'Key "totalPages" does not exist in the response.'); - $this->assertCount(0, $actual['items'], 'Expected no items in the response.'); - } -} \ No newline at end of file diff --git a/tests/CollectionGetOneTest.php b/tests/CollectionGetOneTest.php deleted file mode 100644 index f92d2ed..0000000 --- a/tests/CollectionGetOneTest.php +++ /dev/null @@ -1,50 +0,0 @@ -url = getenv('POCKETBASE_URL') ?: 'https://admin.pocketbase.dev'; - $this->collection = new Collection($this->url, 'users'); - } - - public function test_getOne(): void - { - $id = '6588yk36406qqv1'; - $actual = $this->collection->getOne($id); - $expected = [ - 'avatar' => '', - 'collectionId' => '_pb_users_auth_', - 'collectionName' => 'users', - 'created' => '2025-01-21 21:22:47.002Z', - 'emailVisibility' => false, - 'id' => '6588yk36406qqv1', - 'name' => 'Jonathan Martz', - 'updated' => '2025-01-21 21:22:47.002Z', - 'verified' => true - ]; - - $this->assertEquals($expected, $actual); - $this->assertCount(9, $actual); - } - - public function test_getOneWrongId(): void - { - $id = '6588yk36406qqva'; - $actual = $this->collection->getOne($id); - $expected = [ - 'data' => [], - 'message' => "The requested resource wasn't found.", - 'status' => 404, - ]; - - $this->assertEquals($expected, $actual); - $this->assertCount(3,$actual); - } -} \ No newline at end of file diff --git a/tests/CollectionTest.php b/tests/CollectionTest.php new file mode 100644 index 0000000..79a0fd0 --- /dev/null +++ b/tests/CollectionTest.php @@ -0,0 +1,174 @@ +collection = new Collection(null, 'users'); + $this->collection + ->setClient(new Client('http://localhost:7090')); + $this->collection->setPath("/api/collections/" . $this->collection->getName() . "/records"); + $data = $this->collection + ->getFullList(10, []); + + $this->assertEquals(RecordListViewModel::class, get_class($data)); + $this->assertCount(0, $data->getItems()); + } + + public function test_getFullList_ownUser() + { + $this->collection = new Collection(null, 'users'); + $token = $this->collection->authAsUser('admin@jonathan-martz.de', 'Password123'); + + $this->client = new Client('http://localhost:7090'); + $this->client->setToken($token); + $this->collection->setPath('/api/collections/' . $this->collection->getName() . '/records'); + $this->collection->setClient($this->client); + + $data = $this->collection->getFullList(10, []); + $this->assertEquals(RecordListViewModel::class, get_class($data)); + $this->assertCount(1, $data->getItems()); + } + + public function test_getFullList_ownAdmin() + { + $this->collection = new Collection(null, 'users'); + $token = $this->collection->authAsAdmin('admin@jonathan-martz.de', 'Password123'); + + $this->client = new Client('http://localhost:7090'); + $this->client->setToken($token); + $this->collection->setPath('/api/collections/' . $this->collection->getName() . '/records'); + $this->collection->setClient($this->client); + + $data = $this->collection->getFullList(10, []); + $this->assertEquals(RecordListViewModel::class, get_class($data)); + $this->assertCount(2, $data->getItems()); + } + + public function test_create_record(): void + { + $this->client = new \PocketBase\Client(null); + $this->collection = $this->client->collection('users'); + $this->collection->setPath('/api/collections/users/records'); + + $record = $this->collection->create([ + 'email' => 'admin@jonathan-martz.de', + 'password' => 'Password123', + 'passwordConfirm' => 'Password123', + ]); + $this->assertEquals(CustomRecordViewModel::class, get_class($record)); + } + + public function test_update_record(): void + { + $this->client = new \PocketBase\Client(null); + $this->collection = $this->client->collection('users'); + $token = $this->collection->authAsUser('admin@jonathan-martz.de', 'Password123'); + + $this->client->setToken($token); + $this->collection = $this->client->collection('test'); + $this->collection->setClient($this->client); + $this->collection->setPath('/api/collections/test/records/'); + + try { + $record = $this->collection->update('ss05u9mnegvplds', [ + 'name' => 'Test123456' + ], $token); + } catch (Exception $exception) { + $this->fail('Exception: ' . $exception->getMessage()); + } + $this->assertEquals(RecordViewModelAlias::class, get_class($record)); + } + + public function test_getone_record(): void + { + $this->client = new \PocketBase\Client(null); + $this->collection = $this->client->collection('users'); + $token = $this->collection->authAsUser('admin@jonathan-martz.de', 'Password123'); + + $this->client->setToken($token); + $this->collection = $this->client->collection('test'); + $this->collection->setClient($this->client); + $this->collection->setPath('/api/collections/test/records/'); + + try { + $record = $this->collection->getOne('ss05u9mnegvplds', $token); + } catch (Exception $exception) { + $this->fail('Exception: ' . $exception->getMessage()); + } + $this->assertEquals(CustomRecordViewModel::class, get_class($record)); + } + + public function test_getlist_record(): void + { + $this->client = new \PocketBase\Client(null); + $this->collection = $this->client->collection('users'); + $token = $this->collection->authAsUser('admin@jonathan-martz.de', 'Password123'); + + $this->client->setToken($token); + $this->collection = $this->client->collection('test'); + $this->collection->setClient($this->client); + $this->collection->setPath('/api/collections/users/records/'); + + try { + $record = $this->collection->getList(1, 10); + } catch (Exception $exception) { + $this->fail('Exception: ' . $exception->getMessage()); + } + $this->assertEquals(RecordListViewModel::class, get_class($record)); + } + + public function test_delete_record(): void + { + $this->client = new \PocketBase\Client(null); + $this->collection = $this->client->collection('users'); + $token = $this->collection->authAsUser('admin@jonathan-martz.de', 'Password123'); + + $this->client->setToken($token); + $this->collection = $this->client->collection('test'); + $this->collection->setClient($this->client); + $this->collection->setPath('/api/collections/test/records/'); + + try { + $this->collection->delete('65uahqp4wicc88l'); + } catch (Exception $exception) { + $this->fail('Exception: ' . $exception->getMessage()); + } + $this->assertTrue(true); + } + + public function test_upload_record(): void + { + $this->markTestSkipped('todo'); + $this->client = new \PocketBase\Client(null); + $this->collection = $this->client->collection('users'); + $token = $this->collection->authAsUser('admin@jonathan-martz.de', 'Password123'); + + $this->client->setToken($token); + $this->collection = $this->client->collection('test'); + $this->collection->setPath('/api/collections/users/records/'); + $this->collection->setClient($this->client); + + try { + $record = $this->collection->getList(1, 10); + } catch (Exception $exception) { + $this->fail('Exception: ' . $exception->getMessage()); + } + $this->assertEquals(RecordListViewModel::class, get_class($record)); + } +} \ No newline at end of file