diff --git a/src/CrowdinApiClient/Api/ProjectApi.php b/src/CrowdinApiClient/Api/ProjectApi.php index 214e9c9f..dbf71396 100644 --- a/src/CrowdinApiClient/Api/ProjectApi.php +++ b/src/CrowdinApiClient/Api/ProjectApi.php @@ -2,6 +2,8 @@ namespace CrowdinApiClient\Api; +use CrowdinApiClient\Model\DownloadFile; +use CrowdinApiClient\Model\FileFormatSettings; use CrowdinApiClient\Model\Project; use CrowdinApiClient\ModelCollection; @@ -13,7 +15,6 @@ */ class ProjectApi extends AbstractApi { - /** * List Projects * @link https://developer.crowdin.com/api/v2/#operation/api.projects.getMany API Documentation @@ -36,9 +37,6 @@ public function list(array $params = []): ModelCollection * Get Project Info * @link https://developer.crowdin.com/api/v2/#operation/api.projects.get API Documentation * @link https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.get API Documentation Enterprise - * - * @param int $projectId - * @return Project|null */ public function get(int $projectId): ?Project { @@ -81,9 +79,6 @@ public function create(array $data): ?Project * Edit Project Info * @link https://developer.crowdin.com/api/v2/#operation/api.projects.patch API Documentation * @link https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.patch API Documentation Enterprise - * - * @param Project $project - * @return mixed */ public function update(Project $project): ?Project { @@ -102,4 +97,85 @@ public function delete(int $projectId) { return $this->client->apiRequest('delete', 'projects/' . $projectId); } + + /** + * Download Project File Format Settings Custom Segmentation + * @link https://support.crowdin.com/developer/api/v2/#tag/Projects/operation/api.projects.file-format-settings.custom-segmentations.get + * @link https://support.crowdin.com/developer/enterprise/api/v2/#tag/Projects-and-Groups/operation/api.projects.file-format-settings.custom-segmentations.get + */ + public function downloadFileFormatSettingsCustomSegmentation( + int $projectId, + int $fileFormatSettingsId + ): ?DownloadFile { + $path = sprintf('projects/%d/file-format-settings/%d/custom-segmentations', $projectId, $fileFormatSettingsId); + return $this->_get($path, DownloadFile::class); + } + + /** + * Reset Project File Format Settings Custom Segmentation + * @link https://support.crowdin.com/developer/api/v2/#tag/Projects/operation/api.projects.file-format-settings.custom-segmentations.delete + * @link https://support.crowdin.com/developer/enterprise/api/v2/#tag/Projects-and-Groups/operation/api.projects.file-format-settings.custom-segmentations.delete + */ + public function resetFileFormatSettingsCustomSegmentation(int $projectId, int $fileFormatSettingsId): void + { + $this->_delete( + sprintf('projects/%d/file-format-settings/%d/custom-segmentations', $projectId, $fileFormatSettingsId) + ); + } + + /** + * List Project File Format Settings + * @link https://support.crowdin.com/developer/api/v2/#tag/Projects/operation/api.projects.file-format-settings.getMany + * @link https://support.crowdin.com/developer/enterprise/api/v2/#tag/Projects-and-Groups/operation/api.projects.file-format-settings.getMany + */ + public function listFileFormatSettings(int $projectId, array $params = []): ModelCollection + { + $path = sprintf('projects/%d/file-format-settings', $projectId); + return $this->_list($path, FileFormatSettings::class, $params); + } + + /** + * Add Project File Format Settings + * @link https://support.crowdin.com/developer/api/v2/#tag/Projects/operation/api.projects.file-format-settings.post + * @link https://support.crowdin.com/developer/enterprise/api/v2/#tag/Projects-and-Groups/operation/api.projects.file-format-settings.post + */ + public function createFileFormatSettings(int $projectId, array $data): ?FileFormatSettings + { + $path = sprintf('projects/%d/file-format-settings', $projectId); + return $this->_create($path, FileFormatSettings::class, $data); + } + + /** + * Get Project File Format Settings + * @link https://support.crowdin.com/developer/api/v2/#tag/Projects/operation/api.projects.file-format-settings.get + * @link https://support.crowdin.com/developer/enterprise/api/v2/#tag/Projects-and-Groups/operation/api.projects.file-format-settings.get + */ + public function getFileFormatSettings(int $projectId, int $fileFormatSettingsId): ?FileFormatSettings + { + $path = sprintf('projects/%d/file-format-settings/%d', $projectId, $fileFormatSettingsId); + return $this->_get($path, FileFormatSettings::class); + } + + /** + * Delete Project File Format Settings + * @link https://support.crowdin.com/developer/api/v2/#tag/Projects/operation/api.projects.file-format-settings.delete + * @link https://support.crowdin.com/developer/enterprise/api/v2/#tag/Projects-and-Groups/operation/api.projects.file-format-settings.delete + */ + public function deleteFileFormatSettings(int $projectId, int $fileFormatSettingsId): void + { + $this->_delete(sprintf('projects/%d/file-format-settings/%d', $projectId, $fileFormatSettingsId)); + } + + /** + * Edit Project File Format Settings + * @link https://support.crowdin.com/developer/api/v2/#tag/Projects/operation/api.projects.file-format-settings.patch + * @link https://support.crowdin.com/developer/enterprise/api/v2/#tag/Projects-and-Groups/operation/api.projects.file-format-settings.patch + */ + public function updateFileFormatSettings( + int $projectId, + FileFormatSettings $fileFormatSettings + ): ?FileFormatSettings { + $path = sprintf('projects/%d/file-format-settings/%d', $projectId, $fileFormatSettings->getId()); + return $this->_update($path, $fileFormatSettings); + } } diff --git a/src/CrowdinApiClient/Model/FileFormatSettings.php b/src/CrowdinApiClient/Model/FileFormatSettings.php new file mode 100644 index 00000000..2586bff6 --- /dev/null +++ b/src/CrowdinApiClient/Model/FileFormatSettings.php @@ -0,0 +1,107 @@ +id = (int)$this->getDataProperty('id'); + $this->name = (string)$this->getDataProperty('name'); + $this->format = (string)$this->getDataProperty('format'); + $this->extensions = (array)$this->getDataProperty('extensions'); + $this->settings = (array)$this->getDataProperty('settings'); + $this->createdAt = (string)$this->getDataProperty('createdAt'); + $this->updatedAt = (string)$this->getDataProperty('updatedAt'); + } + + public function getId(): int + { + return $this->id; + } + + public function getName(): string + { + return $this->name; + } + + public function getFormat(): string + { + return $this->format; + } + + public function setFormat(string $format): void + { + $this->format = $format; + } + + /** + * @return string[] + */ + public function getExtensions(): array + { + return $this->extensions; + } + + public function getSettings(): array + { + return $this->settings; + } + + public function setSettings(array $settings): void + { + $this->settings = $settings; + } + + public function getCreatedAt(): string + { + return $this->createdAt; + } + + public function getUpdatedAt(): string + { + return $this->updatedAt; + } +} diff --git a/tests/CrowdinApiClient/Api/AbstractTestApi.php b/tests/CrowdinApiClient/Api/AbstractTestApi.php index cab084da..d5846770 100644 --- a/tests/CrowdinApiClient/Api/AbstractTestApi.php +++ b/tests/CrowdinApiClient/Api/AbstractTestApi.php @@ -85,6 +85,16 @@ public function mockRequestGet(string $path, string $response, array $options = ]); } + public function mockRequestPost(string $path, string $body, string $response) + { + return $this->mockRequest([ + 'uri' => 'https://api.crowdin.com/api/v2' . $path, + 'method' => 'post', + 'body' => $body, + 'response' => $response, + ]); + } + public function mockRequestDelete(string $path) { return $this->mockRequest([ diff --git a/tests/CrowdinApiClient/Api/ProjectApiTest.php b/tests/CrowdinApiClient/Api/ProjectApiTest.php index 2cacd2cf..432651be 100644 --- a/tests/CrowdinApiClient/Api/ProjectApiTest.php +++ b/tests/CrowdinApiClient/Api/ProjectApiTest.php @@ -1,46 +1,48 @@ mockRequest([ 'path' => '/projects', 'method' => 'get', - 'response' => '{ - "data": [ - { - "data": { - "id": 8, - "userId": 6, - "sourceLanguageId": "uk", - "targetLanguageIds": [ - "es" + 'response' => json_encode([ + 'data' => [ + [ + 'data' => [ + 'id' => 8, + 'userId' => 6, + 'sourceLanguageId' => 'uk', + 'targetLanguageIds' => ['es'], + 'languageAccessPolicy' => 'moderate', + 'name' => 'Knowledge Base', + 'cname' => 'my-custom-domain.crowdin.com', + 'identifier' => '1f198a4e907688bc65834a6d5a6000c3', + 'description' => 'Vault of all terms and their explanation', + 'visibility' => 'private', + 'logo' => 'data:image/png;base64,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', + 'createdAt' => '2019-09-20T11:34:40+00:00', + 'updatedAt' => '2019-09-20T11:34:40+00:00', ], - "languageAccessPolicy": "moderate", - "name": "Knowledge Base", - "cname": "my-custom-domain.crowdin.com", - "identifier": "1f198a4e907688bc65834a6d5a6000c3", - "description": "Vault of all terms and their explanation", - "visibility": "private", - "logo": "data:image/png;base64,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", - "createdAt": "2019-09-20T11:34:40+00:00", - "updatedAt": "2019-09-20T11:34:40+00:00" - } - } - ], - "pagination": [ - { - "offset": 0, - "limit": 0 - } - ] - }' + ], + ], + 'pagination' => [ + [ + 'offset' => 0, + 'limit' => 0, + ], + ], + ]), ]); $projects = $this->crowdin->project->list(); @@ -51,227 +53,224 @@ public function testList() $this->assertEquals(8, $projects[0]->getId()); } - public function testCreate() + public function testCreate(): void { $params = [ 'name' => 'Knowledge Base', 'identifier' => '1f198a4e907688bc65834a6d5a6000c3', 'type' => 1, 'sourceLanguageId' => 'uk', - 'targetLanguageIds' => - [ - 0 => 'es', - ], + 'targetLanguageIds' => [ + 0 => 'es', + ], 'visibility' => 'private', 'languageAccessPolicy' => 'moderate', 'cname' => 'my-custom-domain.crowdin.com', 'description' => 'Articles and tutorials', 'qaCheckIsActive' => true, - 'qaCheckCategories' => - [ - 'empty' => true, - 'size' => true, - 'tags' => true, - 'spaces' => true, - 'variables' => true, - 'punctuation' => true, - 'symbolRegister' => true, - 'specialSymbols' => true, - 'wrongTranslation' => true, - 'spellcheck' => true, - 'icu' => true, - ], - 'qaChecksIgnorableCategories' => - [ - 'empty' => false, - 'size' => true, - 'tags' => true, - 'spaces' => true, - 'variables' => true, - 'punctuation' => true, - 'symbolRegister' => true, - 'specialSymbols' => true, - 'wrongTranslation' => true, - 'spellcheck' => true, - 'icu' => false, - 'terms' => true, - 'duplicate' => false, - 'ftl' => false, - 'android' => true, - ], + 'qaCheckCategories' => [ + 'empty' => true, + 'size' => true, + 'tags' => true, + 'spaces' => true, + 'variables' => true, + 'punctuation' => true, + 'symbolRegister' => true, + 'specialSymbols' => true, + 'wrongTranslation' => true, + 'spellcheck' => true, + 'icu' => true, + ], + 'qaChecksIgnorableCategories' => [ + 'empty' => false, + 'size' => true, + 'tags' => true, + 'spaces' => true, + 'variables' => true, + 'punctuation' => true, + 'symbolRegister' => true, + 'specialSymbols' => true, + 'wrongTranslation' => true, + 'spellcheck' => true, + 'icu' => false, + 'terms' => true, + 'duplicate' => false, + 'ftl' => false, + 'android' => true, + ], ]; $this->mockRequest([ 'path' => '/projects', 'method' => 'post', 'body' => json_encode($params), - 'response' => '{ - "data": { - "id": 8, - "userId": 6, - "sourceLanguageId": "uk", - "targetLanguageIds": [ - "es" + 'response' => json_encode([ + 'data' => [ + 'id' => 8, + 'userId' => 6, + 'sourceLanguageId' => 'uk', + 'targetLanguageIds' => ['es'], + 'targetLanguages' => [ + [ + 'id' => 'es', + 'name' => 'Spanish', + 'editorCode' => 'es', + 'twoLettersCode' => 'es', + 'threeLettersCode' => 'spa', + 'locale' => 'es-ES', + 'androidCode' => 'es-rES', + 'osxCode' => 'es.lproj', + 'osxLocale' => 'es', + 'pluralCategoryNames' => [], + 'pluralRules' => '(n != 1)', + 'pluralExamples' => [], + 'textDirection' => 'ltr', + 'dialectOf' => 'string', + ], ], - "targetLanguages": [ - { - "id": "es", - "name": "Spanish", - "editorCode": "es", - "twoLettersCode": "es", - "threeLettersCode": "spa", - "locale": "es-ES", - "androidCode": "es-rES", - "osxCode": "es.lproj", - "osxLocale": "es", - "pluralCategoryNames": [], - "pluralRules": "(n != 1)", - "pluralExamples": [], - "textDirection": "ltr", - "dialectOf": "string" - } + 'languageAccessPolicy' => 'moderate', + 'name' => 'Knowledge Base', + 'cname' => 'my-custom-domain.crowdin.com', + 'identifier' => '1f198a4e907688bc65834a6d5a6000c3', + 'description' => 'Vault of all terms and their explanation', + 'visibility' => 'private', + 'logo' => 'data:image/png;base64,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', + 'hiddenStringsProofreadersAccess' => true, + 'inContextProcessHiddenStrings' => false, + 'glossaryAccess' => true, + 'normalizePlaceholder' => false, + 'saveMetaInfoInSource' => true, + 'notificationSettings' => [ + 'translatorNewStrings' => 'false', + 'managerNewStrings' => 'false', + 'managerLanguageCompleted' => 'false', ], - "languageAccessPolicy": "moderate", - "name": "Knowledge Base", - "cname": "my-custom-domain.crowdin.com", - "identifier": "1f198a4e907688bc65834a6d5a6000c3", - "description": "Vault of all terms and their explanation", - "visibility": "private", - "logo": "data:image/png;base64,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", - "hiddenStringsProofreadersAccess": true, - "inContextProcessHiddenStrings": false, - "glossaryAccess": true, - "normalizePlaceholder": false, - "saveMetaInfoInSource": true, - "notificationSettings": { - "translatorNewStrings": "false", - "managerNewStrings": "false", - "managerLanguageCompleted": "false" - }, - "qaCheckIsActive": true, - "qaCheckCategories": { - "empty": "true", - "size": "true", - "tags": "true", - "spaces": "true", - "variables": "true", - "punctuation": "true", - "symbolRegister": "true", - "specialSymbols": "true", - "wrongTranslation": "true", - "spellcheck": "true", - "icu": "true" - }, - "qaChecksIgnorableCategories": { - "empty": "false", - "size": "true", - "tags": "true", - "spaces": "true", - "variables": "true", - "punctuation": "true", - "symbolRegister": "true", - "specialSymbols": "true", - "wrongTranslation": "true", - "spellcheck": "true", - "icu": "false", - "terms": "true", - "duplicate": "false", - "ftl": "false", - "android": "true" - }, - "createdAt": "2019-09-20T11:34:40+00:00", - "updatedAt": "2019-09-20T11:34:40+00:00" - } - }' + 'qaCheckIsActive' => true, + 'qaCheckCategories' => [ + 'empty' => 'true', + 'size' => 'true', + 'tags' => 'true', + 'spaces' => 'true', + 'variables' => 'true', + 'punctuation' => 'true', + 'symbolRegister' => 'true', + 'specialSymbols' => 'true', + 'wrongTranslation' => 'true', + 'spellcheck' => 'true', + 'icu' => 'true', + ], + 'qaChecksIgnorableCategories' => [ + 'empty' => 'false', + 'size' => 'true', + 'tags' => 'true', + 'spaces' => 'true', + 'variables' => 'true', + 'punctuation' => 'true', + 'symbolRegister' => 'true', + 'specialSymbols' => 'true', + 'wrongTranslation' => 'true', + 'spellcheck' => 'true', + 'icu' => 'false', + 'terms' => 'true', + 'duplicate' => 'false', + 'ftl' => 'false', + 'android' => 'true', + ], + 'createdAt' => '2019-09-20T11:34:40+00:00', + 'updatedAt' => '2019-09-20T11:34:40+00:00', + ], + ]), ]); $project = $this->crowdin->project->create($params); + $this->assertInstanceOf(Project::class, $project); $this->assertEquals(8, $project->getId()); $this->assertEquals('es', $project->getTargetLanguageIds()[0]); $this->assertEquals('1f198a4e907688bc65834a6d5a6000c3', $project->getIdentifier()); } - public function testInfoGetAndUpdate() + public function testInfoGetAndUpdate(): void { - $this->mockRequestGet('/projects/8', '{ - "data": { - "id": 8, - "userId": 6, - "sourceLanguageId": "uk", - "targetLanguageIds": [ - "es" - ], - "targetLanguages": [ - { - "id": "es", - "name": "Spanish", - "editorCode": "es", - "twoLettersCode": "es", - "threeLettersCode": "spa", - "locale": "es-ES", - "androidCode": "es-rES", - "osxCode": "es.lproj", - "osxLocale": "es", - "pluralCategoryNames": [], - "pluralRules": "(n != 1)", - "pluralExamples": [], - "textDirection": "ltr", - "dialectOf": "string" - } - ], - "languageAccessPolicy": "moderate", - "name": "Knowledge Base", - "cname": "my-custom-domain.crowdin.com", - "identifier": "1f198a4e907688bc65834a6d5a6000c3", - "description": "Vault of all terms and their explanation", - "visibility": "private", - "logo": "data:image/png;base64,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", - "hiddenStringsProofreadersAccess": true, - "inContextProcessHiddenStrings": false, - "glossaryAccess": true, - "normalizePlaceholder": false, - "saveMetaInfoInSource": true, - "notificationSettings": { - "translatorNewStrings": "false", - "managerNewStrings": "false", - "managerLanguageCompleted": "false" - }, - "qaCheckIsActive": true, - "qaCheckCategories": { - "empty": "true", - "size": "true", - "tags": "true", - "spaces": "true", - "variables": "true", - "punctuation": "true", - "symbolRegister": "true", - "specialSymbols": "true", - "wrongTranslation": "true", - "spellcheck": "true", - "icu": "true" - }, - "qaChecksIgnorableCategories": { - "empty": "false", - "size": "true", - "tags": "true", - "spaces": "true", - "variables": "true", - "punctuation": "true", - "symbolRegister": "true", - "specialSymbols": "true", - "wrongTranslation": "true", - "spellcheck": "true", - "icu": "false", - "terms": "true", - "duplicate": "false", - "ftl": "false", - "android": "true" - }, - "createdAt": "2019-09-20T11:34:40+00:00", - "updatedAt": "2019-09-20T11:34:40+00:00" - } - }'); + $this->mockRequestGet( + '/projects/8', + json_encode([ + 'data' => [ + 'id' => 8, + 'userId' => 6, + 'sourceLanguageId' => 'uk', + 'targetLanguageIds' => ['es'], + 'targetLanguages' => [ + [ + 'id' => 'es', + 'name' => 'Spanish', + 'editorCode' => 'es', + 'twoLettersCode' => 'es', + 'threeLettersCode' => 'spa', + 'locale' => 'es-ES', + 'androidCode' => 'es-rES', + 'osxCode' => 'es.lproj', + 'osxLocale' => 'es', + 'pluralCategoryNames' => [], + 'pluralRules' => '(n != 1)', + 'pluralExamples' => [], + 'textDirection' => 'ltr', + 'dialectOf' => 'string', + ], + ], + 'languageAccessPolicy' => 'moderate', + 'name' => 'Knowledge Base', + 'cname' => 'my-custom-domain.crowdin.com', + 'identifier' => '1f198a4e907688bc65834a6d5a6000c3', + 'description' => 'Vault of all terms and their explanation', + 'visibility' => 'private', + 'logo' => 'data:image/png;base64,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', + 'hiddenStringsProofreadersAccess' => true, + 'inContextProcessHiddenStrings' => false, + 'glossaryAccess' => true, + 'normalizePlaceholder' => false, + 'saveMetaInfoInSource' => true, + 'notificationSettings' => [ + 'translatorNewStrings' => 'false', + 'managerNewStrings' => 'false', + 'managerLanguageCompleted' => 'false', + ], + 'qaCheckIsActive' => true, + 'qaCheckCategories' => [ + 'empty' => 'true', + 'size' => 'true', + 'tags' => 'true', + 'spaces' => 'true', + 'variables' => 'true', + 'punctuation' => 'true', + 'symbolRegister' => 'true', + 'specialSymbols' => 'true', + 'wrongTranslation' => 'true', + 'spellcheck' => 'true', + 'icu' => 'true', + ], + 'qaChecksIgnorableCategories' => [ + 'empty' => 'false', + 'size' => 'true', + 'tags' => 'true', + 'spaces' => 'true', + 'variables' => 'true', + 'punctuation' => 'true', + 'symbolRegister' => 'true', + 'specialSymbols' => 'true', + 'wrongTranslation' => 'true', + 'spellcheck' => 'true', + 'icu' => 'false', + 'terms' => 'true', + 'duplicate' => 'false', + 'ftl' => 'false', + 'android' => 'true', + ], + 'createdAt' => '2019-09-20T11:34:40+00:00', + 'updatedAt' => '2019-09-20T11:34:40+00:00', + ], + ]) + ); $project = $this->crowdin->project->get(8); @@ -279,83 +278,85 @@ public function testInfoGetAndUpdate() $this->assertEquals(8, $project->getId()); $project->setName('edit test'); - $this->mockRequestPatch('/projects/8', '{ - "data": { - "id": 8, - "userId": 6, - "sourceLanguageId": "uk", - "targetLanguageIds": [ - "es" - ], - "targetLanguages": [ - { - "id": "es", - "name": "Spanish", - "editorCode": "es", - "twoLettersCode": "es", - "threeLettersCode": "spa", - "locale": "es-ES", - "androidCode": "es-rES", - "osxCode": "es.lproj", - "osxLocale": "es", - "pluralCategoryNames": [], - "pluralRules": "(n != 1)", - "pluralExamples": [], - "textDirection": "ltr", - "dialectOf": "string" - } - ], - "languageAccessPolicy": "moderate", - "name": "edit test", - "identifier": "1f198a4e907688bc65834a6d5a6000c3", - "description": "Vault of all terms and their explanation", - "visibility": "private", - "logo": "data:image/png;base64,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", - "hiddenStringsProofreadersAccess": true, - "inContextProcessHiddenStrings": false, - "glossaryAccess": true, - "normalizePlaceholder": false, - "saveMetaInfoInSource": true, - "notificationSettings": { - "translatorNewStrings": "false", - "managerNewStrings": "false", - "managerLanguageCompleted": "false" - }, - "qaCheckIsActive": true, - "qaCheckCategories": { - "empty": "true", - "size": "true", - "tags": "true", - "spaces": "true", - "variables": "true", - "punctuation": "true", - "symbolRegister": "true", - "specialSymbols": "true", - "wrongTranslation": "true", - "spellcheck": "true", - "icu": "true" - }, - "qaChecksIgnorableCategories": { - "empty": "false", - "size": "true", - "tags": "true", - "spaces": "true", - "variables": "true", - "punctuation": "true", - "symbolRegister": "true", - "specialSymbols": "true", - "wrongTranslation": "true", - "spellcheck": "true", - "icu": "false", - "terms": "true", - "duplicate": "false", - "ftl": "false", - "android": "true" - }, - "createdAt": "2019-09-20T11:34:40+00:00", - "updatedAt": "2019-09-20T11:34:40+00:00" - } - }'); + + $this->mockRequestPatch( + '/projects/8', + json_encode([ + 'data' => [ + 'id' => 8, + 'userId' => 6, + 'sourceLanguageId' => 'uk', + 'targetLanguageIds' => ['es'], + 'targetLanguages' => [ + [ + 'id' => 'es', + 'name' => 'Spanish', + 'editorCode' => 'es', + 'twoLettersCode' => 'es', + 'threeLettersCode' => 'spa', + 'locale' => 'es-ES', + 'androidCode' => 'es-rES', + 'osxCode' => 'es.lproj', + 'osxLocale' => 'es', + 'pluralCategoryNames' => [], + 'pluralRules' => '(n != 1)', + 'pluralExamples' => [], + 'textDirection' => 'ltr', + 'dialectOf' => 'string', + ], + ], + 'languageAccessPolicy' => 'moderate', + 'name' => 'edit test', + 'identifier' => '1f198a4e907688bc65834a6d5a6000c3', + 'description' => 'Vault of all terms and their explanation', + 'visibility' => 'private', + 'logo' => 'data:image/png;base64,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', + 'hiddenStringsProofreadersAccess' => true, + 'inContextProcessHiddenStrings' => false, + 'glossaryAccess' => true, + 'normalizePlaceholder' => false, + 'saveMetaInfoInSource' => true, + 'notificationSettings' => [ + 'translatorNewStrings' => 'false', + 'managerNewStrings' => 'false', + 'managerLanguageCompleted' => 'false', + ], + 'qaCheckIsActive' => true, + 'qaCheckCategories' => [ + 'empty' => 'true', + 'size' => 'true', + 'tags' => 'true', + 'spaces' => 'true', + 'variables' => 'true', + 'punctuation' => 'true', + 'symbolRegister' => 'true', + 'specialSymbols' => 'true', + 'wrongTranslation' => 'true', + 'spellcheck' => 'true', + 'icu' => 'true', + ], + 'qaChecksIgnorableCategories' => [ + 'empty' => 'false', + 'size' => 'true', + 'tags' => 'true', + 'spaces' => 'true', + 'variables' => 'true', + 'punctuation' => 'true', + 'symbolRegister' => 'true', + 'specialSymbols' => 'true', + 'wrongTranslation' => 'true', + 'spellcheck' => 'true', + 'icu' => 'false', + 'terms' => 'true', + 'duplicate' => 'false', + 'ftl' => 'false', + 'android' => 'true', + ], + 'createdAt' => '2019-09-20T11:34:40+00:00', + 'updatedAt' => '2019-09-20T11:34:40+00:00', + ], + ]) + ); $project = $this->crowdin->project->update($project); @@ -364,9 +365,208 @@ public function testInfoGetAndUpdate() $this->assertEquals('edit test', $project->getName()); } - public function testDelete() + public function testDelete(): void { $this->mockRequestDelete('/projects/1'); $this->crowdin->project->delete(1); } + + public function testDownloadFileFormatSettingsCustomSegmentation(): void + { + $this->mockRequestGet( + '/projects/8/file-format-settings/10/custom-segmentations', + json_encode([ + 'data' => [ + 'url' => 'https://crowdin-importer.downloads.crowdin.com/29720421/750373/file_format_srx/test.srx', + 'expireIn' => '2025-03-03T15:02:23+00:00', + ], + ]) + ); + + $file = $this->crowdin->project->downloadFileFormatSettingsCustomSegmentation(8, 10); + + $this->assertInstanceOf(DownloadFile::class, $file); + $this->assertSame( + 'https://crowdin-importer.downloads.crowdin.com/29720421/750373/file_format_srx/test.srx', + $file->getUrl() + ); + $this->assertSame('2025-03-03T15:02:23+00:00', $file->getExpireIn()); + } + + public function testResetFileFormatSettingsCustomSegmentation(): void + { + $this->mockRequestDelete('/projects/8/file-format-settings/10/custom-segmentations'); + $this->crowdin->project->resetFileFormatSettingsCustomSegmentation(8, 10); + } + + public function testListFileFormatSettings(): void + { + $this->mockRequestGet( + '/projects/8/file-format-settings', + json_encode([ + 'data' => [ + [ + 'data' => [ + 'id' => 22, + 'name' => 'Android XML', + 'format' => 'android', + 'extensions' => [ + 'xml', + ], + 'settings' => [ + 'exportPattern' => 'android.xml', + 'contentSegmentation' => true, + 'customSegmentation' => false, + ], + 'createdAt' => '2025-03-03T14:57:11+00:00', + 'updatedAt' => '2025-03-03T15:01:19+00:00', + ], + ], + ], + 'pagination' => [ + 'offset' => 0, + 'limit' => 1, + ], + ]) + ); + + $list = $this->crowdin->project->listFileFormatSettings(8); + + $this->assertInstanceOf(ModelCollection::class, $list); + $this->assertInstanceOf(FileFormatSettings::class, $list[0]); + $this->assertSame('android', $list[0]->getFormat()); + $this->assertSame('android.xml', $list[0]->getSettings()['exportPattern']); + } + + public function testCreateFileFormatSettings(): void + { + $this->mockRequestPost( + '/projects/8/file-format-settings', + json_encode([ + 'format' => 'android', + 'settings' => [ + 'srxStorageId' => 100500, + 'exportPattern' => 'android.xml', + ], + ]), + json_encode([ + 'data' => [ + 'id' => 24, + 'name' => 'Android XML', + 'format' => 'android', + 'extensions' => [ + 'xml', + ], + 'settings' => [ + 'exportPattern' => 'android.xml', + 'customSegmentation' => true, + ], + 'createdAt' => '2025-03-03T15:36:18+00:00', + 'updatedAt' => '2025-03-03T15:36:18+00:00', + ], + ]) + ); + + $fileFormatSettings = $this->crowdin->project->createFileFormatSettings( + 8, + [ + 'format' => 'android', + 'settings' => [ + 'srxStorageId' => 100500, + 'exportPattern' => 'android.xml', + ], + ] + ); + + $this->assertInstanceOf(FileFormatSettings::class, $fileFormatSettings); + $this->assertSame('android', $fileFormatSettings->getFormat()); + $this->assertSame(true, $fileFormatSettings->getSettings()['customSegmentation']); + } + + public function testGetFileFormatSettings(): void + { + $this->mockRequestGet( + '/projects/8/file-format-settings/10', + json_encode([ + 'data' => [ + 'id' => 24, + 'name' => 'Android XML', + 'format' => 'android', + 'extensions' => [ + 'xml', + ], + 'settings' => [ + 'exportPattern' => 'android.xml', + ], + 'createdAt' => '2025-03-03T15:36:18+00:00', + 'updatedAt' => '2025-03-03T15:36:18+00:00', + ], + ]) + ); + + $fileFormatSettings = $this->crowdin->project->getFileFormatSettings(8, 10); + + $this->assertInstanceOf(FileFormatSettings::class, $fileFormatSettings); + $this->assertSame('android', $fileFormatSettings->getFormat()); + } + + public function testDeleteFileFormatSettings(): void + { + $this->mockRequestDelete('/projects/8/file-format-settings/10'); + $this->crowdin->project->deleteFileFormatSettings(8, 10); + } + + public function testUpdateFileFormatSettings(): void + { + $this->mockRequest([ + 'uri' => 'https://api.crowdin.com/api/v2/projects/8/file-format-settings/10', + 'method' => 'patch', + 'body' => json_encode([ + [ + 'op' => 'replace', + 'path' => '/settings', + 'value' => [ + 'exportPattern' => 'android.test.xml', + ], + ], + ]), + 'response' => json_encode([ + 'id' => 10, + 'name' => 'Android XML', + 'format' => 'android', + 'extensions' => [ + 'xml', + ], + 'settings' => [ + 'exportPattern' => 'android.test.xml', + ], + 'createdAt' => '2025-03-03T15:36:18+00:00', + 'updatedAt' => '2025-03-03T15:36:18+00:00', + ]), + ]); + + $fileFormatSettings = new FileFormatSettings([ + 'id' => 10, + 'name' => 'Android XML', + 'format' => 'android', + 'extensions' => [ + 'xml', + ], + 'settings' => [ + 'exportPattern' => 'android.xml', + ], + 'createdAt' => '2025-03-03T15:36:18+00:00', + 'updatedAt' => '2025-03-03T15:36:18+00:00', + ]); + + $settings = $fileFormatSettings->getSettings(); + $settings['exportPattern'] = 'android.test.xml'; + + $fileFormatSettings->setSettings($settings); + + $actual = $this->crowdin->project->updateFileFormatSettings(8, $fileFormatSettings); + + $this->assertInstanceOf(FileFormatSettings::class, $actual); + $this->assertSame('android.test.xml', $actual->getSettings()['exportPattern']); + } } diff --git a/tests/CrowdinApiClient/Model/FileFormatSettingsTest.php b/tests/CrowdinApiClient/Model/FileFormatSettingsTest.php new file mode 100644 index 00000000..5882bfc2 --- /dev/null +++ b/tests/CrowdinApiClient/Model/FileFormatSettingsTest.php @@ -0,0 +1,53 @@ + 10, + 'name' => 'Android XML', + 'format' => 'android', + 'extensions' => [ + 'xml', + ], + 'settings' => [ + 'exportPattern' => 'android.test.xml', + ], + 'createdAt' => '2025-03-03T15:36:18+00:00', + 'updatedAt' => '2025-03-03T15:36:18+00:00', + ]; + + public function testLoadData(): void + { + $this->fileFormatSettings = new FileFormatSettings($this->data); + + $this->assertEquals($this->data['id'], $this->fileFormatSettings->getId()); + $this->assertEquals($this->data['name'], $this->fileFormatSettings->getName()); + $this->assertEquals($this->data['format'], $this->fileFormatSettings->getFormat()); + $this->assertEquals($this->data['extensions'], $this->fileFormatSettings->getExtensions()); + $this->assertEquals($this->data['settings'], $this->fileFormatSettings->getSettings()); + $this->assertEquals($this->data['createdAt'], $this->fileFormatSettings->getCreatedAt()); + $this->assertEquals($this->data['updatedAt'], $this->fileFormatSettings->getUpdatedAt()); + } + + public function testSetData(): void + { + $this->fileFormatSettings = new FileFormatSettings($this->data); + $this->fileFormatSettings->setFormat('new format'); + $this->fileFormatSettings->setSettings(['exportPattern' => 'android.test.xml']); + + $this->assertSame('new format', $this->fileFormatSettings->getFormat()); + $this->assertSame(['exportPattern' => 'android.test.xml'], $this->fileFormatSettings->getSettings()); + } +}