discourse-chat-integration/spec/requests/chat_controller_spec.rb

354 lines
9.6 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
require "rails_helper"
require_relative "../dummy_provider"
2018-06-07 20:57:43 -04:00
describe "Chat Controller", type: :request do
2018-06-07 20:57:43 -04:00
let(:topic) { Fabricate(:post).topic }
2017-07-10 16:04:37 -04:00
let(:admin) { Fabricate(:admin) }
let(:category) { Fabricate(:category) }
let(:category2) { Fabricate(:category) }
2017-07-10 16:04:37 -04:00
let(:tag) { Fabricate(:tag) }
let(:channel) { DiscourseChatIntegration::Channel.create(provider: "dummy") }
2017-07-10 16:04:37 -04:00
include_context "with dummy provider"
include_context "with validated dummy provider"
2017-07-10 16:04:37 -04:00
before { SiteSetting.chat_integration_enabled = true }
2017-07-10 16:04:37 -04:00
shared_examples "admin constraints" do |action, route|
context "when user is not signed in" do
it "should raise the right error" do
2018-01-11 22:48:00 -05:00
public_send(action, route)
expect(response.status).to eq(404)
2017-07-10 16:04:37 -04:00
end
end
context "when user is not an admin" do
it "should raise the right error" do
2017-07-10 16:04:37 -04:00
sign_in(Fabricate(:user))
2018-01-11 22:48:00 -05:00
public_send(action, route)
expect(response.status).to eq(404)
2017-07-10 16:04:37 -04:00
end
end
end
describe "listing providers" do
include_examples "admin constraints", "get", "/admin/plugins/chat-integration/providers.json"
2017-07-10 16:04:37 -04:00
context "when signed in as an admin" do
before { sign_in(admin) }
2017-07-10 16:04:37 -04:00
it "should return the right response" do
get "/admin/plugins/chat-integration/providers.json"
2017-07-10 16:04:37 -04:00
2018-06-07 20:57:43 -04:00
expect(response.status).to eq(200)
2017-07-10 16:04:37 -04:00
json = response.parsed_body
2017-07-10 16:04:37 -04:00
expect(json["providers"].size).to eq(2)
2017-07-10 16:04:37 -04:00
expect(json["providers"].find { |h| h["name"] == "dummy" }).to eq(
"name" => "dummy",
"id" => "dummy",
"channel_parameters" => [],
2017-10-10 01:09:25 -04:00
)
2017-07-10 16:04:37 -04:00
end
end
end
describe "testing channels" do
include_examples "admin constraints", "get", "/admin/plugins/chat-integration/test.json"
2017-07-10 16:04:37 -04:00
context "when signed in as an admin" do
before { sign_in(admin) }
2017-07-10 16:04:37 -04:00
it "should return the right response" do
post "/admin/plugins/chat-integration/test.json",
params: {
channel_id: channel.id,
topic_id: topic.id,
}
2017-07-10 16:04:37 -04:00
2018-06-07 20:57:43 -04:00
expect(response.status).to eq(200)
2017-07-10 16:04:37 -04:00
end
it "should fail for invalid channel" do
post "/admin/plugins/chat-integration/test.json",
params: {
channel_id: 999,
topic_id: topic.id,
}
2017-07-10 16:04:37 -04:00
2018-06-07 20:57:43 -04:00
expect(response.status).to eq(422)
2017-07-10 16:04:37 -04:00
end
end
end
describe "viewing channels" do
include_examples "admin constraints", "get", "/admin/plugins/chat-integration/channels.json"
2017-07-10 16:04:37 -04:00
context "when signed in as an admin" do
before { sign_in(admin) }
2017-07-10 16:04:37 -04:00
it "should return the right response" do
rule =
DiscourseChatIntegration::Rule.create(
channel: channel,
filter: "follow",
category_id: category.id,
tags: [tag.name],
)
2017-07-10 16:04:37 -04:00
get "/admin/plugins/chat-integration/channels.json", params: { provider: "dummy" }
2017-07-10 16:04:37 -04:00
2018-06-07 20:57:43 -04:00
expect(response.status).to eq(200)
2017-07-10 16:04:37 -04:00
channels = response.parsed_body["channels"]
2017-07-10 16:04:37 -04:00
expect(channels.count).to eq(1)
2017-07-10 16:04:37 -04:00
expect(channels.first).to eq(
"id" => channel.id,
"provider" => "dummy",
"data" => {
},
"error_key" => nil,
2018-08-20 08:17:54 -04:00
"error_info" => nil,
"rules" => [
{
"id" => rule.id,
"type" => "normal",
"group_name" => nil,
"group_id" => nil,
"filter" => "follow",
"channel_id" => channel.id,
"category_id" => category.id,
"tags" => [tag.name],
},
],
2017-07-10 16:04:37 -04:00
)
end
it "should fail for invalid provider" do
get "/admin/plugins/chat-integration/channels.json", params: { provider: "someprovider" }
2018-01-11 22:48:00 -05:00
expect(response.status).to eq(400)
end
end
end
describe "adding a channel" do
include_examples "admin constraints", "post", "/admin/plugins/chat-integration/channels.json"
context "as an admin" do
before { sign_in(admin) }
it "should be able to add a new channel" do
post "/admin/plugins/chat-integration/channels.json",
params: {
channel: {
provider: "dummy",
data: {
},
},
}
2018-06-07 20:57:43 -04:00
expect(response.status).to eq(200)
channel = DiscourseChatIntegration::Channel.all.last
expect(channel.provider).to eq("dummy")
end
it "should fail for invalid params" do
post "/admin/plugins/chat-integration/channels.json",
params: {
channel: {
provider: "dummy2",
data: {
val: "something with whitespace",
},
},
}
2018-06-07 20:57:43 -04:00
expect(response.status).to eq(422)
end
end
end
describe "updating a channel" do
let(:channel) do
DiscourseChatIntegration::Channel.create(provider: "dummy2", data: { val: "something" })
end
2017-08-01 15:53:39 -04:00
include_examples "admin constraints", "put", "/admin/plugins/chat-integration/channels/1.json"
context "as an admin" do
before { sign_in(admin) }
it "should be able update a channel" do
put "/admin/plugins/chat-integration/channels/#{channel.id}.json",
params: {
channel: {
data: {
val: "something-else",
},
},
}
2018-06-07 20:57:43 -04:00
expect(response.status).to eq(200)
channel = DiscourseChatIntegration::Channel.all.last
2017-08-01 15:53:39 -04:00
expect(channel.data).to eq("val" => "something-else")
end
it "should fail for invalid params" do
put "/admin/plugins/chat-integration/channels/#{channel.id}.json",
params: {
channel: {
data: {
val: "something with whitespace",
},
},
}
2017-07-10 16:04:37 -04:00
2018-06-07 20:57:43 -04:00
expect(response.status).to eq(422)
2017-07-10 16:04:37 -04:00
end
end
end
describe "deleting a channel" do
let(:channel) { DiscourseChatIntegration::Channel.create(provider: "dummy", data: {}) }
2017-07-10 16:04:37 -04:00
include_examples "admin constraints",
"delete",
"/admin/plugins/chat-integration/channels/1.json"
context "as an admin" do
before { sign_in(admin) }
it "should be able delete a channel" do
2021-08-26 09:52:53 -04:00
delete "/admin/plugins/chat-integration/channels/#{channel.id}.json"
2018-06-07 20:57:43 -04:00
expect(response.status).to eq(200)
expect(DiscourseChatIntegration::Channel.all.size).to eq(0)
end
2017-07-10 16:04:37 -04:00
end
end
describe "adding a rule" do
include_examples "admin constraints", "put", "/admin/plugins/chat-integration/rules.json"
2017-07-10 16:04:37 -04:00
context "as an admin" do
before { sign_in(admin) }
2017-07-10 16:04:37 -04:00
it "should be able to add a new rule" do
post "/admin/plugins/chat-integration/rules.json",
params: {
rule: {
channel_id: channel.id,
category_id: category.id,
filter: "watch",
tags: [tag.name],
},
}
2017-07-10 16:04:37 -04:00
2018-06-07 20:57:43 -04:00
expect(response.status).to eq(200)
2017-07-10 16:04:37 -04:00
rule = DiscourseChatIntegration::Rule.all.last
2017-07-10 16:04:37 -04:00
expect(rule.channel_id).to eq(channel.id)
2017-07-10 16:04:37 -04:00
expect(rule.category_id).to eq(category.id)
expect(rule.filter).to eq("watch")
2017-07-10 16:04:37 -04:00
expect(rule.tags).to eq([tag.name])
end
it "should fail for invalid params" do
post "/admin/plugins/chat-integration/rules.json",
params: {
rule: {
channel_id: channel.id,
category_id: category.id,
filter: "watch",
tags: ["somenonexistanttag"],
},
}
2017-07-10 16:04:37 -04:00
2018-06-07 20:57:43 -04:00
expect(response.status).to eq(422)
2017-07-10 16:04:37 -04:00
end
end
end
describe "updating a rule" do
let(:rule) do
DiscourseChatIntegration::Rule.create(
channel: channel,
filter: "follow",
category_id: category.id,
tags: [tag.name],
)
end
2017-07-10 16:04:37 -04:00
include_examples "admin constraints", "put", "/admin/plugins/chat-integration/rules/1.json"
2017-07-10 16:04:37 -04:00
context "as an admin" do
before { sign_in(admin) }
2017-07-10 16:04:37 -04:00
it "should be able update a rule" do
put "/admin/plugins/chat-integration/rules/#{rule.id}.json",
params: {
rule: {
channel_id: channel.id,
category_id: category2.id,
filter: rule.filter,
tags: rule.tags,
},
}
2017-07-10 16:04:37 -04:00
2018-06-07 20:57:43 -04:00
expect(response.status).to eq(200)
2017-07-10 16:04:37 -04:00
rule = DiscourseChatIntegration::Rule.all.last
expect(rule.category_id).to eq(category2.id)
2017-07-10 16:04:37 -04:00
end
it "should fail for invalid params" do
put "/admin/plugins/chat-integration/rules/#{rule.id}.json",
params: {
rule: {
channel_id: channel.id,
category_id: category.id,
filter: "watch",
tags: ["somenonexistanttag"],
},
}
2017-07-10 16:04:37 -04:00
2018-06-07 20:57:43 -04:00
expect(response.status).to eq(422)
2017-07-10 16:04:37 -04:00
end
end
end
describe "deleting a rule" do
2017-10-10 01:09:25 -04:00
let(:rule) do
DiscourseChatIntegration::Rule.create!(
2017-10-10 01:09:25 -04:00
channel_id: channel.id,
filter: "follow",
2017-10-10 01:09:25 -04:00
category_id: category.id,
tags: [tag.name],
2017-10-10 01:09:25 -04:00
)
end
2017-08-01 15:53:39 -04:00
include_examples "admin constraints", "delete", "/admin/plugins/chat-integration/rules/1.json"
2017-07-10 16:04:37 -04:00
context "as an admin" do
before { sign_in(admin) }
2017-07-10 16:04:37 -04:00
it "should be able delete a rule" do
2021-08-26 09:52:53 -04:00
delete "/admin/plugins/chat-integration/rules/#{rule.id}.json"
2017-07-10 16:04:37 -04:00
2018-06-07 20:57:43 -04:00
expect(response.status).to eq(200)
expect(DiscourseChatIntegration::Rule.all.size).to eq(0)
2017-07-10 16:04:37 -04:00
end
end
end
end