diff --git a/Gemfile b/Gemfile
index 7ec92d026a7..403576c2e65 100644
--- a/Gemfile
+++ b/Gemfile
@@ -98,6 +98,9 @@ gem 'unf'
gem 'faraday'
gem 'elasticsearch'
+# line
+gem 'line-bot-api'
+
group :development, :test do
gem 'dotenv-rails'
gem 'capybara', require: false
diff --git a/Gemfile.lock b/Gemfile.lock
index b4a46a4586e..6f19bbe090f 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -297,6 +297,7 @@ GEM
kramdown (~> 2.0)
levenshtein (0.2.2)
libv8 (7.3.492.27.1)
+ line-bot-api (1.19.0)
link_header (0.0.8)
liquid (4.0.1)
listen (3.1.5)
@@ -692,6 +693,7 @@ DEPENDENCIES
kramdown
kramdown-parser-gfm
levenshtein
+ line-bot-api
liquid
mail-iso-2022-jp
marcel
diff --git a/app/assets/javascripts/cms/lib/form.js.erb b/app/assets/javascripts/cms/lib/form.js.erb
index d8aa675f079..9019102f208 100644
--- a/app/assets/javascripts/cms/lib/form.js.erb
+++ b/app/assets/javascripts/cms/lib/form.js.erb
@@ -29,6 +29,7 @@ this.Cms_Form = (function () {
// handle Form_Alert
Form_Alert.addValidation(Form_Alert.clonedName);
Form_Alert.addValidation(Form_Alert.closeConfirmation);
+ Form_Alert.addValidation(Form_Alert.snsPostConfirmation);
if(Cms_Form.options.check.syntax) {
Form_Alert.addAsyncValidation(Form_Alert.asyncValidateSyntaxCheck);
}
diff --git a/app/assets/javascripts/cms/lib/form_alert.js.erb b/app/assets/javascripts/cms/lib/form_alert.js.erb
index cf166a9d651..b055a9ab3ea 100644
--- a/app/assets/javascripts/cms/lib/form_alert.js.erb
+++ b/app/assets/javascripts/cms/lib/form_alert.js.erb
@@ -159,6 +159,21 @@ this.Form_Alert = (function () {
}
};
+ Form_Alert.snsPostConfirmation = function (form, submit) {
+ var addonName, messages, f;
+ f = $(submit).data("sns-post-confirmation");
+
+ messages = [];
+ if (f) {
+ messages = f();
+ }
+
+ addonName = '<%= I18n.t("cms.sns_post") %>';
+ $.each(messages, function() {
+ Form_Alert.add(addonName, null, this);
+ });
+ }
+
Form_Alert.add = function (addon, ele, msg) {
var base;
(base = Form_Alert.alerts)[addon] || (base[addon] = []);
diff --git a/app/assets/stylesheets/ss/_pc_mb.scss b/app/assets/stylesheets/ss/_pc_mb.scss
index 8fcecedd2b1..852b0c5c14a 100644
--- a/app/assets/stylesheets/ss/_pc_mb.scss
+++ b/app/assets/stylesheets/ss/_pc_mb.scss
@@ -3492,3 +3492,17 @@ body.ss-ajax-in-iframe {
cursor: help;
}
}
+
+.sns-post-confirm {
+ background: #f3f3f3;
+ padding: 2px;
+ border-radius: 4px;
+ h2 {
+ font-weight: bold;
+ margin-top: 5px;
+ margin-left: 10px;
+ }
+ ul li {
+ list-style: inherit;
+ }
+}
diff --git a/app/controllers/cms/apis/sns_poster_controller.rb b/app/controllers/cms/apis/sns_poster_controller.rb
new file mode 100644
index 00000000000..d90dbf7a4ac
--- /dev/null
+++ b/app/controllers/cms/apis/sns_poster_controller.rb
@@ -0,0 +1,15 @@
+class Cms::Apis::SnsPosterController < ApplicationController
+ include Cms::BaseFilter
+ include Cms::CrudFilter
+
+ model ::Cms::Page
+
+ public
+
+ def line_reset
+ set_item
+ @item = @item.becomes_with_route
+ @item.reset_line_posted if @item.respond_to?(:reset_line_posted)
+ redirect_to @item.private_show_path, notice: t("ss.notice.reset_posted")
+ end
+end
diff --git a/app/controllers/cms/sns_post/logs_controller.rb b/app/controllers/cms/sns_post/logs_controller.rb
new file mode 100644
index 00000000000..ff6dfe141f5
--- /dev/null
+++ b/app/controllers/cms/sns_post/logs_controller.rb
@@ -0,0 +1,14 @@
+class Cms::SnsPost::LogsController < ApplicationController
+ include Cms::BaseFilter
+ include Cms::CrudFilter
+
+ model Cms::SnsPostLog::Base
+
+ navi_view "cms/sns_post/main/navi"
+
+ private
+
+ def set_crumbs
+ @crumbs << [t("cms.sns_post"), cms_sns_post_logs_path]
+ end
+end
diff --git a/app/controllers/concerns/cms/base_filter.rb b/app/controllers/concerns/cms/base_filter.rb
index ce697de4109..968d0b42f5c 100644
--- a/app/controllers/concerns/cms/base_filter.rb
+++ b/app/controllers/concerns/cms/base_filter.rb
@@ -8,6 +8,7 @@ module Cms::BaseFilter
helper Cms::NodeHelper
helper Cms::FormHelper
helper Map::MapHelper
+ helper Cms::SnsHelper
before_action :validate_cms
before_action :set_cms_assets
before_action :set_site
diff --git a/app/helpers/cms/sns_helper.rb b/app/helpers/cms/sns_helper.rb
new file mode 100644
index 00000000000..cb592f757c2
--- /dev/null
+++ b/app/helpers/cms/sns_helper.rb
@@ -0,0 +1,46 @@
+module Cms::SnsHelper
+ def show_line_post_confirm?
+ return false if !@item.class.include?(Cms::Addon::LinePoster)
+
+ site = @item.site
+ item = (@item.respond_to?(:master) && @item.master) ? @item.master : @item
+
+ return false if !site.line_token_enabled?
+ return false if @item.line_auto_post != "active"
+ return false if item.line_posted.present?
+ true
+ end
+
+ def show_twitter_post_confirm?
+ return false if !@item.class.include?(Cms::Addon::TwitterPoster)
+
+ item = (@item.respond_to?(:master) && @item.master) ? @item.master : @item
+
+ return false if !@item.use_twitter_post?
+ return false if item.twitter_posted.present?
+ true
+ end
+
+ def render_sns_post_confirm
+ messages = []
+ if show_line_post_confirm?
+ messages << t("cms.confirm.line_post_enabled")
+ end
+ if show_twitter_post_confirm?
+ messages << t("cms.confirm.twitter_post_enabled")
+ end
+
+ return "" if messages.blank?
+
+ h = []
+ h << "
<%= render "ss/crud/addon", addon: { head: "#{t("workflow.buttons.approve")}/#{t("workflow.buttons.remand")}#{@model.tt :approve_remand}".html_safe } do %>
+ <% if @ss_mode == :cms %>
+ <%== render_sns_post_confirm rescue nil %>
+ <% end %>
<%= text_area :remand, :comment, value: "" %>
<% if @ss_mode == :gws && @item.workflow_approver_attachment_enabled_at?(workflow_approver[:level]) %>
diff --git a/config/locales/cms/ja.yml b/config/locales/cms/ja.yml
index cc9ccf74603..894f42f92c9 100644
--- a/config/locales/cms/ja.yml
+++ b/config/locales/cms/ja.yml
@@ -70,6 +70,7 @@ ja:
source_cleaner: ソースクリーニング
source_cleaner_template: ソースクリーニング
syntax_check: アクセシビリティチェック
+ sns_post: SNS投稿連携
theme_template: Theme切り替え
user: ユーザー
view_page: 公開画面
@@ -109,6 +110,7 @@ ja:
column_youtube_auto_width:
enabled: 画面幅に合わせる
disabled: 画面幅に合わせない
+ visit_article: 記事を見る
adobe_reader:
remark:
@@ -144,6 +146,9 @@ ja:
contains_urls_exists: このページへのリンク、関連記事、添付ファイルが以下のページに含まれています。
contains_urls_not_found: このページへのリンク、関連記事、添付ファイルが含まれているページは見つかりませんでした。
check_accessibility_manually: "セマンティックなマークアップであるか確認してください。\nコントラスト比に問題がないか確認してください。"
+ when_publish: 公開時の注意
+ line_post_enabled: LINE連携が有効になっています。連携しない場合は、設定を解除してください。
+ twitter_post_enabled: Twitter投稿が有効になっています。連携しない場合は、設定を解除してください。
notices:
import_with_entry_form_is_not_supported: 次のフォームでは本文ブロックは出力されません。
restoring_public_content_from_trash: 非公開で復元されます。復元後、内容を確認うえ、公開してください。
@@ -326,7 +331,16 @@ ja:
left: 左
center: 中央
right: 右
-
+ line_post_format:
+ thumb_carousel: サムネイル画像とLINEメッセージ
+ body_carousel: 本文内の最初の画像とLINEメッセージ
+ message_only_carousel: LINEメッセージ
+ sns_post_log_type:
+ twitter: Twitter投稿
+ line: LINE投稿
+ sns_post_log_state:
+ success: 成功
+ error: エラー
sns_share:
fb_like: Facebook いいね!
fb_share: Facebook シェア
@@ -531,8 +545,9 @@ ja:
cms/import/body: 本文
cms/edit_lock: 排他制御
cms/sns_share: SNS共有
- cms/sns_poster: SNS自動投稿設定
- cms/node_auto_post_setting: SNS自動投稿設定
+ cms/twitter_poster: Twitter連携
+ cms/node_twitter_post_setting: Twitter連携設定
+ cms/node_line_post_setting: LINE連携設定
cms/captcha: 認証
cms/body_layout_html: HTML
cms/default_release_plan: 公開予約の既定値
@@ -560,6 +575,9 @@ ja:
cms/column/text_like: 制約条件
cms/column/select_like: 選択
cms/redirect_link: リンクページ
+ cms/site_search/keyword: 注目ワード
+ cms/site_search/history: 履歴
+ cms/line_poster: LINE連携
mongoid:
models:
@@ -784,17 +802,19 @@ ja:
cms/addon/sns_share:
sns_share_states: 表示
sns_share_orders: 並び順
- cms/addon/sns_poster:
- sns_poster: SNS自動投稿設定
- twitter_auto_post: Twitter自動投稿
+ cms/addon/twitter_poster:
+ twitter_auto_post: Twitter投稿
+ twitter_url: TweetURL
+ twitter_posted_at: 投稿日時
sns_auto_delete: 非公開時に投稿を削除
- edit_auto_post: 編集時に自動投稿
twitter_post_error: 投稿エラー
- cms/addon/node_auto_post_setting:
+ cms/addon/node_twitter_post_setting:
node_auto_post_setting: SNS自動投稿設定
- node_twitter_auto_post: Twitter自動投稿
+ node_twitter_auto_post: Twitter投稿
node_sns_auto_delete: 非公開時に投稿を削除
- node_edit_auto_post: 編集時に自動投稿
+ cms/addon/node_line_post_setting:
+ node_line_auto_post: LINE投稿
+ node_line_post_format: 投稿形式
cms/addon/import/page:
in_file: ファイル
cms/addon/import/group:
@@ -1014,6 +1034,18 @@ ja:
low_vision_report_filepath: 視覚化検証結果
low_vision_source_filepath: 視覚化検証元画像
low_vision_result_filepath: 視覚化検証画像
+ cms/addon/line_poster:
+ line_auto_post: LINE投稿
+ line_post_format: 投稿形式
+ line_text_message: LINEメッセージ
+ line_text_message_placeholder: "○月○日、○○○イベントが行われます。詳しくは、市ホームページをご覧ください。\n※全角45文字以内\n※改行はしないでください"
+ line_posted: 投稿日時
+ line_post_error: 投稿エラー
+ cms/sns_post_log/base:
+ name: タイトル
+ type: 投稿SNS
+ state: ステータス
+ page_id: 連携ページ
activemodel:
attributes:
@@ -1135,6 +1167,8 @@ ja:
- 設定している代替テキストが妥当かどうか確認してください。
thums_is_not_an_image: には画像ファイルを指定してください。
unsupported_encoding: 対応していない文字コードです。
+ thumb_is_blank: サムネイル画像が登録されていません。
+ not_found_file_url_in_body: 本文内の画像が見つかりませんでした。
template:
no_errors: エラーは見つかりませんでした。
@@ -2111,6 +2145,38 @@ ja:
- インポートするファイルを設定します。
- ファイルはUTF-8またはShift_JISでエンコードされている必要があります。
+ cms/addon/node_line_post_setting:
+ node_line_auto_post:
+ - 有効に設定すると公開時にLINE投稿をおこないます。
+ node_line_post_format:
+ - 投稿形式を選択します。
+ -
+ - ・サムネイル画像とLINEメッセージ
+ - サムネイル画像とLINEメッセージおよび記事へのリンクをカルーセル形式で投稿します。
+ -
+ - ・本文内の最初の画像とLINEメッセージ
+ - 本文内の最初の画像とLINEメッセージおよび記事へのリンクをカルーセル形式で投稿します。
+ -
+ - ・LINEメッセージのみ
+ - LINEメッセージと記事へのリンクをカルーセル形式で投稿します。
+
+ cms/addon/line_poster:
+ line_auto_post:
+ - 有効に設定すると公開時にLINE投稿をおこないます。
+ line_post_format:
+ - 投稿形式を選択します。
+ -
+ - ・サムネイル画像とLINEメッセージ
+ - サムネイル画像とLINEメッセージおよび記事へのリンクをカルーセル形式で投稿します。
+ -
+ - ・本文内の最初の画像とLINEメッセージ
+ - 本文内の最初の画像とLINEメッセージおよび記事へのリンクをカルーセル形式で投稿します。
+ -
+ - ・LINEメッセージのみ
+ - LINEメッセージと記事へのリンクをカルーセル形式で投稿します。
+ line_text_message:
+ - LINEに投稿するメッセージを入力します。
+
all_content:
page_id: ページID
node_id: フォルダーID
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 32b9d063895..261dcfaec92 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -124,6 +124,7 @@ ja:
invalid_filename: は半角英数、アンダースコア、ハイフンのみ使用可能です。
invalid_csv: CSV形式のファイルを選択してください。
malformed_csv: CSVの形式が正しくありません。正しい形式のCSVファイルを選択してください。
+ invalid_new_line_included: "に改行を含めることはできません。"
invalid_email_included: に不正なメールアドレスが含まれています。
too_large_mail_size: "メールの添付ファイルサイズが大きすぎます。合計: %{size}(制限値: %{limit})"
smtp_delivery_error: "メールを送信できませんでした。STMPエラーメッセージ: %{message}"
@@ -139,6 +140,7 @@ ja:
too_long: は%{count}文字以内で入力してください。
too_large: は%{count}件以内で入力してください。
too_short: は%{count}文字以上で入力してください。
+ too_long_with_line_title: は%{count}文字以内で入力してください。(LINE投稿有りの場合)
wrong_length: は%{count}文字で入力してください。
other_than: "は%{count}以外の値にしてください。"
email: は有効な電子メールアドレスを入力してください。
diff --git a/config/locales/sns_poster/ja.yml b/config/locales/sns_poster/ja.yml
index a18aaddfb19..7fb594d55de 100644
--- a/config/locales/sns_poster/ja.yml
+++ b/config/locales/sns_poster/ja.yml
@@ -5,12 +5,8 @@ ja:
- Twitterへの自動投稿の設定を行います。
sns_auto_delete:
- 記事非公開時にSNSへ投稿した内容を削除します。
- edit_auto_post:
- - 記事編集時の自動投稿の設定を行います。
cms/addon/node_auto_post_setting:
node_twitter_auto_post:
- Twitterへの自動投稿の設定を行います。
node_sns_auto_delete:
- 記事非公開時にSNSへ投稿した内容を削除します。
- node_edit_auto_post:
- - 記事編集時の自動投稿の設定を行います。
diff --git a/config/locales/ss/ja.yml b/config/locales/ss/ja.yml
index 96f8329c123..ce13d37a860 100644
--- a/config/locales/ss/ja.yml
+++ b/config/locales/ss/ja.yml
@@ -103,6 +103,7 @@ ja:
send_email: メールを作成する
send_message: メッセージを作成する
copy_email_address: メールアドレスをコピー
+ reset_posted: 未投稿に戻す
buttons:
save: 保存
new: 新規作成
@@ -173,6 +174,7 @@ ja:
send: 送信してよろしいですか?
publish: 公開してよろしいですか?
depublish: 非公開にしてよろしいですか?
+ reset_posted: 未投稿状態に戻してもよろしいですか?
notice:
saved: 保存しました。
deleted: 削除しました。
@@ -205,6 +207,7 @@ ja:
unset_seen_all: 未読にしました。
set_star_all: スターをつけました。
unset_star_all: スターをはずしました。
+ reset_posted: 未投稿に戻しました。
info:
soft_delete: データの実削除ではなく無効状態として保存されます。
@@ -419,7 +422,7 @@ ja:
ss/kana_setting: かな設定
ss/facebook_setting: Facebook設定
ss/twitter_setting: Twitter設定
- ss/site_auto_post_setting: SNS自動投稿設定
+ ss/line_setting: Line設定
ss/approve_setting: 承認設定
ss/editor_setting: エディタ設定
ss/mail_setting: メール設定
@@ -649,10 +652,9 @@ ja:
twitter_consumer_secret: コンシューマーシークレット
twitter_access_token: アクセストークン
twitter_access_token_secret: トークンシークレット
- ss/addon/site_auto_post_setting:
- site_twitter_auto_post: Twitter自動投稿
- site_sns_auto_delete: 非公開時に投稿を削除
- site_edit_auto_post: 編集時に自動投稿
+ ss/addon/line_setting:
+ line_channel_secret: チャンネルシークレット
+ line_channel_access_token: チャンネルアクセストークン
ss/addon/file_setting:
file_resizing: 添付ファイルリサイズ
file_resizing_width: 幅
@@ -1053,13 +1055,13 @@ ja:
twitter_access_token_secret:
- アクセストークンシークレット(Access Token Secret)を設定します。
- Twitterへの自動投稿に必須です。
- ss/addon/site_auto_post_setting:
- site_twitter_auto_post:
- - Twitterへの自動投稿の設定を行います。
- site_sns_auto_delete:
- - 記事非公開時にSNSへ投稿した内容を削除します。
- site_edit_auto_post:
- - 記事編集時の自動投稿の設定を行います。
+ ss/addon/line_setting:
+ line_channel_secret:
+ - Lineのチャンネルシークレットを設定します。
+ - Lineとの連携に必須です。
+ line_channel_access_token:
+ - Lineのチャンネルアクセストークンを設定します。
+ - Lineとの連携に必須です。
ss/addon/file_setting:
file_resizing:
- ページの添付ファイル(アップロード)のリサイズにてデフォルトサイズを設定できます。
diff --git a/config/routes/cms/routes_end.rb b/config/routes/cms/routes_end.rb
index 665de416421..b8feb213404 100644
--- a/config/routes/cms/routes_end.rb
+++ b/config/routes/cms/routes_end.rb
@@ -140,6 +140,10 @@
resource :site_setting
end
+ namespace "sns_post" do
+ resources :logs, only: [:index, :show, :destroy], concerns: [:deletion]
+ end
+
get "check_links" => "check_links#index"
post "check_links" => "check_links#run"
get "generate_nodes" => "generate_nodes#index"
@@ -268,6 +272,8 @@
namespace "translate" do
get "langs" => "langs#index"
end
+
+ post "sns_poster/:id/line_reset" => "sns_poster#line_reset", as: :line_reset
end
end
diff --git a/spec/features/cms/sns_post/line/approval_spec.rb b/spec/features/cms/sns_post/line/approval_spec.rb
new file mode 100644
index 00000000000..b5400ea98e8
--- /dev/null
+++ b/spec/features/cms/sns_post/line/approval_spec.rb
@@ -0,0 +1,232 @@
+require 'spec_helper'
+
+describe "article_pages line post", type: :feature, dbscope: :example, js: true do
+ let(:site) { cms_site }
+ let(:node) { create :article_node_page }
+ let(:item) { create :article_page, cur_node: node, state: "closed" }
+
+ let(:user) { cms_user }
+ let!(:user1) { create(:cms_test_user, group_ids: user.group_ids, cms_role_ids: user.cms_role_ids) }
+
+ let(:show_path) { article_page_path site.id, node, item }
+ let(:edit_path) { edit_article_page_path site.id, node, item }
+
+ let(:line_text_message) { unique_id }
+
+ context "approve and publish" do
+ before do
+ site.line_channel_secret = unique_id
+ site.line_channel_access_token = unique_id
+ site.save!
+ end
+
+ context "post none" do
+ it "#edit" do
+ capture_line_bot_client do |capture|
+ # edit
+ login_cms_user
+ visit edit_path
+
+ ensure_addon_opened("#addon-cms-agents-addons-line_poster")
+ within "#addon-cms-agents-addons-line_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.expired"), from: "item[line_auto_post]"
+ select I18n.t("cms.options.line_post_format.message_only_carousel"), from: "item[line_post_format]"
+ fill_in "item[line_text_message]", with: line_text_message
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.draft_save")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+ expect(capture.broadcast.count).to eq 0
+ expect(capture.broadcast.messages).to eq nil
+ expect(Cms::SnsPostLog::Line.count).to eq 0
+
+ # send request
+ within ".mod-workflow-request" do
+ select I18n.t("mongoid.attributes.workflow/model/route.my_group"), from: "workflow_route"
+ click_on I18n.t("workflow.buttons.select")
+ click_on I18n.t("workflow.search_approvers.index")
+ end
+
+ wait_for_cbox do
+ expect(page).to have_content(user1.long_name)
+ click_on user1.long_name
+ end
+ within ".mod-workflow-request" do
+ click_on I18n.t("workflow.buttons.request")
+ end
+ expect(page).to have_css(".mod-workflow-view dd", text: I18n.t("workflow.state.request"))
+
+ # approve
+ login_user user1
+ visit show_path
+ within ".mod-workflow-approve" do
+ expect(page).to have_no_css(".sns-post-confirm", text: I18n.t("cms.confirm.line_post_enabled"))
+ click_on I18n.t("workflow.buttons.approve")
+ end
+ within "#addon-workflow-agents-addons-approver" do
+ expect(page).to have_css("dd", text: I18n.t("ss.options.state.approve"))
+ end
+ within "#addon-cms-agents-addons-release" do
+ expect(page).to have_css("dd", text: I18n.t("ss.options.state.public"))
+ end
+
+ visit show_path
+ within "#addon-cms-agents-addons-line_poster" do
+ have_css("dd", text: line_text_message)
+ end
+ expect(capture.broadcast.count).to eq 0
+ expect(capture.broadcast.messages).to eq nil
+ expect(Cms::SnsPostLog::Line.count).to eq 0
+ end
+ end
+ end
+
+ context "post message_only_carousel" do
+ it "#edit" do
+ capture_line_bot_client do |capture|
+ # edit
+ login_cms_user
+ visit edit_path
+
+ ensure_addon_opened("#addon-cms-agents-addons-line_poster")
+ within "#addon-cms-agents-addons-line_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.active"), from: "item[line_auto_post]"
+ select I18n.t("cms.options.line_post_format.message_only_carousel"), from: "item[line_post_format]"
+ fill_in "item[line_text_message]", with: line_text_message
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.draft_save")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+ expect(capture.broadcast.count).to eq 0
+ expect(capture.broadcast.messages).to eq nil
+ expect(Cms::SnsPostLog::Line.count).to eq 0
+
+ # send request
+ within ".mod-workflow-request" do
+ select I18n.t("mongoid.attributes.workflow/model/route.my_group"), from: "workflow_route"
+ click_on I18n.t("workflow.buttons.select")
+ click_on I18n.t("workflow.search_approvers.index")
+ end
+
+ wait_for_cbox do
+ expect(page).to have_content(user1.long_name)
+ click_on user1.long_name
+ end
+ within ".mod-workflow-request" do
+ click_on I18n.t("workflow.buttons.request")
+ end
+ expect(page).to have_css(".mod-workflow-view dd", text: I18n.t("workflow.state.request"))
+
+ # approve
+ login_user user1
+ visit show_path
+ within ".mod-workflow-approve" do
+ expect(page).to have_css(".sns-post-confirm", text: I18n.t("cms.confirm.line_post_enabled"))
+ click_on I18n.t("workflow.buttons.approve")
+ end
+ within "#addon-workflow-agents-addons-approver" do
+ expect(page).to have_css("dd", text: I18n.t("ss.options.state.approve"))
+ end
+ within "#addon-cms-agents-addons-release" do
+ expect(page).to have_css("dd", text: I18n.t("ss.options.state.public"))
+ end
+
+ visit show_path
+ within "#addon-cms-agents-addons-line_poster" do
+ have_css("dd", text: line_text_message)
+ end
+ expect(capture.broadcast.count).to eq 1
+ expect(capture.broadcast.messages.dig(0, :template, :type)).to eq "carousel"
+ expect(capture.broadcast.messages.dig(0, :altText)).to eq item.name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :title)).to eq item.name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :text)).to eq line_text_message
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :actions, 0, :uri)).to eq item.full_url
+ expect(Cms::SnsPostLog::Line.count).to eq 1
+ end
+ end
+
+ # with branch page
+ it "#edit" do
+ capture_line_bot_client do |capture|
+ # create branch
+ login_cms_user
+ visit show_path
+ within "#addon-workflow-agents-addons-branch" do
+ click_on I18n.t("workflow.create_branch")
+ expect(page).to have_link item.name
+ click_on item.name
+ end
+ expect(page).to have_link I18n.t("ss.links.edit")
+
+ # edit
+ click_on I18n.t("ss.links.edit")
+ ensure_addon_opened("#addon-cms-agents-addons-line_poster")
+ within "#addon-cms-agents-addons-line_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.active"), from: "item[line_auto_post]"
+ select I18n.t("cms.options.line_post_format.message_only_carousel"), from: "item[line_post_format]"
+ fill_in "item[line_text_message]", with: line_text_message
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.draft_save")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+ expect(capture.broadcast.count).to eq 0
+ expect(capture.broadcast.messages).to eq nil
+ expect(Cms::SnsPostLog::Line.count).to eq 0
+
+ # send request
+ within ".mod-workflow-request" do
+ select I18n.t("mongoid.attributes.workflow/model/route.my_group"), from: "workflow_route"
+ click_on I18n.t("workflow.buttons.select")
+ click_on I18n.t("workflow.search_approvers.index")
+ end
+
+ wait_for_cbox do
+ expect(page).to have_content(user1.long_name)
+ click_on user1.long_name
+ end
+ within ".mod-workflow-request" do
+ click_on I18n.t("workflow.buttons.request")
+ end
+ expect(page).to have_css(".mod-workflow-view dd", text: I18n.t("workflow.state.request"))
+
+ # approve
+ login_user user1
+ visit show_path
+ within "#addon-workflow-agents-addons-branch" do
+ expect(page).to have_link item.name
+ click_on item.name
+ end
+
+ within ".mod-workflow-approve" do
+ expect(page).to have_css(".sns-post-confirm", text: I18n.t("cms.confirm.line_post_enabled"))
+ click_on I18n.t("workflow.buttons.approve")
+ end
+ within "#addon-workflow-agents-addons-approver" do
+ expect(page).to have_css("dd", text: I18n.t("ss.options.state.approve"))
+ end
+ within "#addon-cms-agents-addons-release" do
+ expect(page).to have_css("dd", text: I18n.t("ss.options.state.public"))
+ end
+
+ visit show_path
+ within "#addon-cms-agents-addons-line_poster" do
+ have_css("dd", text: line_text_message)
+ end
+ expect(capture.broadcast.count).to eq 1
+ expect(capture.broadcast.messages.dig(0, :template, :type)).to eq "carousel"
+ expect(capture.broadcast.messages.dig(0, :altText)).to eq item.name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :title)).to eq item.name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :text)).to eq line_text_message
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :actions, 0, :uri)).to eq item.full_url
+ expect(Cms::SnsPostLog::Line.count).to eq 1
+ end
+ end
+ end
+ end
+end
diff --git a/spec/features/cms/sns_post/line/basic_spec.rb b/spec/features/cms/sns_post/line/basic_spec.rb
new file mode 100644
index 00000000000..7f298512a2c
--- /dev/null
+++ b/spec/features/cms/sns_post/line/basic_spec.rb
@@ -0,0 +1,345 @@
+require 'spec_helper'
+
+describe "article_pages line post", type: :feature, dbscope: :example, js: true do
+ let(:site) { cms_site }
+ let(:user) { cms_user }
+ let(:node) { create :article_node_page }
+ let(:item) { create :article_page, cur_node: node, state: "closed" }
+
+ let(:new_path) { new_article_page_path site.id, node }
+ let(:edit_path) { edit_article_page_path site.id, node, item }
+
+ let(:name) { "sample" }
+ let(:line_text_message) { unique_id }
+
+ context "publish directly" do
+ before do
+ site.line_channel_secret = unique_id
+ site.line_channel_access_token = unique_id
+ site.save!
+
+ login_cms_user
+ end
+
+ context "post none" do
+ it "#new" do
+ capture_line_bot_client do |capture|
+ visit new_path
+ within "form#item-form" do
+ fill_in "item[name]", with: name
+ end
+ ensure_addon_opened("#addon-cms-agents-addons-line_poster")
+ within "#addon-cms-agents-addons-line_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.expired"), from: "item[line_auto_post]"
+ select I18n.t("cms.options.line_post_format.message_only_carousel"), from: "item[line_post_format]"
+ fill_in "item[line_text_message]", with: line_text_message
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+ expect(capture.broadcast.count).to eq 0
+ expect(capture.broadcast.messages).to eq nil
+ expect(Cms::SnsPostLog::Line.count).to eq 0
+ end
+ end
+
+ it "#edit" do
+ capture_line_bot_client do |capture|
+ visit edit_path
+ ensure_addon_opened("#addon-cms-agents-addons-line_poster")
+ within "#addon-cms-agents-addons-line_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.expired"), from: "item[line_auto_post]"
+ select I18n.t("cms.options.line_post_format.message_only_carousel"), from: "item[line_post_format]"
+ fill_in "item[line_text_message]", with: line_text_message
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ within "#addon-cms-agents-addons-line_poster" do
+ have_css("dd", text: line_text_message)
+ end
+ expect(capture.broadcast.count).to eq 0
+ expect(capture.broadcast.messages).to eq nil
+ expect(Cms::SnsPostLog::Line.count).to eq 0
+ end
+ end
+ end
+
+ context "post message_only_carousel" do
+ it "#new" do
+ capture_line_bot_client do |capture|
+ visit new_path
+ within "form#item-form" do
+ fill_in "item[name]", with: name
+ end
+ ensure_addon_opened("#addon-cms-agents-addons-line_poster")
+ within "#addon-cms-agents-addons-line_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.active"), from: "item[line_auto_post]"
+ select I18n.t("cms.options.line_post_format.message_only_carousel"), from: "item[line_post_format]"
+ fill_in "item[line_text_message]", with: line_text_message
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ wait_for_cbox do
+ have_css("#alertExplanation", text: I18n.t("cms.confirm.line_post_enabled"))
+ click_on I18n.t("ss.buttons.ignore_alert")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ within "#addon-cms-agents-addons-line_poster" do
+ have_css("dd", text: line_text_message)
+ end
+
+ expect(capture.broadcast.count).to eq 1
+ expect(capture.broadcast.messages.dig(0, :template, :type)).to eq "carousel"
+ expect(capture.broadcast.messages.dig(0, :altText)).to eq name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :title)).to eq name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :text)).to eq line_text_message
+ expect(Cms::SnsPostLog::Line.count).to eq 1
+ end
+ end
+
+ it "#edit" do
+ capture_line_bot_client do |capture|
+ visit edit_path
+ ensure_addon_opened("#addon-cms-agents-addons-line_poster")
+ within "#addon-cms-agents-addons-line_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.active"), from: "item[line_auto_post]"
+ select I18n.t("cms.options.line_post_format.message_only_carousel"), from: "item[line_post_format]"
+ fill_in "item[line_text_message]", with: line_text_message
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ wait_for_cbox do
+ have_css("#alertExplanation", text: I18n.t("cms.confirm.line_post_enabled"))
+ click_on I18n.t("ss.buttons.ignore_alert")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ within "#addon-cms-agents-addons-line_poster" do
+ have_css("dd", text: line_text_message)
+ end
+
+ expect(capture.broadcast.count).to eq 1
+ expect(capture.broadcast.messages.dig(0, :template, :type)).to eq "carousel"
+ expect(capture.broadcast.messages.dig(0, :altText)).to eq item.name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :title)).to eq item.name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :text)).to eq line_text_message
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :actions, 0, :uri)).to eq item.full_url
+ expect(Cms::SnsPostLog::Line.count).to eq 1
+ end
+ end
+ end
+
+ context "post thumb_carousel" do
+ let!(:file) do
+ tmp_ss_file(
+ Cms::TempFile, contents: "#{Rails.root}/spec/fixtures/ss/logo.png", user: user, site: site, node: node
+ )
+ end
+
+ it "#new" do
+ capture_line_bot_client do |capture|
+ visit new_path
+ within "form#item-form" do
+ fill_in "item[name]", with: name
+ end
+
+ within "#addon-cms-agents-addons-thumb" do
+ first(".btn-file-upload").click
+ end
+ wait_for_cbox do
+ expect(page).to have_css(".file-view", text: file.name)
+ first("a[data-id='#{file.id}']").click
+ end
+
+ ensure_addon_opened("#addon-cms-agents-addons-line_poster")
+ within "#addon-cms-agents-addons-line_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.active"), from: "item[line_auto_post]"
+ select I18n.t("cms.options.line_post_format.thumb_carousel"), from: "item[line_post_format]"
+ fill_in "item[line_text_message]", with: line_text_message
+ end
+
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ wait_for_cbox do
+ have_css("#alertExplanation", text: I18n.t("cms.confirm.line_post_enabled"))
+ click_on I18n.t("ss.buttons.ignore_alert")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ within "#addon-cms-agents-addons-line_poster" do
+ have_css("dd", text: line_text_message)
+ end
+
+ expect(capture.broadcast.count).to eq 1
+ expect(capture.broadcast.messages.dig(0, :template, :type)).to eq "carousel"
+ expect(capture.broadcast.messages.dig(0, :altText)).to eq name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :title)).to eq name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :text)).to eq line_text_message
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, "thumbnailImageUrl")).to eq file.full_url
+ expect(Cms::SnsPostLog::Line.count).to eq 1
+ end
+ end
+
+ it "#edit" do
+ capture_line_bot_client do |capture|
+ visit edit_path
+ within "#addon-cms-agents-addons-thumb" do
+ first(".btn-file-upload").click
+ end
+ wait_for_cbox do
+ expect(page).to have_css(".file-view", text: file.name)
+ first("a[data-id='#{file.id}']").click
+ end
+
+ ensure_addon_opened("#addon-cms-agents-addons-line_poster")
+ within "#addon-cms-agents-addons-line_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.active"), from: "item[line_auto_post]"
+ select I18n.t("cms.options.line_post_format.thumb_carousel"), from: "item[line_post_format]"
+ fill_in "item[line_text_message]", with: line_text_message
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ wait_for_cbox do
+ have_css("#alertExplanation", text: I18n.t("cms.confirm.line_post_enabled"))
+ click_on I18n.t("ss.buttons.ignore_alert")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ within "#addon-cms-agents-addons-line_poster" do
+ have_css("dd", text: line_text_message)
+ end
+
+ expect(capture.broadcast.count).to eq 1
+ expect(capture.broadcast.messages.dig(0, :template, :type)).to eq "carousel"
+ expect(capture.broadcast.messages.dig(0, :altText)).to eq item.name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :title)).to eq item.name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :text)).to eq line_text_message
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :actions, 0, :uri)).to eq item.full_url
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, "thumbnailImageUrl")).to eq file.full_url
+ expect(Cms::SnsPostLog::Line.count).to eq 1
+ end
+ end
+ end
+
+ context "post body_carousel" do
+ let(:attach_file_path) { "#{Rails.root}/spec/fixtures/ss/file/keyvisual.gif" }
+
+ it "#new" do
+ capture_line_bot_client do |capture|
+ visit new_path
+ ensure_addon_opened("#addon-cms-agents-addons-file")
+ within "#addon-cms-agents-addons-file" do
+ wait_cbox_open do
+ click_on I18n.t("ss.buttons.upload")
+ end
+ end
+ wait_for_cbox do
+ attach_file "item[in_files][]", attach_file_path
+ wait_cbox_close do
+ click_button I18n.t("ss.buttons.attach")
+ end
+ end
+ within '#selected-files' do
+ click_on I18n.t("sns.image_paste")
+ end
+
+ within "form#item-form" do
+ fill_in "item[name]", with: name
+ end
+ ensure_addon_opened("#addon-cms-agents-addons-line_poster")
+ within "#addon-cms-agents-addons-line_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.active"), from: "item[line_auto_post]"
+ select I18n.t("cms.options.line_post_format.body_carousel"), from: "item[line_post_format]"
+ fill_in "item[line_text_message]", with: line_text_message
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ wait_for_cbox do
+ have_css("#alertExplanation", text: I18n.t("cms.confirm.line_post_enabled"))
+ click_on I18n.t("ss.buttons.ignore_alert")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ within "#addon-cms-agents-addons-line_poster" do
+ have_css("dd", text: line_text_message)
+ end
+
+ expect(capture.broadcast.count).to eq 1
+ expect(capture.broadcast.messages.dig(0, :template, :type)).to eq "carousel"
+ expect(capture.broadcast.messages.dig(0, :altText)).to eq name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :title)).to eq name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :text)).to eq line_text_message
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, "thumbnailImageUrl")).to include(::File.basename(attach_file_path))
+ expect(Cms::SnsPostLog::Line.count).to eq 1
+ end
+ end
+
+ it "#edit" do
+ capture_line_bot_client do |capture|
+ visit edit_path
+ ensure_addon_opened("#addon-cms-agents-addons-file")
+ within "#addon-cms-agents-addons-file" do
+ wait_cbox_open do
+ click_on I18n.t("ss.buttons.upload")
+ end
+ end
+ wait_for_cbox do
+ attach_file "item[in_files][]", attach_file_path
+ wait_cbox_close do
+ click_button I18n.t("ss.buttons.attach")
+ end
+ end
+ within '#selected-files' do
+ click_on I18n.t("sns.image_paste")
+ end
+
+ ensure_addon_opened("#addon-cms-agents-addons-line_poster")
+ within "#addon-cms-agents-addons-line_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.active"), from: "item[line_auto_post]"
+ select I18n.t("cms.options.line_post_format.body_carousel"), from: "item[line_post_format]"
+ fill_in "item[line_text_message]", with: line_text_message
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ wait_for_cbox do
+ have_css("#alertExplanation", text: I18n.t("cms.confirm.line_post_enabled"))
+ click_on I18n.t("ss.buttons.ignore_alert")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ within "#addon-cms-agents-addons-line_poster" do
+ have_css("dd", text: line_text_message)
+ end
+
+ expect(capture.broadcast.count).to eq 1
+ expect(capture.broadcast.messages.dig(0, :template, :type)).to eq "carousel"
+ expect(capture.broadcast.messages.dig(0, :altText)).to eq item.name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :title)).to eq item.name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :text)).to eq line_text_message
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :actions, 0, :uri)).to eq item.full_url
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, "thumbnailImageUrl")).to include(::File.basename(attach_file_path))
+ expect(Cms::SnsPostLog::Line.count).to eq 1
+ end
+ end
+ end
+ end
+end
diff --git a/spec/features/cms/sns_post/line/merge_spec.rb b/spec/features/cms/sns_post/line/merge_spec.rb
new file mode 100644
index 00000000000..5a5bdc07798
--- /dev/null
+++ b/spec/features/cms/sns_post/line/merge_spec.rb
@@ -0,0 +1,178 @@
+require 'spec_helper'
+
+describe "article_pages line post", type: :feature, dbscope: :example, js: true do
+ let(:site) { cms_site }
+ let(:user) { cms_user }
+ let(:node) { create :article_node_page }
+ let(:item) { create :article_page, cur_node: node, state: "closed" }
+
+ let(:new_path) { new_article_page_path site.id, node }
+ let(:show_path) { article_page_path site.id, node, item }
+
+ let(:name) { "sample" }
+ let(:line_text_message) { unique_id }
+
+ context "merge and publish" do
+ before do
+ site.line_channel_secret = unique_id
+ site.line_channel_access_token = unique_id
+ site.save!
+
+ login_cms_user
+ end
+
+ context "post none" do
+ it "#edit" do
+ capture_line_bot_client do |capture|
+ visit show_path
+ within "#addon-workflow-agents-addons-branch" do
+ click_on I18n.t("workflow.create_branch")
+ expect(page).to have_link item.name
+ click_on item.name
+ end
+
+ expect(page).to have_link I18n.t("ss.links.edit")
+ click_on I18n.t("ss.links.edit")
+
+ ensure_addon_opened("#addon-cms-agents-addons-line_poster")
+ within "#addon-cms-agents-addons-line_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.expired"), from: "item[line_auto_post]"
+ select I18n.t("cms.options.line_post_format.message_only_carousel"), from: "item[line_post_format]"
+ fill_in "item[line_text_message]", with: line_text_message
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ visit show_path
+ within "#addon-cms-agents-addons-line_poster" do
+ have_css("dd", text: line_text_message)
+ end
+ expect(capture.broadcast.count).to eq 0
+ expect(capture.broadcast.messages).to eq nil
+ expect(Cms::SnsPostLog::Line.count).to eq 0
+ end
+ end
+ end
+
+ context "post message_only_carousel" do
+ it "#edit" do
+ capture_line_bot_client do |capture|
+ visit show_path
+ within "#addon-workflow-agents-addons-branch" do
+ click_on I18n.t("workflow.create_branch")
+ expect(page).to have_link item.name
+ click_on item.name
+ end
+
+ expect(page).to have_link I18n.t("ss.links.edit")
+ click_on I18n.t("ss.links.edit")
+
+ ensure_addon_opened("#addon-cms-agents-addons-line_poster")
+ within "#addon-cms-agents-addons-line_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.active"), from: "item[line_auto_post]"
+ select I18n.t("cms.options.line_post_format.message_only_carousel"), from: "item[line_post_format]"
+ fill_in "item[line_text_message]", with: line_text_message
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ wait_for_cbox do
+ have_css("#alertExplanation", text: I18n.t("cms.confirm.line_post_enabled"))
+ click_on I18n.t("ss.buttons.ignore_alert")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ visit show_path
+ within "#addon-cms-agents-addons-line_poster" do
+ have_css("dd", text: line_text_message)
+ end
+ expect(capture.broadcast.count).to eq 1
+ expect(capture.broadcast.messages.dig(0, :template, :type)).to eq "carousel"
+ expect(capture.broadcast.messages.dig(0, :altText)).to eq item.name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :title)).to eq item.name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :text)).to eq line_text_message
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :actions, 0, :uri)).to eq item.full_url
+ expect(Cms::SnsPostLog::Line.count).to eq 1
+ end
+ end
+
+ # master page already posted
+ it "#edit" do
+ capture_line_bot_client do |capture|
+ # first post
+ visit show_path
+ within "#addon-workflow-agents-addons-branch" do
+ click_on I18n.t("workflow.create_branch")
+ expect(page).to have_link item.name
+ click_on item.name
+ end
+
+ expect(page).to have_link I18n.t("ss.links.edit")
+ click_on I18n.t("ss.links.edit")
+
+ ensure_addon_opened("#addon-cms-agents-addons-line_poster")
+ within "#addon-cms-agents-addons-line_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.active"), from: "item[line_auto_post]"
+ select I18n.t("cms.options.line_post_format.message_only_carousel"), from: "item[line_post_format]"
+ fill_in "item[line_text_message]", with: line_text_message
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ wait_for_cbox do
+ have_css("#alertExplanation", text: I18n.t("cms.confirm.line_post_enabled"))
+ click_on I18n.t("ss.buttons.ignore_alert")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ visit show_path
+ within "#addon-cms-agents-addons-line_poster" do
+ have_css("dd", text: line_text_message)
+ end
+ expect(capture.broadcast.count).to eq 1
+ expect(capture.broadcast.messages.dig(0, :template, :type)).to eq "carousel"
+ expect(capture.broadcast.messages.dig(0, :altText)).to eq item.name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :title)).to eq item.name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :text)).to eq line_text_message
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :actions, 0, :uri)).to eq item.full_url
+ expect(Cms::SnsPostLog::Line.count).to eq 1
+
+ # second post
+ visit show_path
+ within "#addon-workflow-agents-addons-branch" do
+ click_on I18n.t("workflow.create_branch")
+ expect(page).to have_link item.name
+ click_on item.name
+ end
+
+ expect(page).to have_link I18n.t("ss.links.edit")
+ click_on I18n.t("ss.links.edit")
+
+ ensure_addon_opened("#addon-cms-agents-addons-line_poster")
+ within "#addon-cms-agents-addons-line_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.active"))
+ fill_in "item[line_text_message]", with: "modified"
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ visit show_path
+ within "#addon-cms-agents-addons-line_poster" do
+ have_css("dd", text: "modified")
+ end
+ expect(capture.broadcast.count).to eq 1
+ expect(capture.broadcast.messages.dig(0, :template, :type)).to eq "carousel"
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :text)).to eq line_text_message
+ expect(Cms::SnsPostLog::Line.count).to eq 1
+ end
+ end
+ end
+ end
+end
diff --git a/spec/features/cms/sns_post/line/release_page_spec.rb b/spec/features/cms/sns_post/line/release_page_spec.rb
new file mode 100644
index 00000000000..dbe75007254
--- /dev/null
+++ b/spec/features/cms/sns_post/line/release_page_spec.rb
@@ -0,0 +1,224 @@
+require 'spec_helper'
+
+describe "article_pages line post", type: :feature, dbscope: :example, js: true do
+ let(:site) { cms_site }
+ let(:node) { create :article_node_page }
+ let(:item) { create :article_page, cur_node: node, state: "closed" }
+
+ let(:user) { cms_user }
+ let!(:user1) { create(:cms_test_user, group_ids: user.group_ids, cms_role_ids: user.cms_role_ids) }
+
+ let(:show_path) { article_page_path site.id, node, item }
+ let(:edit_path) { edit_article_page_path site.id, node, item }
+
+ let(:line_text_message) { unique_id }
+ let(:release_date) { Time.zone.at(1.day.from_now.to_i) }
+
+ context "publish at release_date" do
+ before do
+ site.line_channel_secret = unique_id
+ site.line_channel_access_token = unique_id
+ site.save!
+
+ login_cms_user
+ end
+
+ context "post none" do
+ it "#edit" do
+ capture_line_bot_client do |capture|
+ visit edit_path
+ ensure_addon_opened("#addon-cms-agents-addons-line_poster")
+ within "#addon-cms-agents-addons-line_poster" do
+ select I18n.t("ss.options.state.expired"), from: "item[line_auto_post]"
+ select I18n.t("cms.options.line_post_format.message_only_carousel"), from: "item[line_post_format]"
+ fill_in "item[line_text_message]", with: line_text_message
+ end
+
+ ensure_addon_opened("#addon-cms-agents-addons-release_plan")
+ within "#addon-cms-agents-addons-release_plan" do
+ fill_in 'item[release_date]', with: release_date.strftime("%Y/%m/%d %H:%M")
+ end
+
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ within "#addon-cms-agents-addons-release" do
+ expect(page).to have_css('dd', text: I18n.t('ss.state.ready'))
+ end
+ expect(capture.broadcast.count).to eq 0
+ expect(capture.broadcast.messages).to eq nil
+ expect(Cms::SnsPostLog::Line.count).to eq 0
+
+ Timecop.travel(release_date) do
+ job = Cms::Page::ReleaseJob.bind(site_id: node.site_id, node_id: node.id)
+ expect { job.perform_now }.to output.to_stdout
+
+ login_cms_user
+ visit show_path
+
+ within "#addon-cms-agents-addons-release" do
+ expect(page).to have_css('dd', text: I18n.t('ss.options.state.public'))
+ end
+ expect(capture.broadcast.count).to eq 0
+ expect(capture.broadcast.messages).to eq nil
+ expect(Cms::SnsPostLog::Line.count).to eq 0
+ end
+ end
+ end
+ end
+
+ context "post message_only_carousel" do
+ it "#edit" do
+ capture_line_bot_client do |capture|
+ visit edit_path
+ ensure_addon_opened("#addon-cms-agents-addons-line_poster")
+ within "#addon-cms-agents-addons-line_poster" do
+ select I18n.t("ss.options.state.active"), from: "item[line_auto_post]"
+ select I18n.t("cms.options.line_post_format.message_only_carousel"), from: "item[line_post_format]"
+ fill_in "item[line_text_message]", with: line_text_message
+ end
+
+ ensure_addon_opened("#addon-cms-agents-addons-release_plan")
+ within "#addon-cms-agents-addons-release_plan" do
+ fill_in 'item[release_date]', with: release_date.strftime("%Y/%m/%d %H:%M")
+ end
+
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ wait_for_cbox do
+ have_css("#alertExplanation", text: I18n.t("cms.confirm.line_post_enabled"))
+ click_on I18n.t("ss.buttons.ignore_alert")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ within "#addon-cms-agents-addons-release" do
+ expect(page).to have_css('dd', text: I18n.t('ss.state.ready'))
+ end
+ expect(capture.broadcast.count).to eq 0
+ expect(capture.broadcast.messages).to eq nil
+ expect(Cms::SnsPostLog::Line.count).to eq 0
+
+ Timecop.travel(release_date) do
+ job = Cms::Page::ReleaseJob.bind(site_id: node.site_id, node_id: node.id)
+ expect { job.perform_now }.to output.to_stdout
+
+ login_cms_user
+ visit show_path
+
+ within "#addon-cms-agents-addons-release" do
+ expect(page).to have_css('dd', text: I18n.t('ss.options.state.public'))
+ end
+ expect(capture.broadcast.count).to eq 1
+ expect(capture.broadcast.messages.dig(0, :template, :type)).to eq "carousel"
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :text)).to eq line_text_message
+ expect(Cms::SnsPostLog::Line.count).to eq 1
+ end
+ end
+ end
+
+ # master and approve
+ it "#edit" do
+ capture_line_bot_client do |capture|
+ # create branch
+ login_cms_user
+ visit show_path
+ within "#addon-workflow-agents-addons-branch" do
+ click_on I18n.t("workflow.create_branch")
+ expect(page).to have_link item.name
+ click_on item.name
+ end
+ expect(page).to have_link I18n.t("ss.links.edit")
+
+ # edit
+ click_on I18n.t("ss.links.edit")
+ ensure_addon_opened("#addon-cms-agents-addons-line_poster")
+ within "#addon-cms-agents-addons-line_poster" do
+ select I18n.t("ss.options.state.active"), from: "item[line_auto_post]"
+ select I18n.t("cms.options.line_post_format.message_only_carousel"), from: "item[line_post_format]"
+ fill_in "item[line_text_message]", with: line_text_message
+ end
+
+ ensure_addon_opened("#addon-cms-agents-addons-release_plan")
+ within "#addon-cms-agents-addons-release_plan" do
+ fill_in 'item[release_date]', with: release_date.strftime("%Y/%m/%d %H:%M")
+ end
+ first("#addon-cms-agents-addons-release_plan").click
+
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.draft_save")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+ expect(capture.broadcast.count).to eq 0
+ expect(capture.broadcast.messages).to eq nil
+ expect(Cms::SnsPostLog::Line.count).to eq 0
+
+ # send request
+ within ".mod-workflow-request" do
+ select I18n.t("mongoid.attributes.workflow/model/route.my_group"), from: "workflow_route"
+ click_on I18n.t("workflow.buttons.select")
+ click_on I18n.t("workflow.search_approvers.index")
+ end
+
+ wait_for_cbox do
+ expect(page).to have_content(user1.long_name)
+ click_on user1.long_name
+ end
+ within ".mod-workflow-request" do
+ click_on I18n.t("workflow.buttons.request")
+ end
+ expect(page).to have_css(".mod-workflow-view dd", text: I18n.t("workflow.state.request"))
+
+ # approve
+ login_user user1
+ visit show_path
+ within "#addon-workflow-agents-addons-branch" do
+ expect(page).to have_link item.name
+ click_on item.name
+ end
+
+ within ".mod-workflow-approve" do
+ expect(page).to have_css(".sns-post-confirm", text: I18n.t("cms.confirm.line_post_enabled"))
+ click_on I18n.t("workflow.buttons.approve")
+ end
+ within "#addon-workflow-agents-addons-approver" do
+ expect(page).to have_css("dd", text: I18n.t("ss.options.state.approve"))
+ end
+ within "#addon-cms-agents-addons-release" do
+ expect(page).to have_css("dd", text: I18n.t("ss.options.state.ready"))
+ end
+
+ visit show_path
+ within "#addon-cms-agents-addons-line_poster" do
+ have_css("dd", text: line_text_message)
+ end
+ expect(capture.broadcast.count).to eq 0
+ expect(capture.broadcast.messages).to eq nil
+ expect(Cms::SnsPostLog::Line.count).to eq 0
+
+ Timecop.travel(release_date) do
+ job = Cms::Page::ReleaseJob.bind(site_id: node.site_id, node_id: node.id)
+ expect { job.perform_now }.to output.to_stdout
+
+ login_cms_user
+ visit show_path
+
+ within "#addon-cms-agents-addons-release" do
+ expect(page).to have_css('dd', text: I18n.t('ss.options.state.public'))
+ end
+
+ expect(capture.broadcast.count).to eq 1
+ expect(capture.broadcast.messages.dig(0, :template, :type)).to eq "carousel"
+ expect(capture.broadcast.messages.dig(0, :altText)).to eq item.name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :title)).to eq item.name
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :text)).to eq line_text_message
+ expect(capture.broadcast.messages.dig(0, :template, :columns, 0, :actions, 0, :uri)).to eq item.full_url
+ expect(Cms::SnsPostLog::Line.count).to eq 1
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/features/cms/sns_post/logs/basic_spec.rb b/spec/features/cms/sns_post/logs/basic_spec.rb
new file mode 100644
index 00000000000..9b8cfc2c53f
--- /dev/null
+++ b/spec/features/cms/sns_post/logs/basic_spec.rb
@@ -0,0 +1,90 @@
+require 'spec_helper'
+
+describe "cms_pages sns post", type: :feature, dbscope: :example, js: true do
+ let(:site) { cms_site }
+ let(:user) { cms_user }
+ let(:node) { create :cms_node_page }
+ let(:item) { create :cms_page, cur_node: node, state: "closed" }
+
+ let(:edit_path) { edit_cms_page_path site.id, node, item }
+ let(:index_path) { cms_sns_post_logs_path site.id }
+
+ let(:line_text_message) { unique_id }
+
+ context "publish directly" do
+ before do
+ site.line_channel_secret = unique_id
+ site.line_channel_access_token = unique_id
+
+ site.twitter_username = unique_id
+ site.twitter_consumer_key = unique_id
+ site.twitter_consumer_secret = unique_id
+ site.twitter_access_token = unique_id
+ site.twitter_access_token_secret = unique_id
+ site.save!
+
+ login_cms_user
+ end
+
+ context "post message" do
+ it "#edit" do
+ capture_line_bot_client do |c1|
+ capture_twitter_rest_client do |c2|
+ visit edit_path
+ ensure_addon_opened("#addon-cms-agents-addons-line_poster")
+ within "#addon-cms-agents-addons-line_poster" do
+ select I18n.t("ss.options.state.active"), from: "item[line_auto_post]"
+ select I18n.t("cms.options.line_post_format.message_only_carousel"), from: "item[line_post_format]"
+ fill_in "item[line_text_message]", with: line_text_message
+ end
+
+ ensure_addon_opened("#addon-cms-agents-addons-twitter_poster")
+ within "#addon-cms-agents-addons-twitter_poster" do
+ select I18n.t("ss.options.state.active"), from: "item[twitter_auto_post]"
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ wait_for_cbox do
+ have_css("#alertExplanation", text: I18n.t("cms.confirm.line_post_enabled"))
+ have_css("#alertExplanation", text: I18n.t("cms.confirm.twitter_post_enabled"))
+ click_on I18n.t("ss.buttons.ignore_alert")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ expect(Cms::SnsPostLog::Twitter.count).to eq 1
+ expect(Cms::SnsPostLog::Line.count).to eq 1
+
+ visit index_path
+ within ".list-items" do
+ expect(page).to have_css("a", text: I18n.t("cms.options.sns_post_log_type.line"))
+ expect(page).to have_css("a", text: I18n.t("cms.options.sns_post_log_type.twitter"))
+ end
+
+ # delete line log
+ within ".list-items" do
+ first("a", text: I18n.t("cms.options.sns_post_log_type.line")).click
+ end
+ expect(page).to have_link item.name
+ click_on I18n.t("ss.links.delete")
+ click_on I18n.t("ss.buttons.delete")
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.deleted'))
+ expect(Cms::SnsPostLog::Twitter.count).to eq 1
+ expect(Cms::SnsPostLog::Line.count).to eq 0
+
+ # delete twitter log
+ within ".list-items" do
+ first("a", text: I18n.t("cms.options.sns_post_log_type.twitter")).click
+ end
+ expect(page).to have_link item.name
+ click_on I18n.t("ss.links.delete")
+ click_on I18n.t("ss.buttons.delete")
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.deleted'))
+ expect(Cms::SnsPostLog::Twitter.count).to eq 0
+ expect(Cms::SnsPostLog::Line.count).to eq 0
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/features/cms/sns_post/twitter/approval_spec.rb b/spec/features/cms/sns_post/twitter/approval_spec.rb
new file mode 100644
index 00000000000..eb662a4729f
--- /dev/null
+++ b/spec/features/cms/sns_post/twitter/approval_spec.rb
@@ -0,0 +1,251 @@
+require 'spec_helper'
+
+describe "article_pages twitter post", type: :feature, dbscope: :example, js: true do
+ let(:site) { cms_site }
+ let(:node) { create :article_node_page }
+ let(:item) { create :article_page, cur_node: node, state: "closed" }
+
+ let(:user) { cms_user }
+ let!(:user1) { create(:cms_test_user, group_ids: user.group_ids, cms_role_ids: user.cms_role_ids) }
+
+ let(:show_path) { article_page_path site.id, node, item }
+ let(:edit_path) { edit_article_page_path site.id, node, item }
+
+ let(:line_text_message) { unique_id }
+
+ context "approve and publish" do
+ before do
+ site.twitter_username = unique_id
+ site.twitter_consumer_key = unique_id
+ site.twitter_consumer_secret = unique_id
+ site.twitter_access_token = unique_id
+ site.twitter_access_token_secret = unique_id
+ site.save!
+ end
+
+ context "post none" do
+ it "#edit" do
+ capture_twitter_rest_client do |capture|
+ # edit
+ login_cms_user
+ visit edit_path
+
+ ensure_addon_opened("#addon-cms-agents-addons-twitter_poster")
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.expired"), from: "item[twitter_auto_post]"
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.draft_save")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ visit show_path
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_no_css("dd", text: "https://twitter.com/user_screen_id/status/twitter_id")
+ end
+ expect(capture.update.count).to eq 0
+ expect(capture.update.tweet).to eq nil
+ expect(capture.update_with_media.count).to eq 0
+ expect(capture.update_with_media.tweet).to eq nil
+ expect(Cms::SnsPostLog::Twitter.count).to eq 0
+
+ # send request
+ within ".mod-workflow-request" do
+ select I18n.t("mongoid.attributes.workflow/model/route.my_group"), from: "workflow_route"
+ click_on I18n.t("workflow.buttons.select")
+ click_on I18n.t("workflow.search_approvers.index")
+ end
+
+ wait_for_cbox do
+ expect(page).to have_content(user1.long_name)
+ click_on user1.long_name
+ end
+ within ".mod-workflow-request" do
+ click_on I18n.t("workflow.buttons.request")
+ end
+ expect(page).to have_css(".mod-workflow-view dd", text: I18n.t("workflow.state.request"))
+
+ # approve
+ login_user user1
+ visit show_path
+ within ".mod-workflow-approve" do
+ expect(page).to have_no_css(".sns-post-confirm", text: I18n.t("cms.confirm.twitter_post_enabled"))
+ click_on I18n.t("workflow.buttons.approve")
+ end
+ within "#addon-workflow-agents-addons-approver" do
+ expect(page).to have_css("dd", text: I18n.t("ss.options.state.approve"))
+ end
+ within "#addon-cms-agents-addons-release" do
+ expect(page).to have_css("dd", text: I18n.t("ss.options.state.public"))
+ end
+
+ login_cms_user
+ visit show_path
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_no_css("dd", text: "https://twitter.com/user_screen_id/status/twitter_id")
+ end
+ expect(capture.update.count).to eq 0
+ expect(capture.update.tweet).to eq nil
+ expect(capture.update_with_media.count).to eq 0
+ expect(capture.update_with_media.tweet).to eq nil
+ expect(Cms::SnsPostLog::Twitter.count).to eq 0
+ end
+ end
+ end
+
+ context "post message" do
+ it "#edit" do
+ capture_twitter_rest_client do |capture|
+ # edit
+ login_cms_user
+ visit edit_path
+
+ ensure_addon_opened("#addon-cms-agents-addons-twitter_poster")
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.active"), from: "item[twitter_auto_post]"
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.draft_save")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_no_css("dd", text: "https://twitter.com/user_screen_id/status/twitter_id")
+ end
+ expect(capture.update.count).to eq 0
+ expect(capture.update.tweet).to eq nil
+ expect(capture.update_with_media.count).to eq 0
+ expect(capture.update_with_media.tweet).to eq nil
+ expect(Cms::SnsPostLog::Twitter.count).to eq 0
+
+ # send request
+ within ".mod-workflow-request" do
+ select I18n.t("mongoid.attributes.workflow/model/route.my_group"), from: "workflow_route"
+ click_on I18n.t("workflow.buttons.select")
+ click_on I18n.t("workflow.search_approvers.index")
+ end
+
+ wait_for_cbox do
+ expect(page).to have_content(user1.long_name)
+ click_on user1.long_name
+ end
+ within ".mod-workflow-request" do
+ click_on I18n.t("workflow.buttons.request")
+ end
+ expect(page).to have_css(".mod-workflow-view dd", text: I18n.t("workflow.state.request"))
+
+ # approve
+ login_user user1
+ visit show_path
+ within ".mod-workflow-approve" do
+ expect(page).to have_css(".sns-post-confirm", text: I18n.t("cms.confirm.twitter_post_enabled"))
+ click_on I18n.t("workflow.buttons.approve")
+ end
+ within "#addon-workflow-agents-addons-approver" do
+ expect(page).to have_css("dd", text: I18n.t("ss.options.state.approve"))
+ end
+ within "#addon-cms-agents-addons-release" do
+ expect(page).to have_css("dd", text: I18n.t("ss.options.state.public"))
+ end
+
+ login_cms_user
+ visit show_path
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("dd", text: "https://twitter.com/user_screen_id/status/twitter_id")
+ end
+ expect(capture.update.count).to eq 1
+ expect(capture.update.tweet).to include(item.name)
+ expect(capture.update.tweet).to include(item.full_url)
+ expect(capture.update_with_media.count).to eq 0
+ expect(capture.update_with_media.tweet).to eq nil
+ expect(Cms::SnsPostLog::Twitter.count).to eq 1
+ end
+ end
+
+ # with branch page
+ it "#edit" do
+ capture_twitter_rest_client do |capture|
+ # create branch
+ login_cms_user
+ visit show_path
+ within "#addon-workflow-agents-addons-branch" do
+ click_on I18n.t("workflow.create_branch")
+ expect(page).to have_link item.name
+ click_on item.name
+ end
+ expect(page).to have_link I18n.t("ss.links.edit")
+
+ # edit
+ click_on I18n.t("ss.links.edit")
+ ensure_addon_opened("#addon-cms-agents-addons-twitter_poster")
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.active"), from: "item[twitter_auto_post]"
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.draft_save")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_no_css("dd", text: "https://twitter.com/user_screen_id/status/twitter_id")
+ end
+ expect(capture.update.count).to eq 0
+ expect(capture.update.tweet).to eq nil
+ expect(capture.update_with_media.count).to eq 0
+ expect(capture.update_with_media.tweet).to eq nil
+ expect(Cms::SnsPostLog::Twitter.count).to eq 0
+
+ # send request
+ within ".mod-workflow-request" do
+ select I18n.t("mongoid.attributes.workflow/model/route.my_group"), from: "workflow_route"
+ click_on I18n.t("workflow.buttons.select")
+ click_on I18n.t("workflow.search_approvers.index")
+ end
+
+ wait_for_cbox do
+ expect(page).to have_content(user1.long_name)
+ click_on user1.long_name
+ end
+ within ".mod-workflow-request" do
+ click_on I18n.t("workflow.buttons.request")
+ end
+ expect(page).to have_css(".mod-workflow-view dd", text: I18n.t("workflow.state.request"))
+
+ # approve
+ login_user user1
+ visit show_path
+ within "#addon-workflow-agents-addons-branch" do
+ expect(page).to have_link item.name
+ click_on item.name
+ end
+
+ within ".mod-workflow-approve" do
+ expect(page).to have_css(".sns-post-confirm", text: I18n.t("cms.confirm.twitter_post_enabled"))
+ click_on I18n.t("workflow.buttons.approve")
+ end
+ within "#addon-workflow-agents-addons-approver" do
+ expect(page).to have_css("dd", text: I18n.t("ss.options.state.approve"))
+ end
+ within "#addon-cms-agents-addons-release" do
+ expect(page).to have_css("dd", text: I18n.t("ss.options.state.public"))
+ end
+
+ login_cms_user
+ visit show_path
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("dd", text: "https://twitter.com/user_screen_id/status/twitter_id")
+ end
+ expect(capture.update.count).to eq 1
+ expect(capture.update.tweet).to include(item.name)
+ expect(capture.update.tweet).to include(item.full_url)
+ expect(capture.update_with_media.count).to eq 0
+ expect(capture.update_with_media.tweet).to eq nil
+ expect(Cms::SnsPostLog::Twitter.count).to eq 1
+ end
+ end
+ end
+ end
+end
diff --git a/spec/features/cms/sns_post/twitter/basic_spec.rb b/spec/features/cms/sns_post/twitter/basic_spec.rb
new file mode 100644
index 00000000000..2cbb3569654
--- /dev/null
+++ b/spec/features/cms/sns_post/twitter/basic_spec.rb
@@ -0,0 +1,246 @@
+require 'spec_helper'
+
+describe "article_pages twitter post", type: :feature, dbscope: :example, js: true do
+ let(:site) { cms_site }
+ let(:user) { cms_user }
+ let(:node) { create :article_node_page }
+ let(:item) { create :article_page, cur_node: node, state: "closed" }
+
+ let(:new_path) { new_article_page_path site.id, node }
+ let(:show_path) { article_page_path site.id, node, item }
+ let(:edit_path) { edit_article_page_path site.id, node, item }
+
+ let(:name) { "sample" }
+
+ context "publish directly" do
+ before do
+ site.twitter_username = unique_id
+ site.twitter_consumer_key = unique_id
+ site.twitter_consumer_secret = unique_id
+ site.twitter_access_token = unique_id
+ site.twitter_access_token_secret = unique_id
+ site.save!
+
+ login_cms_user
+ end
+
+ context "post none" do
+ it "#new" do
+ capture_twitter_rest_client do |capture|
+ visit new_path
+ within "form#item-form" do
+ fill_in "item[name]", with: name
+ end
+ ensure_addon_opened("#addon-cms-agents-addons-twitter_poster")
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.expired"), from: "item[twitter_auto_post]"
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ visit current_path
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_no_css("dd", text: "https://twitter.com/user_screen_id/status/twitter_id")
+ end
+ expect(capture.update.count).to eq 0
+ expect(capture.update.tweet).to eq nil
+ expect(capture.update_with_media.count).to eq 0
+ expect(capture.update_with_media.tweet).to eq nil
+ expect(Cms::SnsPostLog::Twitter.count).to eq 0
+ end
+ end
+
+ it "#edit" do
+ capture_twitter_rest_client do |capture|
+ visit edit_path
+ ensure_addon_opened("#addon-cms-agents-addons-twitter_poster")
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.expired"), from: "item[twitter_auto_post]"
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ visit show_path
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_no_css("dd", text: "https://twitter.com/user_screen_id/status/twitter_id")
+ end
+ expect(capture.update.count).to eq 0
+ expect(capture.update.tweet).to eq nil
+ expect(capture.update_with_media.count).to eq 0
+ expect(capture.update_with_media.tweet).to eq nil
+ expect(Cms::SnsPostLog::Twitter.count).to eq 0
+ end
+ end
+ end
+
+ context "post message" do
+ it "#new" do
+ capture_twitter_rest_client do |capture|
+ visit new_path
+ within "form#item-form" do
+ fill_in "item[name]", with: name
+ end
+ ensure_addon_opened("#addon-cms-agents-addons-twitter_poster")
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.active"), from: "item[twitter_auto_post]"
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ wait_for_cbox do
+ have_css("#alertExplanation", text: I18n.t("cms.confirm.twitter_post_enabled"))
+ click_on I18n.t("ss.buttons.ignore_alert")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ visit current_path
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("dd", text: "https://twitter.com/user_screen_id/status/twitter_id")
+ end
+ expect(capture.update.count).to eq 1
+ expect(capture.update.tweet).to include(name)
+ expect(capture.update_with_media.count).to eq 0
+ expect(capture.update_with_media.tweet).to eq nil
+ expect(Cms::SnsPostLog::Twitter.count).to eq 1
+ end
+ end
+
+ it "#edit" do
+ capture_twitter_rest_client do |capture|
+ visit edit_path
+ ensure_addon_opened("#addon-cms-agents-addons-twitter_poster")
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.active"), from: "item[twitter_auto_post]"
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ wait_for_cbox do
+ have_css("#alertExplanation", text: I18n.t("cms.confirm.twitter_post_enabled"))
+ click_on I18n.t("ss.buttons.ignore_alert")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ visit show_path
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("dd", text: "https://twitter.com/user_screen_id/status/twitter_id")
+ end
+ expect(capture.update.count).to eq 1
+ expect(capture.update.tweet).to include(item.name)
+ expect(capture.update.tweet).to include(item.full_url)
+ expect(capture.update_with_media.count).to eq 0
+ expect(capture.update_with_media.tweet).to eq nil
+ expect(Cms::SnsPostLog::Twitter.count).to eq 1
+ end
+ end
+ end
+
+ context "post message add media files" do
+ let(:attach_file_path) { "#{Rails.root}/spec/fixtures/ss/file/keyvisual.gif" }
+
+ it "#new" do
+ capture_twitter_rest_client do |capture|
+ visit new_path
+ within "form#item-form" do
+ fill_in "item[name]", with: name
+ end
+
+ ensure_addon_opened("#addon-cms-agents-addons-file")
+ within "#addon-cms-agents-addons-file" do
+ wait_cbox_open do
+ click_on I18n.t("ss.buttons.upload")
+ end
+ end
+ wait_for_cbox do
+ attach_file "item[in_files][]", attach_file_path
+ wait_cbox_close do
+ click_button I18n.t("ss.buttons.attach")
+ end
+ end
+ within '#selected-files' do
+ click_on I18n.t("sns.image_paste")
+ end
+
+ ensure_addon_opened("#addon-cms-agents-addons-twitter_poster")
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.active"), from: "item[twitter_auto_post]"
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ wait_for_cbox do
+ have_css("#alertExplanation", text: I18n.t("cms.confirm.twitter_post_enabled"))
+ click_on I18n.t("ss.buttons.ignore_alert")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ visit current_path
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("dd", text: "https://twitter.com/user_screen_id/status/twitter_id")
+ end
+ expect(capture.update.count).to eq 0
+ expect(capture.update.tweet).to eq nil
+ expect(capture.update_with_media.count).to eq 1
+ expect(capture.update_with_media.tweet).to include(name)
+ expect(Cms::SnsPostLog::Twitter.count).to eq 1
+ end
+ end
+
+ it "#edit" do
+ capture_twitter_rest_client do |capture|
+ visit edit_path
+
+ ensure_addon_opened("#addon-cms-agents-addons-file")
+ within "#addon-cms-agents-addons-file" do
+ wait_cbox_open do
+ click_on I18n.t("ss.buttons.upload")
+ end
+ end
+ wait_for_cbox do
+ attach_file "item[in_files][]", attach_file_path
+ wait_cbox_close do
+ click_button I18n.t("ss.buttons.attach")
+ end
+ end
+ within '#selected-files' do
+ click_on I18n.t("sns.image_paste")
+ end
+
+ ensure_addon_opened("#addon-cms-agents-addons-twitter_poster")
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.active"), from: "item[twitter_auto_post]"
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ wait_for_cbox do
+ have_css("#alertExplanation", text: I18n.t("cms.confirm.twitter_post_enabled"))
+ click_on I18n.t("ss.buttons.ignore_alert")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ visit show_path
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("dd", text: "https://twitter.com/user_screen_id/status/twitter_id")
+ end
+ expect(capture.update.count).to eq 0
+ expect(capture.update.tweet).to eq nil
+ expect(capture.update_with_media.count).to eq 1
+ expect(capture.update_with_media.tweet).to include(item.name)
+ expect(capture.update_with_media.tweet).to include(item.full_url)
+ expect(Cms::SnsPostLog::Twitter.count).to eq 1
+ end
+ end
+ end
+ end
+end
diff --git a/spec/features/cms/sns_post/twitter/merge_spec.rb b/spec/features/cms/sns_post/twitter/merge_spec.rb
new file mode 100644
index 00000000000..26b622d3b77
--- /dev/null
+++ b/spec/features/cms/sns_post/twitter/merge_spec.rb
@@ -0,0 +1,176 @@
+require 'spec_helper'
+
+describe "article_pages twitter post", type: :feature, dbscope: :example, js: true do
+ let(:site) { cms_site }
+ let(:user) { cms_user }
+ let(:node) { create :article_node_page }
+ let(:item) { create :article_page, cur_node: node, state: "closed" }
+
+ let(:new_path) { new_article_page_path site.id, node }
+ let(:show_path) { article_page_path site.id, node, item }
+
+ let(:name) { "sample" }
+
+ context "merge and publish" do
+ before do
+ site.twitter_username = unique_id
+ site.twitter_consumer_key = unique_id
+ site.twitter_consumer_secret = unique_id
+ site.twitter_access_token = unique_id
+ site.twitter_access_token_secret = unique_id
+ site.save!
+
+ login_cms_user
+ end
+
+ context "post none" do
+ it "#edit" do
+ capture_twitter_rest_client do |capture|
+ visit show_path
+ within "#addon-workflow-agents-addons-branch" do
+ click_on I18n.t("workflow.create_branch")
+ expect(page).to have_link item.name
+ click_on item.name
+ end
+
+ expect(page).to have_link I18n.t("ss.links.edit")
+ click_on I18n.t("ss.links.edit")
+
+ ensure_addon_opened("#addon-cms-agents-addons-twitter_poster")
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.expired"), from: "item[twitter_auto_post]"
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ visit show_path
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_no_css("dd", text: "https://twitter.com/user_screen_id/status/twitter_id")
+ end
+ expect(capture.update.count).to eq 0
+ expect(capture.update.tweet).to eq nil
+ expect(capture.update_with_media.count).to eq 0
+ expect(capture.update_with_media.tweet).to eq nil
+ expect(Cms::SnsPostLog::Twitter.count).to eq 0
+ end
+ end
+ end
+
+ context "post message" do
+ it "#edit" do
+ capture_twitter_rest_client do |capture|
+ visit show_path
+ within "#addon-workflow-agents-addons-branch" do
+ click_on I18n.t("workflow.create_branch")
+ expect(page).to have_link item.name
+ click_on item.name
+ end
+
+ expect(page).to have_link I18n.t("ss.links.edit")
+ click_on I18n.t("ss.links.edit")
+
+ ensure_addon_opened("#addon-cms-agents-addons-twitter_poster")
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.active"), from: "item[twitter_auto_post]"
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ wait_for_cbox do
+ have_css("#alertExplanation", text: I18n.t("cms.confirm.twitter_post_enabled"))
+ click_on I18n.t("ss.buttons.ignore_alert")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ visit show_path
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("dd", text: "https://twitter.com/user_screen_id/status/twitter_id")
+ end
+ expect(capture.update.count).to eq 1
+ expect(capture.update.tweet).to include(item.name)
+ expect(capture.update.tweet).to include(item.full_url)
+ expect(capture.update_with_media.count).to eq 0
+ expect(capture.update_with_media.tweet).to eq nil
+ expect(Cms::SnsPostLog::Twitter.count).to eq 1
+ end
+ end
+
+ # master page already posted
+ it "#edit" do
+ capture_twitter_rest_client do |capture|
+ # first post
+ visit show_path
+ within "#addon-workflow-agents-addons-branch" do
+ click_on I18n.t("workflow.create_branch")
+ expect(page).to have_link item.name
+ click_on item.name
+ end
+
+ expect(page).to have_link I18n.t("ss.links.edit")
+ click_on I18n.t("ss.links.edit")
+
+ ensure_addon_opened("#addon-cms-agents-addons-twitter_poster")
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.active"), from: "item[twitter_auto_post]"
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ wait_for_cbox do
+ have_css("#alertExplanation", text: I18n.t("cms.confirm.twitter_post_enabled"))
+ click_on I18n.t("ss.buttons.ignore_alert")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ visit show_path
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("dd", text: "https://twitter.com/user_screen_id/status/twitter_id")
+ end
+ expect(capture.update.count).to eq 1
+ expect(capture.update.tweet).to include(item.name)
+ expect(capture.update.tweet).to include(item.full_url)
+ expect(capture.update_with_media.count).to eq 0
+ expect(capture.update_with_media.tweet).to eq nil
+ expect(Cms::SnsPostLog::Twitter.count).to eq 1
+
+ # second post
+ visit show_path
+ within "#addon-workflow-agents-addons-branch" do
+ click_on I18n.t("workflow.create_branch")
+ expect(page).to have_link item.name
+ click_on item.name
+ end
+
+ expect(page).to have_link I18n.t("ss.links.edit")
+ click_on I18n.t("ss.links.edit")
+
+ ensure_addon_opened("#addon-cms-agents-addons-twitter_poster")
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.active"))
+ select I18n.t("ss.options.state.active"), from: "item[twitter_auto_post]"
+ end
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ visit show_path
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("dd", text: "https://twitter.com/user_screen_id/status/twitter_id")
+ end
+ expect(capture.update.count).to eq 1
+ expect(capture.update.tweet).to include(item.name)
+ expect(capture.update.tweet).to include(item.full_url)
+ expect(capture.update_with_media.count).to eq 0
+ expect(capture.update_with_media.tweet).to eq nil
+ expect(Cms::SnsPostLog::Twitter.count).to eq 1
+ end
+ end
+ end
+ end
+end
diff --git a/spec/features/cms/sns_post/twitter/release_page_spec.rb b/spec/features/cms/sns_post/twitter/release_page_spec.rb
new file mode 100644
index 00000000000..ee7bdc6712b
--- /dev/null
+++ b/spec/features/cms/sns_post/twitter/release_page_spec.rb
@@ -0,0 +1,235 @@
+require 'spec_helper'
+
+describe "article_pages twitter post", type: :feature, dbscope: :example, js: true do
+ let(:site) { cms_site }
+ let(:node) { create :article_node_page }
+ let(:item) { create :article_page, cur_node: node, state: "closed" }
+
+ let(:user) { cms_user }
+ let!(:user1) { create(:cms_test_user, group_ids: user.group_ids, cms_role_ids: user.cms_role_ids) }
+
+ let(:show_path) { article_page_path site.id, node, item }
+ let(:edit_path) { edit_article_page_path site.id, node, item }
+
+ let(:release_date) { Time.zone.at(1.day.from_now.to_i) }
+
+ context "publish at release_date" do
+ before do
+ site.twitter_username = unique_id
+ site.twitter_consumer_key = unique_id
+ site.twitter_consumer_secret = unique_id
+ site.twitter_access_token = unique_id
+ site.twitter_access_token_secret = unique_id
+ site.save!
+
+ login_cms_user
+ end
+
+ context "post none" do
+ it "#edit" do
+ capture_twitter_rest_client do |capture|
+ visit edit_path
+ ensure_addon_opened("#addon-cms-agents-addons-twitter_poster")
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.expired"), from: "item[twitter_auto_post]"
+ end
+
+ ensure_addon_opened("#addon-cms-agents-addons-release_plan")
+ within "#addon-cms-agents-addons-release_plan" do
+ fill_in 'item[release_date]', with: release_date.strftime("%Y/%m/%d %H:%M")
+ end
+
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ within "#addon-cms-agents-addons-release" do
+ expect(page).to have_css('dd', text: I18n.t('ss.state.ready'))
+ end
+ expect(capture.update.count).to eq 0
+ expect(capture.update.tweet).to eq nil
+ expect(capture.update_with_media.count).to eq 0
+ expect(capture.update_with_media.tweet).to eq nil
+ expect(Cms::SnsPostLog::Twitter.count).to eq 0
+
+ Timecop.travel(release_date) do
+ job = Cms::Page::ReleaseJob.bind(site_id: node.site_id, node_id: node.id)
+ expect { job.perform_now }.to output.to_stdout
+
+ login_cms_user
+ visit show_path
+
+ within "#addon-cms-agents-addons-release" do
+ expect(page).to have_css('dd', text: I18n.t('ss.options.state.public'))
+ end
+ expect(capture.update.count).to eq 0
+ expect(capture.update.tweet).to eq nil
+ expect(capture.update_with_media.count).to eq 0
+ expect(capture.update_with_media.tweet).to eq nil
+ expect(Cms::SnsPostLog::Twitter.count).to eq 0
+ end
+ end
+ end
+ end
+
+ context "post message_only_carousel" do
+ it "#edit" do
+ capture_twitter_rest_client do |capture|
+ visit edit_path
+ ensure_addon_opened("#addon-cms-agents-addons-twitter_poster")
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.active"), from: "item[twitter_auto_post]"
+ end
+
+ ensure_addon_opened("#addon-cms-agents-addons-release_plan")
+ within "#addon-cms-agents-addons-release_plan" do
+ fill_in 'item[release_date]', with: release_date.strftime("%Y/%m/%d %H:%M")
+ end
+
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.publish_save")
+ end
+ wait_for_cbox do
+ have_css("#alertExplanation", text: I18n.t("cms.confirm.twitter_post_enabled"))
+ click_on I18n.t("ss.buttons.ignore_alert")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+
+ within "#addon-cms-agents-addons-release" do
+ expect(page).to have_css('dd', text: I18n.t('ss.state.ready'))
+ end
+ expect(capture.update.count).to eq 0
+ expect(capture.update.tweet).to eq nil
+ expect(capture.update_with_media.count).to eq 0
+ expect(capture.update_with_media.tweet).to eq nil
+ expect(Cms::SnsPostLog::Twitter.count).to eq 0
+
+ Timecop.travel(release_date) do
+ job = Cms::Page::ReleaseJob.bind(site_id: node.site_id, node_id: node.id)
+ expect { job.perform_now }.to output.to_stdout
+
+ login_cms_user
+ visit show_path
+
+ within "#addon-cms-agents-addons-release" do
+ expect(page).to have_css('dd', text: I18n.t('ss.options.state.public'))
+ end
+ expect(capture.update.count).to eq 1
+ expect(capture.update.tweet).to include(item.name)
+ expect(capture.update_with_media.count).to eq 0
+ expect(capture.update_with_media.tweet).to eq nil
+ expect(Cms::SnsPostLog::Twitter.count).to eq 1
+ end
+ end
+ end
+
+ # master and approve
+ it "#edit" do
+ capture_twitter_rest_client do |capture|
+ # create branch
+ login_cms_user
+ visit show_path
+ within "#addon-workflow-agents-addons-branch" do
+ click_on I18n.t("workflow.create_branch")
+ expect(page).to have_link item.name
+ click_on item.name
+ end
+ expect(page).to have_link I18n.t("ss.links.edit")
+
+ # edit
+ click_on I18n.t("ss.links.edit")
+ ensure_addon_opened("#addon-cms-agents-addons-twitter_poster")
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("select option[selected]", text: I18n.t("ss.options.state.expired"))
+ select I18n.t("ss.options.state.active"), from: "item[twitter_auto_post]"
+ end
+
+ ensure_addon_opened("#addon-cms-agents-addons-release_plan")
+ within "#addon-cms-agents-addons-release_plan" do
+ fill_in 'item[release_date]', with: release_date.strftime("%Y/%m/%d %H:%M")
+ end
+ first("#addon-cms-agents-addons-release_plan").click
+
+ within "form#item-form" do
+ click_on I18n.t("ss.buttons.draft_save")
+ end
+ expect(page).to have_css('#notice', text: I18n.t('ss.notice.saved'))
+ expect(capture.update.count).to eq 0
+ expect(capture.update.tweet).to eq nil
+ expect(capture.update_with_media.count).to eq 0
+ expect(capture.update_with_media.tweet).to eq nil
+ expect(Cms::SnsPostLog::Twitter.count).to eq 0
+
+ # send request
+ within ".mod-workflow-request" do
+ select I18n.t("mongoid.attributes.workflow/model/route.my_group"), from: "workflow_route"
+ click_on I18n.t("workflow.buttons.select")
+ click_on I18n.t("workflow.search_approvers.index")
+ end
+
+ wait_for_cbox do
+ expect(page).to have_content(user1.long_name)
+ click_on user1.long_name
+ end
+ within ".mod-workflow-request" do
+ click_on I18n.t("workflow.buttons.request")
+ end
+ expect(page).to have_css(".mod-workflow-view dd", text: I18n.t("workflow.state.request"))
+
+ # approve
+ login_user user1
+ visit show_path
+ within "#addon-workflow-agents-addons-branch" do
+ expect(page).to have_link item.name
+ click_on item.name
+ end
+
+ within ".mod-workflow-approve" do
+ expect(page).to have_css(".sns-post-confirm", text: I18n.t("cms.confirm.twitter_post_enabled"))
+ click_on I18n.t("workflow.buttons.approve")
+ end
+ within "#addon-workflow-agents-addons-approver" do
+ expect(page).to have_css("dd", text: I18n.t("ss.options.state.approve"))
+ end
+ within "#addon-cms-agents-addons-release" do
+ expect(page).to have_css("dd", text: I18n.t("ss.options.state.ready"))
+ end
+
+ visit show_path
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_no_css("dd", text: "https://twitter.com/user_screen_id/status/twitter_id")
+ end
+ expect(capture.update.count).to eq 0
+ expect(capture.update.tweet).to eq nil
+ expect(capture.update_with_media.count).to eq 0
+ expect(capture.update_with_media.tweet).to eq nil
+ expect(Cms::SnsPostLog::Twitter.count).to eq 0
+
+
+ Timecop.travel(release_date) do
+ job = Cms::Page::ReleaseJob.bind(site_id: node.site_id, node_id: node.id)
+ expect { job.perform_now }.to output.to_stdout
+
+ login_cms_user
+ visit show_path
+
+ within "#addon-cms-agents-addons-release" do
+ expect(page).to have_css('dd', text: I18n.t('ss.options.state.public'))
+ end
+ within "#addon-cms-agents-addons-twitter_poster" do
+ expect(page).to have_css("dd", text: "https://twitter.com/user_screen_id/status/twitter_id")
+ end
+ expect(capture.update.count).to eq 1
+ expect(capture.update.tweet).to include(item.name)
+ expect(capture.update_with_media.count).to eq 0
+ expect(capture.update_with_media.tweet).to eq nil
+ expect(Cms::SnsPostLog::Twitter.count).to eq 1
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/support/cms/line_poster.rb b/spec/support/cms/line_poster.rb
new file mode 100644
index 00000000000..27ccda598b3
--- /dev/null
+++ b/spec/support/cms/line_poster.rb
@@ -0,0 +1,11 @@
+def capture_line_bot_client
+ capture = OpenStruct.new
+
+ capture.broadcast = OpenStruct.new(count: 0)
+ allow_any_instance_of(Line::Bot::Client).to receive(:broadcast) do |*args|
+ capture.broadcast.count += 1
+ capture.broadcast.messages = args[1]
+ OpenStruct.new(code: "200", body: "{}")
+ end
+ yield(capture)
+end
diff --git a/spec/support/cms/twitter_poster.rb b/spec/support/cms/twitter_poster.rb
new file mode 100644
index 00000000000..dccc3980132
--- /dev/null
+++ b/spec/support/cms/twitter_poster.rb
@@ -0,0 +1,33 @@
+def capture_twitter_rest_client
+ capture = OpenStruct.new
+
+ capture.update_with_media = OpenStruct.new(count: 0)
+ allow_any_instance_of(Twitter::REST::Client).to receive(:update_with_media) do |*args|
+ capture.update_with_media.count += 1
+ capture.update_with_media.tweet = args[1]
+ capture.update_with_media.media_files = args[2]
+ OpenStruct.new(id: "twitter_id")
+ end
+
+ capture.update = OpenStruct.new(count: 0)
+ allow_any_instance_of(Twitter::REST::Client).to receive(:update) do |*args|
+ capture.update.count += 1
+ capture.update.tweet = args[1]
+ OpenStruct.new(id: "twitter_id")
+ end
+
+ capture.user = OpenStruct.new(count: 0)
+ allow_any_instance_of(Twitter::REST::Client).to receive(:user) do |*args|
+ capture.user.count += 1
+ OpenStruct.new(screen_name: "user_screen_id")
+ end
+
+ capture.destroy_status = OpenStruct.new(count: 0)
+ allow_any_instance_of(Twitter::REST::Client).to receive(:destroy_status) do |*args|
+ capture.destroy_status.count += 1
+ capture.destroy_status.post_id = args[1]
+ true
+ end
+
+ yield(capture)
+end