From b609861f5395f7faee8a3226f582f025c2c6af2d Mon Sep 17 00:00:00 2001 From: Brad Feehan Date: Tue, 13 May 2014 12:57:28 +1000 Subject: [PATCH] Add CreateArticleTranslation operation --- .../ArticleTranslationModel.yaml | 46 ++++---- .../models/Article.group/__index.yaml | 44 ++++---- .../CreateArticleTranslation.yaml | 24 +++++ .../CreateArticleTranslationOperationTest.php | 102 ++++++++++++++++++ .../system.txt | 44 ++++++++ 5 files changed, 220 insertions(+), 40 deletions(-) create mode 100644 lib/Desk/service-description/operations/Article.group/Translation.group/CreateArticleTranslation.yaml create mode 100644 tests/Desk/Test/Operation/Articles/Translations/CreateArticleTranslationOperationTest.php create mode 100644 tests/mock/Desk/Test/Operation/Articles/Translations/CreateArticleTranslationOperationTest/system.txt diff --git a/lib/Desk/service-description/models/Article.group/Translation.group/ArticleTranslationModel.yaml b/lib/Desk/service-description/models/Article.group/Translation.group/ArticleTranslationModel.yaml index f377485..bcd9518 100644 --- a/lib/Desk/service-description/models/Article.group/Translation.group/ArticleTranslationModel.yaml +++ b/lib/Desk/service-description/models/Article.group/Translation.group/ArticleTranslationModel.yaml @@ -1,27 +1,33 @@ type: object properties: - locale: { extends: ArticleTranslation.locale } - subject: { extends: ArticleTranslation.subject } - body: { extends: ArticleTranslation.body } - body_email: { extends: ArticleTranslation.body_email } - body_email_auto: { extends: ArticleTranslation.body_email_auto } - body_chat: { extends: ArticleTranslation.body_chat } - body_chat_auto: { extends: ArticleTranslation.body_chat_auto } - body_web_callback: { extends: ArticleTranslation.body_web_callback } - body_web_callback_auto: { extends: ArticleTranslation.body_web_callback_auto } - body_twitter: { extends: ArticleTranslation.body_twitter } - body_twitter_auto: { extends: ArticleTranslation.body_twitter_auto } - body_qna: { extends: ArticleTranslation.body_qna } - body_qna_auto: { extends: ArticleTranslation.body_qna_auto } - body_phone: { extends: ArticleTranslation.body_phone } - body_phone_auto: { extends: ArticleTranslation.body_phone_auto } - body_facebook: { extends: ArticleTranslation.body_facebook } - body_facebook_auto: { extends: ArticleTranslation.body_facebook_auto } - publish_at: { extends: ArticleTranslation.publish_at } - created_at: { extends: ArticleTranslation.created_at } - updated_at: { extends: ArticleTranslation.updated_at } + locale: { extends: ArticleTranslationModel.locale } + subject: { extends: ArticleTranslationModel.subject } + body: { extends: ArticleTranslationModel.body } + body_email: { extends: ArticleTranslationModel.body_email } + body_email_auto: { extends: ArticleTranslationModel.body_email_auto } + body_chat: { extends: ArticleTranslationModel.body_chat } + body_chat_auto: { extends: ArticleTranslationModel.body_chat_auto } + body_web_callback: { extends: ArticleTranslationModel.body_web_callback } + body_web_callback_auto: { extends: ArticleTranslationModel.body_web_callback_auto } + body_twitter: { extends: ArticleTranslationModel.body_twitter } + body_twitter_auto: { extends: ArticleTranslationModel.body_twitter_auto } + body_qna: { extends: ArticleTranslationModel.body_qna } + body_qna_auto: { extends: ArticleTranslationModel.body_qna_auto } + body_phone: { extends: ArticleTranslationModel.body_phone } + body_phone_auto: { extends: ArticleTranslationModel.body_phone_auto } + body_facebook: { extends: ArticleTranslationModel.body_facebook } + body_facebook_auto: { extends: ArticleTranslationModel.body_facebook_auto } + publish_at: { extends: ArticleTranslationModel.publish_at } + created_at: { extends: ArticleTranslationModel.created_at } + updated_at: { extends: ArticleTranslationModel.updated_at } self: location: links data: operation: ShowArticleTranslation pattern: "#/articles/(?P[0-9]+)/translations/(?P[a-zA-Z_-]+)$#" + article: + location: links + sentAs: self + data: + operation: ShowArticle + pattern: "#/articles/(?P[0-9]+)#" diff --git a/lib/Desk/service-description/models/Article.group/__index.yaml b/lib/Desk/service-description/models/Article.group/__index.yaml index e76a8de..205d6d3 100644 --- a/lib/Desk/service-description/models/Article.group/__index.yaml +++ b/lib/Desk/service-description/models/Article.group/__index.yaml @@ -83,58 +83,62 @@ ArticleModel.internal_notes: type: string -ArticleTranslation.locale: +ArticleTranslationModel.locale: extends: locale description: "Article translation's locale" -ArticleTranslation.subject: +ArticleTranslationModel.subject: extends: parameter description: The subject of the article type: string -ArticleTranslation.body: +ArticleTranslationModel.body: extends: parameter description: The content of the article (HTML formatted) type: string -ArticleTranslation.body_email: +ArticleTranslationModel.body_email: extends: parameter description: Email-specific body content type: string -ArticleTranslation.body_email_auto: { extends: body_auto } -ArticleTranslation.body_chat: +ArticleTranslationModel.body_email_auto: { extends: body_auto } +ArticleTranslationModel.body_chat: extends: parameter description: Chat-specific body content type: string -ArticleTranslation.body_chat_auto: { extends: body_auto } -ArticleTranslation.body_web_callback: +ArticleTranslationModel.body_chat_auto: { extends: body_auto } +ArticleTranslationModel.body_web_callback: extends: parameter description: Chat-specific body content type: string -ArticleTranslation.body_web_callback_auto: { extends: body_auto } -ArticleTranslation.body_twitter: +ArticleTranslationModel.body_web_callback_auto: { extends: body_auto } +ArticleTranslationModel.body_twitter: extends: parameter description: Twitter-specific body content type: string -ArticleTranslation.body_twitter_auto: { extends: body_auto } -ArticleTranslation.body_qna: +ArticleTranslationModel.body_twitter_auto: { extends: body_auto } +ArticleTranslationModel.body_qna: extends: parameter description: QNA-specific body content type: string -ArticleTranslation.body_qna_auto: { extends: body_auto } -ArticleTranslation.body_phone: +ArticleTranslationModel.body_qna_auto: { extends: body_auto } +ArticleTranslationModel.body_phone: extends: parameter description: Phone-specific body content type: string -ArticleTranslation.body_phone_auto: { extends: body_auto } -ArticleTranslation.body_facebook: +ArticleTranslationModel.body_phone_auto: { extends: body_auto } +ArticleTranslationModel.body_facebook: extends: parameter description: Facebook-specific body content type: string -ArticleTranslation.body_facebook_auto: { extends: body_auto } -ArticleTranslation.publish_at: +ArticleTranslationModel.body_facebook_auto: { extends: body_auto } +ArticleTranslationModel.publish_at: extends: date.output description: Date the article is to be published -ArticleTranslation.created_at: +ArticleTranslationModel.created_at: extends: date.output description: Date the article was created -ArticleTranslation.updated_at: +ArticleTranslationModel.updated_at: extends: date.output description: Date the article was updated +ArticleTranslationModel.outdated: + extends: parameter + description: Whether or not the translation is out-of-date + type: boolean diff --git a/lib/Desk/service-description/operations/Article.group/Translation.group/CreateArticleTranslation.yaml b/lib/Desk/service-description/operations/Article.group/Translation.group/CreateArticleTranslation.yaml new file mode 100644 index 0000000..ed35fd7 --- /dev/null +++ b/lib/Desk/service-description/operations/Article.group/Translation.group/CreateArticleTranslation.yaml @@ -0,0 +1,24 @@ +extends: create +summary: Create a new translation for a particular article +uri: "articles/{article_id}/translations" +responseClass: ArticleTranslationModel +parameters: + article_id: { extends: id, required: true, location: uri } + locale: { extends: ArticleTranslationModel.locale, required: true } + subject: { extends: ArticleTranslationModel.subject } + body: { extends: ArticleTranslationModel.body } + body_email: { extends: ArticleTranslationModel.body_email } + body_email_auto: { extends: ArticleTranslationModel.body_email_auto } + body_chat: { extends: ArticleTranslationModel.body_chat } + body_chat_auto: { extends: ArticleTranslationModel.body_chat_auto } + body_web_callback: { extends: ArticleTranslationModel.body_web_callback } + body_web_callback_auto: { extends: ArticleTranslationModel.body_web_callback_auto } + body_twitter: { extends: ArticleTranslationModel.body_twitter } + body_twitter_auto: { extends: ArticleTranslationModel.body_twitter_auto } + body_qna: { extends: ArticleTranslationModel.body_qna } + body_qna_auto: { extends: ArticleTranslationModel.body_qna_auto } + body_phone: { extends: ArticleTranslationModel.body_phone } + body_phone_auto: { extends: ArticleTranslationModel.body_phone_auto } + body_facebook: { extends: ArticleTranslationModel.body_facebook } + body_facebook_auto: { extends: ArticleTranslationModel.body_facebook_auto } + outdated: { extends: ArticleTranslationModel.outdated } diff --git a/tests/Desk/Test/Operation/Articles/Translations/CreateArticleTranslationOperationTest.php b/tests/Desk/Test/Operation/Articles/Translations/CreateArticleTranslationOperationTest.php new file mode 100644 index 0000000..3284f1f --- /dev/null +++ b/tests/Desk/Test/Operation/Articles/Translations/CreateArticleTranslationOperationTest.php @@ -0,0 +1,102 @@ + 1, + 'locale' => 'es', + ); + } + + /** + * {@inheritdoc} + */ + public function dataParameterValid() + { + $body = '{"locale":"es","subject":"Spanish"}'; + + return array( + array( + array( + 'article_id' => 1, + 'locale' => 'es', + 'subject' => 'Spanish', + + ), + array('body' => "#^$body$#") + ), + ); + } + + /** + * {@inheritdoc} + */ + public function dataParameterInvalid() + { + return array( + array( + array( + 'article_id' => 1, + ) + ), + array( + array( + 'locale' => 'es', + ) + ), + array( + array( + 'article_id' => 1, + 'locale' => 'es', + 'outdated' => 'foo', + ) + ), + ); + } + + /** + * {@inheritdoc} + */ + protected function assertSystem(Model $articleTranslation) + { + $this->assertSame('ArticleTranslationModel', $articleTranslation->getStructure()->getName()); + + $this->assertSame('Spanish Translation', $articleTranslation->get('subject')); + $this->assertSame('es', $articleTranslation->get('locale')); + } + + /** + * {@inheritdoc} + */ + public function dataLinksAdditional() + { + return array( + array('article', 'ShowArticle', array('id' => 1)), + ); + } +} diff --git a/tests/mock/Desk/Test/Operation/Articles/Translations/CreateArticleTranslationOperationTest/system.txt b/tests/mock/Desk/Test/Operation/Articles/Translations/CreateArticleTranslationOperationTest/system.txt new file mode 100644 index 0000000..7b8170d --- /dev/null +++ b/tests/mock/Desk/Test/Operation/Articles/Translations/CreateArticleTranslationOperationTest/system.txt @@ -0,0 +1,44 @@ +HTTP/1.1 201 Created +Accept-Ranges: bytes +Cache-Control: max-age=0, private, must-revalidate +Content-Type: application/json; charset=utf-8 +Location: http://mock.localhost/cases/1 +Status: 201 Created +Vary: X-AppVersion +X-AppVersion: 781247eace915fac36f43a20c87f25019542d2d5.0 +X-Frame-Options: SAMEORIGIN +X-Rate-Limit-Limit: 60 +X-Rate-Limit-Remaining: 59 +X-Rate-Limit-Reset: 53 +Content-Length: 948 +Connection: keep-alive + +{ + "locale": "es", + "subject": "Spanish Translation", + "body": "Traducción español aquí", + "body_email": "Traducción español aquí", + "body_email_auto": true, + "body_chat": "Traducción español aquí", + "body_chat_auto": true, + "body_web_callback": "Traducción español aquí", + "body_web_callback_auto": true, + "body_twitter": "Traducción español aquí", + "body_twitter_auto": true, + "body_qna": "Traducción español aquí", + "body_qna_auto": true, + "body_phone": "Traducción español aquí", + "body_phone_auto": true, + "body_facebook": "Traducción español aquí", + "body_facebook_auto": true, + "outdated": false, + "publish_at": "2014-05-12T19:23:25Z", + "created_at": "2014-05-12T19:18:25Z", + "updated_at": "2014-05-12T19:23:25Z", + "_links": { + "self": { + "href": "/api/v2/articles/1/translations/es", + "class": "article" + } + } +}