lita 3.3.1 → 4.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/.travis.yml +3 -0
- data/lib/lita.rb +45 -97
- data/lib/lita/adapter.rb +38 -17
- data/lib/lita/adapters/shell.rb +5 -3
- data/lib/lita/authorization.rb +109 -60
- data/lib/lita/builder.rb +38 -0
- data/lib/lita/callback.rb +37 -0
- data/lib/lita/cli.rb +2 -0
- data/lib/lita/config.rb +1 -18
- data/lib/lita/configurable.rb +29 -0
- data/lib/lita/configuration.rb +179 -0
- data/lib/lita/configuration_validator.rb +66 -0
- data/lib/lita/daemon.rb +4 -11
- data/lib/lita/default_configuration.rb +146 -0
- data/lib/lita/errors.rb +9 -0
- data/lib/lita/handler.rb +5 -264
- data/lib/lita/handler/chat_router.rb +130 -0
- data/lib/lita/handler/common.rb +114 -0
- data/lib/lita/handler/event_router.rb +77 -0
- data/lib/lita/handler/http_router.rb +26 -0
- data/lib/lita/handlers/authorization.rb +13 -18
- data/lib/lita/handlers/deprecation_check.rb +24 -0
- data/lib/lita/handlers/help.rb +5 -3
- data/lib/lita/handlers/info.rb +2 -2
- data/lib/lita/http_callback.rb +29 -0
- data/lib/lita/http_route.rb +41 -26
- data/lib/lita/namespace.rb +23 -0
- data/lib/lita/rack_app.rb +29 -2
- data/lib/lita/registry.rb +133 -0
- data/lib/lita/robot.rb +58 -20
- data/lib/lita/route_validator.rb +12 -4
- data/lib/lita/rspec.rb +23 -14
- data/lib/lita/rspec/handler.rb +93 -23
- data/lib/lita/rspec/matchers/chat_route_matcher.rb +48 -0
- data/lib/lita/rspec/matchers/deprecated.rb +36 -0
- data/lib/lita/rspec/matchers/event_route_matcher.rb +27 -0
- data/lib/lita/rspec/matchers/http_route_matcher.rb +18 -60
- data/lib/lita/user.rb +0 -6
- data/lib/lita/util.rb +1 -8
- data/lib/lita/version.rb +1 -1
- data/lita.gemspec +1 -0
- data/spec/lita/adapter_spec.rb +25 -7
- data/spec/lita/adapters/shell_spec.rb +24 -4
- data/spec/lita/authorization_spec.rb +57 -38
- data/spec/lita/builder_spec.rb +39 -0
- data/spec/lita/config_spec.rb +0 -24
- data/spec/lita/configuration_spec.rb +222 -0
- data/spec/lita/configuration_validator_spec.rb +112 -0
- data/spec/lita/daemon_spec.rb +2 -2
- data/spec/lita/default_configuration_spec.rb +254 -0
- data/spec/lita/handler/chat_router_spec.rb +192 -0
- data/spec/lita/handler/common_spec.rb +272 -0
- data/spec/lita/handler/event_router_spec.rb +54 -0
- data/spec/lita/handler/http_router_spec.rb +106 -0
- data/spec/lita/handler_spec.rb +20 -291
- data/spec/lita/handlers/authorization_spec.rb +9 -11
- data/spec/lita/handlers/deprecation_check_spec.rb +21 -0
- data/spec/lita/handlers/help_spec.rb +31 -9
- data/spec/lita/handlers/info_spec.rb +2 -2
- data/spec/lita/handlers/room_spec.rb +5 -3
- data/spec/lita/robot_spec.rb +30 -11
- data/spec/lita/rspec_spec.rb +71 -31
- data/spec/lita/user_spec.rb +2 -2
- data/spec/lita_spec.rb +62 -4
- data/spec/spec_helper.rb +7 -0
- data/templates/locales/en.yml +56 -4
- data/templates/plugin/gemspec.tt +1 -0
- data/templates/plugin/spec/spec_helper.tt +4 -0
- metadata +54 -8
- data/lib/lita/rspec/matchers/event_subscription_matcher.rb +0 -67
- data/lib/lita/rspec/matchers/route_matcher.rb +0 -69
- data/spec/lita/rack_app_spec.rb +0 -92
@@ -0,0 +1,48 @@
|
|
1
|
+
module Lita
|
2
|
+
module RSpec
|
3
|
+
module Matchers
|
4
|
+
# RSpec matchers for chat routes.
|
5
|
+
# @since 4.0.0
|
6
|
+
module ChatRouteMatcher
|
7
|
+
extend ::RSpec::Matchers::DSL
|
8
|
+
|
9
|
+
matcher :route do |message_body|
|
10
|
+
match do
|
11
|
+
message = Message.new(robot, message_body, source)
|
12
|
+
|
13
|
+
if defined?(@group) and @group.to_s.downcase == "admins"
|
14
|
+
robot.config.robot.admins = Array(robot.config.robot.admins) + [source.user.id]
|
15
|
+
elsif defined?(@group)
|
16
|
+
robot.auth.add_user_to_group!(source.user, @group)
|
17
|
+
end
|
18
|
+
|
19
|
+
matching_routes = described_class.routes.select do |route|
|
20
|
+
RouteValidator.new(described_class, route, message, robot).call
|
21
|
+
end
|
22
|
+
|
23
|
+
if defined?(@method_name)
|
24
|
+
matching_routes.any? { |route| route.callback.method_name == @method_name }
|
25
|
+
else
|
26
|
+
!matching_routes.empty?
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
chain :with_authorization_for do |group|
|
31
|
+
@group = group
|
32
|
+
end
|
33
|
+
|
34
|
+
chain :to do |method_name|
|
35
|
+
@method_name = method_name
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Sets an expectation that the provided message routes to a command.
|
40
|
+
# @param message_body [String] The body of the message.
|
41
|
+
# @return [void]
|
42
|
+
def route_command(message_body)
|
43
|
+
route("#{robot.mention_name} #{message_body}")
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Lita
|
2
|
+
module RSpec
|
3
|
+
module Matchers
|
4
|
+
# Lita 3 versions of the routing matchers.
|
5
|
+
# @deprecated Will be removed in Lita 5.0. Use the +is_expected+ forms instead.
|
6
|
+
class Deprecated
|
7
|
+
# @param context [RSpec::ExampleGroup] The example group where the matcher was called.
|
8
|
+
# @param new_method_name [String, Symbol] The method that should be used instead.
|
9
|
+
# @param positive [Boolean] Whether or not a positive expectation is being made.
|
10
|
+
def initialize(context, new_method_name, positive, *args)
|
11
|
+
@context = context
|
12
|
+
@new_method_name = new_method_name
|
13
|
+
@expectation_method_name = positive ? :to : :not_to
|
14
|
+
@args = args
|
15
|
+
|
16
|
+
@context.instance_exec do
|
17
|
+
allow_any_instance_of(Authorization).to receive(:user_in_group?).and_return(true)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Sets an expectation that the previously supplied message will route to the provided
|
22
|
+
# method.
|
23
|
+
# @param method_name [String, Symbol] The name of the method that should be routed to.
|
24
|
+
def to(method_name)
|
25
|
+
emn = @expectation_method_name
|
26
|
+
matcher = @context.public_send(@new_method_name, *@args)
|
27
|
+
matcher.to(method_name)
|
28
|
+
|
29
|
+
@context.instance_exec do
|
30
|
+
is_expected.public_send(emn, matcher)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Lita
|
2
|
+
module RSpec
|
3
|
+
module Matchers
|
4
|
+
# RSpec matchers for event routes.
|
5
|
+
# @since 4.0.0
|
6
|
+
module EventRouteMatcher
|
7
|
+
extend ::RSpec::Matchers::DSL
|
8
|
+
|
9
|
+
matcher :route_event do |event_name|
|
10
|
+
match do
|
11
|
+
callbacks = described_class.event_subscriptions_for(event_name)
|
12
|
+
|
13
|
+
if defined?(@method_name)
|
14
|
+
callbacks.any? { |callback| callback.method_name.equal?(@method_name) }
|
15
|
+
else
|
16
|
+
!callbacks.empty?
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
chain :to do |method_name|
|
21
|
+
@method_name = method_name
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -2,70 +2,28 @@ module Lita
|
|
2
2
|
module RSpec
|
3
3
|
# A namespace to hold all of Lita's RSpec matchers.
|
4
4
|
module Matchers
|
5
|
-
#
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
# @param route [Symbol] The name of the method that should or should not
|
22
|
-
# be triggered.
|
23
|
-
# @return [void]
|
24
|
-
def to(route)
|
25
|
-
self.expected_route = route
|
26
|
-
|
27
|
-
e = expectation
|
28
|
-
m = http_method.upcase
|
29
|
-
p = path
|
30
|
-
i = i18n_key
|
31
|
-
|
32
|
-
context.instance_eval do
|
33
|
-
called = false
|
34
|
-
allow(subject).to receive(route) { called = true }
|
35
|
-
env = Rack::MockRequest.env_for(p, method: m)
|
36
|
-
robot.app.call(env)
|
37
|
-
expect(called).to be(e), I18n.t(i, method: m, path: p, route: route)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def description_prefix
|
44
|
-
if expectation
|
45
|
-
"routes"
|
46
|
-
else
|
47
|
-
"doesn't route"
|
5
|
+
# RSpec matchers for HTTP routes.
|
6
|
+
# @since 4.0.0
|
7
|
+
module HTTPRouteMatcher
|
8
|
+
extend ::RSpec::Matchers::DSL
|
9
|
+
|
10
|
+
matcher :route_http do |http_method, path|
|
11
|
+
match do
|
12
|
+
env = Rack::MockRequest.env_for(path, method: http_method)
|
13
|
+
|
14
|
+
matching_routes = robot.app.recognize(env)
|
15
|
+
|
16
|
+
if defined?(@method_name)
|
17
|
+
matching_routes.include?(@method_name)
|
18
|
+
else
|
19
|
+
!matching_routes.empty?
|
20
|
+
end
|
48
21
|
end
|
49
|
-
end
|
50
22
|
|
51
|
-
|
52
|
-
|
53
|
-
set_description
|
54
|
-
end
|
55
|
-
|
56
|
-
def i18n_key
|
57
|
-
if expectation
|
58
|
-
"lita.rspec.http_route_failure"
|
59
|
-
else
|
60
|
-
"lita.rspec.negative_http_route_failure"
|
23
|
+
chain :to do |method_name|
|
24
|
+
@method_name = method_name
|
61
25
|
end
|
62
26
|
end
|
63
|
-
|
64
|
-
def set_description
|
65
|
-
description = "#{description_prefix} #{http_method.upcase} #{path}"
|
66
|
-
description << " to :#{expected_route}" if expected_route
|
67
|
-
::RSpec.current_example.metadata[:description] = description
|
68
|
-
end
|
69
27
|
end
|
70
28
|
end
|
71
29
|
end
|
data/lib/lita/user.rb
CHANGED
@@ -23,12 +23,6 @@ module Lita
|
|
23
23
|
user
|
24
24
|
end
|
25
25
|
|
26
|
-
# @deprecated Use {.create} instead.
|
27
|
-
def find(id, metadata = {})
|
28
|
-
Lita.logger.warn I18n.t("lita.user.find_deprecated")
|
29
|
-
create(id, metadata)
|
30
|
-
end
|
31
|
-
|
32
26
|
# Finds a user by ID.
|
33
27
|
# @param id [Integer, String] The user's unique ID.
|
34
28
|
# @return [Lita::User, nil] The user or +nil+ if no such user is known.
|
data/lib/lita/util.rb
CHANGED
@@ -1,9 +1,6 @@
|
|
1
1
|
module Lita
|
2
2
|
# Handy utilities used by other Lita classes.
|
3
3
|
module Util
|
4
|
-
# A regular expression for acronyms.
|
5
|
-
ACRONYM_REGEX = /(?=a)b/
|
6
|
-
|
7
4
|
class << self
|
8
5
|
# Returns a hash with any symbol keys converted to strings.
|
9
6
|
# @param hash [Hash] The hash to convert.
|
@@ -14,16 +11,12 @@ module Lita
|
|
14
11
|
result
|
15
12
|
end
|
16
13
|
|
17
|
-
# Transforms a camel-cased string into a snaked-cased string. Taken from
|
18
|
-
# +ActiveSupport.+
|
14
|
+
# Transforms a camel-cased string into a snaked-cased string. Taken from +ActiveSupport.+
|
19
15
|
# @param camel_cased_word [String] The word to transform.
|
20
16
|
# @return [String] The transformed word.
|
21
17
|
def underscore(camel_cased_word)
|
22
18
|
word = camel_cased_word.to_s.dup
|
23
19
|
word.gsub!("::", "/")
|
24
|
-
word.gsub!(/(?:([A-Za-z\d])|^)(#{ACRONYM_REGEX})(?=\b|[^a-z])/) do
|
25
|
-
"#{Regexp.last_match[1]}#{Regexp.last_match[1] && "_"}#{Regexp.last_match[2].downcase}"
|
26
|
-
end
|
27
20
|
word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
|
28
21
|
word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
|
29
22
|
word.tr!("-", "_")
|
data/lib/lita/version.rb
CHANGED
data/lita.gemspec
CHANGED
@@ -33,6 +33,7 @@ Gem::Specification.new do |spec|
|
|
33
33
|
spec.add_runtime_dependency "thor", ">= 0.18.1"
|
34
34
|
|
35
35
|
spec.add_development_dependency "rake"
|
36
|
+
spec.add_development_dependency "rack-test"
|
36
37
|
spec.add_development_dependency "rspec", ">= 3.0.0"
|
37
38
|
spec.add_development_dependency "simplecov"
|
38
39
|
spec.add_development_dependency "coveralls"
|
data/spec/lita/adapter_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
describe Lita::Adapter do
|
4
|
-
let(:robot) {
|
3
|
+
describe Lita::Adapter, lita: true do
|
4
|
+
let(:robot) { Lita::Robot.new(registry) }
|
5
5
|
|
6
6
|
let(:required_methods) { [:join, :part, :run, :send_messages, :set_topic, :shut_down] }
|
7
7
|
|
@@ -33,13 +33,31 @@ describe Lita::Adapter do
|
|
33
33
|
expect(Lita.logger).to receive(:fatal).with(/foo, bar, baz, blah, bleh/)
|
34
34
|
expect { subject }.to raise_error(SystemExit)
|
35
35
|
end
|
36
|
+
|
37
|
+
it "logs a deprecation warning when the adapter is initialized" do
|
38
|
+
expect(Lita.logger).to receive(:warn).with(/Use Lita::Adapter\.config instead/)
|
39
|
+
|
40
|
+
expect { adapter_class.new(robot) }.to raise_error(SystemExit)
|
41
|
+
end
|
36
42
|
end
|
37
43
|
|
38
|
-
describe "
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
44
|
+
describe "#config" do
|
45
|
+
let(:adapter) do
|
46
|
+
Class.new(described_class) do
|
47
|
+
namespace "test"
|
48
|
+
|
49
|
+
config :foo, default: :bar
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
let(:robot) { Lita::Robot.new(registry) }
|
54
|
+
|
55
|
+
before { registry.register_adapter(:test, adapter) }
|
56
|
+
|
57
|
+
subject { adapter.new(robot) }
|
58
|
+
|
59
|
+
it "provides access to the adapter's configuration object" do
|
60
|
+
expect(subject.config.foo).to eq(:bar)
|
43
61
|
end
|
44
62
|
end
|
45
63
|
|
@@ -1,12 +1,21 @@
|
|
1
|
-
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Lita::Adapters::Shell, lita: true do
|
2
4
|
let(:robot) do
|
3
|
-
instance_double(
|
5
|
+
instance_double(
|
6
|
+
"Lita::Robot",
|
7
|
+
name: "Lita",
|
8
|
+
mention_name: "LitaBot",
|
9
|
+
alias: "/",
|
10
|
+
config: registry.config
|
11
|
+
)
|
4
12
|
end
|
5
13
|
|
6
14
|
subject { described_class.new(robot) }
|
7
15
|
|
8
16
|
describe "#run" do
|
9
17
|
before do
|
18
|
+
registry.register_adapter(:shell, described_class)
|
10
19
|
allow(subject).to receive(:puts)
|
11
20
|
allow(Readline).to receive(:readline).and_return("foo", "exit")
|
12
21
|
allow(robot).to receive(:trigger)
|
@@ -19,8 +28,8 @@ describe Lita::Adapters::Shell do
|
|
19
28
|
subject.run
|
20
29
|
end
|
21
30
|
|
22
|
-
it "marks messages as commands if config.
|
23
|
-
|
31
|
+
it "marks messages as commands if config.adapters.shell.private_chat is true" do
|
32
|
+
registry.config.adapters.shell.private_chat = true
|
24
33
|
expect_any_instance_of(Lita::Message).to receive(:command!)
|
25
34
|
subject.run
|
26
35
|
end
|
@@ -29,6 +38,17 @@ describe Lita::Adapters::Shell do
|
|
29
38
|
expect(robot).to receive(:trigger).with(:connected)
|
30
39
|
subject.run
|
31
40
|
end
|
41
|
+
|
42
|
+
it "exits cleanly when EOF is received" do
|
43
|
+
allow(Readline).to receive(:readline).and_return(nil)
|
44
|
+
subject.run
|
45
|
+
end
|
46
|
+
|
47
|
+
it "removes empty input from readline history" do
|
48
|
+
allow(Readline).to receive(:readline).and_return("", "exit")
|
49
|
+
expect(Readline::HISTORY).to receive(:pop)
|
50
|
+
subject.run
|
51
|
+
end
|
32
52
|
end
|
33
53
|
|
34
54
|
describe "#send_message" do
|
@@ -4,112 +4,131 @@ describe Lita::Authorization, lita: true do
|
|
4
4
|
let(:requesting_user) { instance_double("Lita::User", id: "1") }
|
5
5
|
let(:user) { instance_double("Lita::User", id: "2") }
|
6
6
|
|
7
|
+
subject { described_class.new(registry.config) }
|
8
|
+
|
7
9
|
before do
|
8
|
-
|
10
|
+
registry.config.robot.admins = ["1"]
|
9
11
|
end
|
10
12
|
|
11
|
-
describe "
|
13
|
+
describe "deprecated class methods" do
|
14
|
+
{
|
15
|
+
add_user_to_group: 3,
|
16
|
+
remove_user_from_group: 3,
|
17
|
+
user_in_group?: 2,
|
18
|
+
user_is_admin?: 1,
|
19
|
+
groups: 0,
|
20
|
+
groups_with_users: 0
|
21
|
+
}.each do |deprecated_method, arity|
|
22
|
+
it "logs a warning and calls the instance method version of .#{deprecated_method}" do
|
23
|
+
expect(Lita.logger).to receive(:warn).with(
|
24
|
+
/Lita::Authorization\.#{Regexp.escape(deprecated_method)} will be removed in Lita 5\.0/
|
25
|
+
)
|
26
|
+
expect_any_instance_of(described_class).to receive(deprecated_method)
|
27
|
+
described_class.public_send(deprecated_method, *arity.times.map { Object.new })
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#add_user_to_group" do
|
12
33
|
it "adds users to an auth group" do
|
13
|
-
|
14
|
-
expect(
|
34
|
+
subject.add_user_to_group(requesting_user, user, "employees")
|
35
|
+
expect(subject.user_in_group?(user, "employees")).to be true
|
15
36
|
end
|
16
37
|
|
17
38
|
it "can only be called by admins" do
|
18
|
-
|
19
|
-
result =
|
39
|
+
registry.config.robot.admins = nil
|
40
|
+
result = subject.add_user_to_group(
|
20
41
|
requesting_user,
|
21
42
|
user,
|
22
43
|
"employees"
|
23
44
|
)
|
24
45
|
expect(result).to eq(:unauthorized)
|
25
|
-
expect(
|
46
|
+
expect(subject.user_in_group?(user, "employees")).to be false
|
26
47
|
end
|
27
48
|
|
28
49
|
it "normalizes the group name" do
|
29
|
-
|
30
|
-
expect(
|
50
|
+
subject.add_user_to_group(requesting_user, user, "eMPLoYeeS")
|
51
|
+
expect(subject.user_in_group?(user, " EmplOyEEs ")).to be true
|
31
52
|
end
|
32
53
|
end
|
33
54
|
|
34
|
-
describe "
|
55
|
+
describe "#remove_user_from_group" do
|
35
56
|
it "removes users from an auth group" do
|
36
|
-
|
37
|
-
|
38
|
-
expect(
|
57
|
+
subject.add_user_to_group(requesting_user, user, "employees")
|
58
|
+
subject.remove_user_from_group(requesting_user, user, "employees")
|
59
|
+
expect(subject.user_in_group?(user, "employees")).to be false
|
39
60
|
end
|
40
61
|
|
41
62
|
it "can only be called by admins" do
|
42
|
-
|
43
|
-
|
44
|
-
result =
|
63
|
+
subject.add_user_to_group(requesting_user, user, "employees")
|
64
|
+
registry.config.robot.admins = nil
|
65
|
+
result = subject.remove_user_from_group(
|
45
66
|
requesting_user,
|
46
67
|
user,
|
47
68
|
"employees"
|
48
69
|
)
|
49
70
|
expect(result).to eq(:unauthorized)
|
50
|
-
expect(
|
71
|
+
expect(subject.user_in_group?(user, "employees")).to be true
|
51
72
|
end
|
52
73
|
|
53
74
|
it "normalizes the group name" do
|
54
|
-
|
55
|
-
|
56
|
-
expect(
|
75
|
+
subject.add_user_to_group(requesting_user, user, "eMPLoYeeS")
|
76
|
+
subject.remove_user_from_group(requesting_user, user, "EmployeeS")
|
77
|
+
expect(subject.user_in_group?(user, " EmplOyEEs ")).to be false
|
57
78
|
end
|
58
79
|
end
|
59
80
|
|
60
|
-
describe "
|
81
|
+
describe "#user_in_group?" do
|
61
82
|
it "returns false if the user is in the group" do
|
62
|
-
expect(
|
83
|
+
expect(subject.user_in_group?(user, "employees")).to be false
|
63
84
|
end
|
64
85
|
|
65
86
|
it "delegates to .user_is_admin? if the group is admins" do
|
66
|
-
expect(
|
67
|
-
|
87
|
+
expect(subject).to receive(:user_is_admin?)
|
88
|
+
subject.user_in_group?(user, "admins")
|
68
89
|
end
|
69
90
|
end
|
70
91
|
|
71
|
-
describe "
|
92
|
+
describe "#user_is_admin?" do
|
72
93
|
it "returns true if the user's ID is in the config" do
|
73
|
-
expect(
|
94
|
+
expect(subject.user_is_admin?(requesting_user)).to be true
|
74
95
|
end
|
75
96
|
|
76
97
|
it "returns false if the user's ID is not in the config" do
|
77
|
-
|
78
|
-
expect(
|
98
|
+
registry.config.robot.admins = nil
|
99
|
+
expect(subject.user_is_admin?(user)).to be false
|
79
100
|
end
|
80
101
|
end
|
81
102
|
|
82
|
-
describe "
|
103
|
+
describe "#groups" do
|
83
104
|
before do
|
84
105
|
%i(foo bar baz).each do |group|
|
85
|
-
|
106
|
+
subject.add_user_to_group(requesting_user, user, group)
|
86
107
|
end
|
87
108
|
end
|
88
109
|
|
89
110
|
it "returns a list of all authorization groups" do
|
90
|
-
expect(
|
111
|
+
expect(subject.groups).to match_array(%i(foo bar baz))
|
91
112
|
end
|
92
113
|
end
|
93
114
|
|
94
|
-
describe "
|
115
|
+
describe "#groups_with_users" do
|
95
116
|
before do
|
96
117
|
%i(foo bar baz).each do |group|
|
97
|
-
|
98
|
-
|
118
|
+
subject.add_user_to_group(requesting_user, user, group)
|
119
|
+
subject.add_user_to_group(
|
99
120
|
requesting_user,
|
100
121
|
requesting_user,
|
101
122
|
group
|
102
123
|
)
|
103
124
|
end
|
104
|
-
allow(Lita::User).to receive(:find_by_id).with("1").and_return(
|
105
|
-
requesting_user
|
106
|
-
)
|
125
|
+
allow(Lita::User).to receive(:find_by_id).with("1").and_return(requesting_user)
|
107
126
|
allow(Lita::User).to receive(:find_by_id).with("2").and_return(user)
|
108
127
|
end
|
109
128
|
|
110
129
|
it "returns a hash of all authorization groups and their members" do
|
111
130
|
groups = %i(foo bar baz)
|
112
|
-
groups_with_users =
|
131
|
+
groups_with_users = subject.groups_with_users
|
113
132
|
expect(groups_with_users.keys).to match_array(groups)
|
114
133
|
groups.each do |group|
|
115
134
|
expect(groups_with_users[group]).to match_array([user, requesting_user])
|