diff --git a/lib/channel.rb b/lib/channel.rb new file mode 100644 index 00000000..ceba810d --- /dev/null +++ b/lib/channel.rb @@ -0,0 +1,43 @@ +require 'httparty' +require_relative 'recipient' +require 'table_print' + +class Channel < Recipient + attr_reader :topic, :member_count + + def initialize(slack_id, name, topic, member_count) + super(slack_id, name) + @topic = topic + @member_count = member_count + end + + def self.get + response = super.find { |response| response["channels"] } + channels = [] + response["channels"].each do |channel| + + name = channel["name"] + slack_id = channel["id"] + topic = channel["topic"]["value"] + member_count = channel["num_members"] + + channels << self.new(slack_id, name, topic, member_count) + + end + + return channels + + end + + def details + return "Channel name: #{name} + Slack_ID: #{slack_id} + Topic: #{topic} + Member Count: #{member_count}" + end + + def self.list + tp self.get, :name, :slack_id, :topic, :member_count + end + +end \ No newline at end of file diff --git a/lib/recipient.rb b/lib/recipient.rb new file mode 100644 index 00000000..ae11b149 --- /dev/null +++ b/lib/recipient.rb @@ -0,0 +1,63 @@ +require 'httparty' +require 'dotenv' + +Dotenv.load + +class SlackAPIError < StandardError; end + +class Recipient + + attr_reader :slack_id, :name + + BASE_URL = "https://slack.com/api/" + KEY = ENV['SLACK_API_TOKEN'] + + + def initialize(slack_id, name) + @slack_id = slack_id + @name = name + end + + def send_message(message, channel) + response = HTTParty.post( + BASE_URL + "chat.postMessage", + + body: { + token: KEY, + text: message, + channel: channel, + as_user: true + }, + headers: { 'Content-Type' => 'application/x-www-form-urlencoded' } + ) + if response["ok"] == true + return true + end + return false if SlackAPIError + end + + + def self.get + query_param = { + token: KEY + } + users = HTTParty.get(BASE_URL + "users.list", query: query_param) + channels = HTTParty.get(BASE_URL + "conversations.list", query: query_param) + response = [users, channels] + + if response[0]["ok"] == true + return response + else + raise SlackAPIError + end + end + + def details + raise NotImplementedError + end + + def self.list + raise NotImplementedError + end + +end \ No newline at end of file diff --git a/lib/slack.rb b/lib/slack.rb index 960cf2f7..0406391c 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -1,10 +1,60 @@ #!/usr/bin/env ruby +require 'dotenv' +require 'httparty' +require 'awesome_print' +require_relative 'workspace' +require 'table_print' + +Dotenv.load def main + puts "Welcome to the Ada Slack CLI!" - - # TODO project - + + workspace = Workspace.new + puts "There are #{workspace.channels.length} channels" + puts "There are #{workspace.users.length} users" + + while true + options = ["list channels", "list users", "select channel", "select user", "show details", "send message", "quit"] + puts "\nWhat would you like to do? Your options are: \n list channels\n list users\n select channel\n select user\n show details\n send message\n quit" + + + selection = gets.chomp + until options.include?(selection.downcase) + puts "I'm sorry, please choose an option or quit" + selection = gets.chomp + end + + case selection + + when "quit" + break + when "list channels" + Channel.list + when "list users" + User.list + when "select channel" + Channel.list + print "What channel would you like to select: " + input = gets.chomp + puts workspace.select_channel(input) + when "select user" + User.list + print "What user would you like to select: " + input = gets.chomp + puts workspace.select_user(input) + when "show details" + puts workspace.show_details + when 'send message' + if workspace.send_message == false + puts "your message did not send" + else + puts "Your message was successfully sent" + end + end + end + puts "Thank you for using the Ada Slack CLI" end diff --git a/lib/slackapierror.rb b/lib/slackapierror.rb new file mode 100644 index 00000000..8b76d389 --- /dev/null +++ b/lib/slackapierror.rb @@ -0,0 +1,5 @@ +class SlackApiError < Exception + + + +end \ No newline at end of file diff --git a/lib/user.rb b/lib/user.rb new file mode 100644 index 00000000..dd92a6ff --- /dev/null +++ b/lib/user.rb @@ -0,0 +1,47 @@ +require 'httparty' +require_relative 'recipient' + +class User < Recipient + attr_reader :real_name, :status_text, :status_emoji + + def initialize(slack_id, name, real_name, status_text, status_emoji) + + super(slack_id, name) + @real_name = real_name + @status_text = status_text + @status_emoji = status_emoji + + + end + + def self.get + response = super.find { |response| response["members"] } + users = [] + response["members"].each do |member| + + name = member["name"] + slack_id = member["id"] + real_name = member["real_name"] + status_text = member["status_text"] + status_emoji = member["status_emoji"] + + users << self.new(slack_id, name, real_name, status_text, status_emoji) + + end + return users + + end + + def details + return "User name: #{name} + Slack_ID: #{slack_id} + Real Name: #{real_name} + Status Text: #{status_text} + Status Emoji: #{status_emoji}" + end + + def self.list + tp self.get, :name, :real_name, :slack_id + end + +end \ No newline at end of file diff --git a/lib/workspace.rb b/lib/workspace.rb new file mode 100644 index 00000000..bbe1b4b6 --- /dev/null +++ b/lib/workspace.rb @@ -0,0 +1,60 @@ +require_relative 'user' +require_relative 'channel' + +class Workspace + + attr_reader :users, :channels + attr_accessor :selected + + def initialize + @users = User.get + @channels = Channel.get + @selected = nil + + end + + def select_channel(name_or_id) + channel = channels.find {|channel| channel.slack_id == name_or_id} + if channel == nil + channel = channels.find {|channel| channel.name == name_or_id} + end + if channel == nil + return "Channel does not exist" + end + @selected = channel + return "The channel was selected" + end + + def select_user(name_or_id) + user = users.find {|user| user.slack_id == name_or_id} + if user == nil + user = users.find {|user| user.name == name_or_id} + end + if user == nil + return "User does not exist" + end + @selected = user + return "The user was selected" + end + + def show_details + if @selected == nil + return "Please select a user or channel." + end + return @selected.details + end + + def send_message(message: nil) + if @selected == nil + puts "You must select a user or channel first" + return false + end + channel = @selected.slack_id + if message == nil + puts "Please type your message here:" + message = gets.chomp + end + @selected.send_message(message, channel) + + end +end \ No newline at end of file diff --git a/test/cassettes/api_request.yml b/test/cassettes/api_request.yml new file mode 100644 index 00000000..f3944c00 --- /dev/null +++ b/test/cassettes/api_request.yml @@ -0,0 +1,70 @@ +--- +http_interactions: +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&text=Hi&channel=dsdfsd&as_user=true + headers: + Content-Type: + - application/x-www-form-urlencoded + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Date: + - Fri, 13 Sep 2019 19:34:23 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - fa9b2eef-891b-47b7-bd44-f87c1ad34dc4 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:user,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write:user + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-z42f + X-Cache: + - Miss from cloudfront + Via: + - 1.1 3cd7af07832481c336aa1c93c9b4a6fe.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C2 + X-Amz-Cf-Id: + - Jh9x1dfGlnAvv959aPw0HsgtQyiU3KnhqTHr7IGrOmdsFcbwQQbxSQ== + body: + encoding: UTF-8 + string: '{"ok":false,"error":"channel_not_found"}' + http_version: + recorded_at: Fri, 13 Sep 2019 19:34:24 GMT +recorded_with: VCR 5.0.0 diff --git a/test/cassettes/create_workspace.yml b/test/cassettes/create_workspace.yml new file mode 100644 index 00000000..4ec41860 --- /dev/null +++ b/test/cassettes/create_workspace.yml @@ -0,0 +1,507 @@ +--- +http_interactions: +- request: + method: get + uri: https://slack.com/api/users.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '889' + Connection: + - keep-alive + Date: + - Wed, 11 Sep 2019 22:02:11 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 9b6d2cb2-b8b3-4fa9-a2ae-7fedd00c5633 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - users:read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-ta4v + X-Cache: + - Miss from cloudfront + Via: + - 1.1 fa751ee53e2bf18781ae98b293ff9375.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19 + X-Amz-Cf-Id: + - MvwXC9hEyRcyimLuhjOkdevvrzDsxQjViwpV62fZlDBFpY7NVGCwRg== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TMZSSV3BK","name":"slackbot","deleted":false,"color":"757575","real_name":"Slackbot","tz":null,"tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Slackbot","real_name_normalized":"Slackbot","display_name":"Slackbot","display_name_normalized":"Slackbot","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"sv41d8cd98f0","always_active":true,"first_name":"slackbot","last_name":"","image_24":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_24.png","image_32":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_32.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_72.png","image_192":"https:\/\/a.slack-edge.com\/80588\/marketing\/img\/avatars\/slackbot\/avatar-slackbot.png","image_512":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":0},{"id":"UMUR2C1QB","team_id":"TMZSSV3BK","name":"kemp.bri","deleted":false,"color":"4bbe2e","real_name":"Brianna","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Brianna","real_name_normalized":"Brianna","display_name":"Brianna","display_name_normalized":"Brianna","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g8b19f49d1fe","image_24":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1568071208,"has_2fa":false},{"id":"UN5R1N5A8","team_id":"TMZSSV3BK","name":"kristy.hisaw","deleted":false,"color":"9f69e7","real_name":"kristy.hisaw","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"kristy.hisaw","real_name_normalized":"kristy.hisaw","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g50943abd90a","image_24":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":true,"is_owner":true,"is_primary_owner":true,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1568071144}],"cache_ts":1568239331,"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Wed, 11 Sep 2019 22:02:11 GMT +- request: + method: get + uri: https://slack.com/api/conversations.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '608' + Connection: + - keep-alive + Date: + - Wed, 11 Sep 2019 22:02:11 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - f77808be-dd77-470d-8c26-c4f2e12f244b + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - channels:read,groups:read,mpim:read,im:read,read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-abbx + X-Cache: + - Miss from cloudfront + Via: + - 1.1 3403c96e1b1db500ff6526f1a7bc6813.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19 + X-Amz-Cf-Id: + - V4OgtqWJEL7rZ-KQllIJfuu_B-1BaojmLzFd0htV8YqKKLwIuT5GSw== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CMTFYSFTL","name":"general","is_channel":true,"is_group":false,"is_im":false,"created":1568071144,"is_archived":false,"is_general":true,"unlinked":0,"name_normalized":"general","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UN5R1N5A8","last_set":1568071144},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UN5R1N5A8","last_set":1568071144},"previous_names":[],"num_members":2},{"id":"CN69H4HK7","name":"random","is_channel":true,"is_group":false,"is_im":false,"created":1568071144,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"random","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UN5R1N5A8","last_set":1568071144},"purpose":{"value":"A + place for non-work-related flimflam, faffing, hodge-podge or jibber-jabber + you''d prefer to keep out of more focused work-related channels.","creator":"UN5R1N5A8","last_set":1568071144},"previous_names":[],"num_members":2},{"id":"CN8FM00MU","name":"slack-api","is_channel":true,"is_group":false,"is_im":false,"created":1568071145,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"slack-api","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Wed, 11 Sep 2019 22:02:11 GMT +- request: + method: get + uri: https://slack.com/api/users.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '888' + Connection: + - keep-alive + Date: + - Thu, 12 Sep 2019 21:07:29 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - ea3d6ccf-7202-4573-9368-1a526d863412 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - users:read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-dqjh + X-Cache: + - Miss from cloudfront + Via: + - 1.1 bbc0c6d660c6b9bfbf22053687e12fba.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19 + X-Amz-Cf-Id: + - l8pT1QRMCTmZSpmRMTc11Nf2zVP8kPKAgA53nk-7IO2YUXJmC1hECg== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TMZSSV3BK","name":"slackbot","deleted":false,"color":"757575","real_name":"Slackbot","tz":null,"tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Slackbot","real_name_normalized":"Slackbot","display_name":"Slackbot","display_name_normalized":"Slackbot","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"sv41d8cd98f0","always_active":true,"first_name":"slackbot","last_name":"","image_24":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_24.png","image_32":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_32.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_72.png","image_192":"https:\/\/a.slack-edge.com\/80588\/marketing\/img\/avatars\/slackbot\/avatar-slackbot.png","image_512":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":0},{"id":"UMUR2C1QB","team_id":"TMZSSV3BK","name":"kemp.bri","deleted":false,"color":"4bbe2e","real_name":"Brianna","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Brianna","real_name_normalized":"Brianna","display_name":"Brianna","display_name_normalized":"Brianna","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g8b19f49d1fe","image_24":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1568071208,"has_2fa":false},{"id":"UN5R1N5A8","team_id":"TMZSSV3BK","name":"kristy.hisaw","deleted":false,"color":"9f69e7","real_name":"kristy.hisaw","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"kristy.hisaw","real_name_normalized":"kristy.hisaw","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g50943abd90a","image_24":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":true,"is_owner":true,"is_primary_owner":true,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1568071144,"has_2fa":false}],"cache_ts":1568322449,"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Thu, 12 Sep 2019 21:07:28 GMT +- request: + method: get + uri: https://slack.com/api/conversations.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '608' + Connection: + - keep-alive + Date: + - Thu, 12 Sep 2019 21:07:29 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - abfc74fc-867a-417d-af47-c783e8a38106 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - channels:read,groups:read,mpim:read,im:read,read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-wycu + X-Cache: + - Miss from cloudfront + Via: + - 1.1 fa751ee53e2bf18781ae98b293ff9375.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19 + X-Amz-Cf-Id: + - 6leL7b0KgmFTinpQd14sqdver6uqaHZYwJ9eA2UIoYqxNc_15gAQwQ== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CMTFYSFTL","name":"general","is_channel":true,"is_group":false,"is_im":false,"created":1568071144,"is_archived":false,"is_general":true,"unlinked":0,"name_normalized":"general","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UN5R1N5A8","last_set":1568071144},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UN5R1N5A8","last_set":1568071144},"previous_names":[],"num_members":2},{"id":"CN69H4HK7","name":"random","is_channel":true,"is_group":false,"is_im":false,"created":1568071144,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"random","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UN5R1N5A8","last_set":1568071144},"purpose":{"value":"A + place for non-work-related flimflam, faffing, hodge-podge or jibber-jabber + you''d prefer to keep out of more focused work-related channels.","creator":"UN5R1N5A8","last_set":1568071144},"previous_names":[],"num_members":2},{"id":"CN8FM00MU","name":"slack-api","is_channel":true,"is_group":false,"is_im":false,"created":1568071145,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"slack-api","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Thu, 12 Sep 2019 21:07:28 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&text=%1Bgdfsdgf&channel=UMUR2C1QB&as_user=true + headers: + Content-Type: + - application/x-www-form-urlencoded + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Date: + - Fri, 13 Sep 2019 19:11:52 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 9bc57ba7-47f0-4f01-8076-65f07966ed4e + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:user,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write:user + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-v0x2 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 6faf668782fbb3c2aa466f6fccc76047.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - HIO51-C1 + X-Amz-Cf-Id: + - HIM5niU06g0w9Bt7QxG9GhSNd6VrX_0YvXY0JP7OUsgYr7wfact7qw== + body: + encoding: UTF-8 + string: '{"ok":true,"channel":"DN5R20QHJ","ts":"1568401912.000200","message":{"bot_id":"BN9NP8FL6","type":"message","text":"gdfsdgf","user":"UMUR2C1QB","ts":"1568401912.000200","team":"TMZSSV3BK"}}' + http_version: + recorded_at: Fri, 13 Sep 2019 19:11:52 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&text=Test%20message&channel=UMUR2C1QB&as_user=true + headers: + Content-Type: + - application/x-www-form-urlencoded + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Date: + - Fri, 13 Sep 2019 19:13:29 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 3e9df283-5b11-450c-bd0e-d852432eadb7 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:user,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write:user + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-61a2 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 1399f6d923ba00ad00816f6a9e531b7c.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - HIO51-C1 + X-Amz-Cf-Id: + - uTZoxD993t5h_BxfutOw4--U9j66_VBCb-cXQyWAflY-SSzMyhComQ== + body: + encoding: UTF-8 + string: '{"ok":true,"channel":"DN5R20QHJ","ts":"1568402009.000300","message":{"bot_id":"BN9NP8FL6","type":"message","text":"Test + message","user":"UMUR2C1QB","ts":"1568402009.000300","team":"TMZSSV3BK"}}' + http_version: + recorded_at: Fri, 13 Sep 2019 19:13:29 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&text=Test%20message&channel=id&as_user=true + headers: + Content-Type: + - application/x-www-form-urlencoded + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Date: + - Fri, 13 Sep 2019 19:44:35 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 24ef583e-9010-46f7-8f52-3dbd5d41d57d + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:user,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write:user + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-d7ix + X-Cache: + - Miss from cloudfront + Via: + - 1.1 be082a2326b7d49643607b097f1e7181.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C2 + X-Amz-Cf-Id: + - GKZF0sLd8sTL3sLuUK4vrXisRCwMIHjodAkBAfMuza0Op3WWyMvW0A== + body: + encoding: UTF-8 + string: '{"ok":false,"error":"channel_not_found"}' + http_version: + recorded_at: Fri, 13 Sep 2019 19:44:35 GMT +recorded_with: VCR 5.0.0 diff --git a/test/cassettes/load_channels.yml b/test/cassettes/load_channels.yml new file mode 100644 index 00000000..df575aa7 --- /dev/null +++ b/test/cassettes/load_channels.yml @@ -0,0 +1,154 @@ +--- +http_interactions: +- request: + method: get + uri: https://slack.com/api/conversations.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '608' + Connection: + - keep-alive + Date: + - Tue, 10 Sep 2019 23:22:45 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - f23f1705-15a9-464d-ab7d-0975f9564cd5 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - channels:read,groups:read,mpim:read,im:read,read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-u2yx + X-Cache: + - Miss from cloudfront + Via: + - 1.1 0cf6c59c77f0fff670ae085179adc459.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - VR2k3htlgktE1qRl4uv4MCH_ziMWLE93vNWjNS-lSnI4iWFCALFrgA== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CMTFYSFTL","name":"general","is_channel":true,"is_group":false,"is_im":false,"created":1568071144,"is_archived":false,"is_general":true,"unlinked":0,"name_normalized":"general","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UN5R1N5A8","last_set":1568071144},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UN5R1N5A8","last_set":1568071144},"previous_names":[],"num_members":2},{"id":"CN69H4HK7","name":"random","is_channel":true,"is_group":false,"is_im":false,"created":1568071144,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"random","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UN5R1N5A8","last_set":1568071144},"purpose":{"value":"A + place for non-work-related flimflam, faffing, hodge-podge or jibber-jabber + you''d prefer to keep out of more focused work-related channels.","creator":"UN5R1N5A8","last_set":1568071144},"previous_names":[],"num_members":2},{"id":"CN8FM00MU","name":"slack-api","is_channel":true,"is_group":false,"is_im":false,"created":1568071145,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"slack-api","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Tue, 10 Sep 2019 23:22:45 GMT +- request: + method: get + uri: https://slack.com/api/users.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '888' + Connection: + - keep-alive + Date: + - Thu, 12 Sep 2019 21:07:40 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - fdb20891-52f3-4460-9443-5f21f35146b5 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - users:read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-te4j + X-Cache: + - Miss from cloudfront + Via: + - 1.1 4c4ed81695980f3c6829b9fd229bd0f8.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19 + X-Amz-Cf-Id: + - C4Aa3UM_ClhdA0WSNirLjelzaqnjzEGfoV3jQugumP_6lmDxKkLaxw== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TMZSSV3BK","name":"slackbot","deleted":false,"color":"757575","real_name":"Slackbot","tz":null,"tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Slackbot","real_name_normalized":"Slackbot","display_name":"Slackbot","display_name_normalized":"Slackbot","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"sv41d8cd98f0","always_active":true,"first_name":"slackbot","last_name":"","image_24":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_24.png","image_32":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_32.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_72.png","image_192":"https:\/\/a.slack-edge.com\/80588\/marketing\/img\/avatars\/slackbot\/avatar-slackbot.png","image_512":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":0},{"id":"UMUR2C1QB","team_id":"TMZSSV3BK","name":"kemp.bri","deleted":false,"color":"4bbe2e","real_name":"Brianna","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Brianna","real_name_normalized":"Brianna","display_name":"Brianna","display_name_normalized":"Brianna","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g8b19f49d1fe","image_24":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1568071208,"has_2fa":false},{"id":"UN5R1N5A8","team_id":"TMZSSV3BK","name":"kristy.hisaw","deleted":false,"color":"9f69e7","real_name":"kristy.hisaw","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"kristy.hisaw","real_name_normalized":"kristy.hisaw","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g50943abd90a","image_24":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":true,"is_owner":true,"is_primary_owner":true,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1568071144,"has_2fa":false}],"cache_ts":1568322460,"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Thu, 12 Sep 2019 21:07:39 GMT +recorded_with: VCR 5.0.0 diff --git a/test/cassettes/load_users.yml b/test/cassettes/load_users.yml new file mode 100644 index 00000000..2c01b429 --- /dev/null +++ b/test/cassettes/load_users.yml @@ -0,0 +1,217 @@ +--- +http_interactions: +- request: + method: get + uri: https://slack.com/api/users.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '53' + Connection: + - keep-alive + Date: + - Tue, 10 Sep 2019 22:40:44 GMT + Server: + - Apache + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + X-Accepted-Oauth-Scopes: + - users:read + Vary: + - Accept-Encoding + X-Slack-Req-Id: + - 8b9026a5-5537-4d55-a247-b8e1f07feeea + X-Xss-Protection: + - '0' + X-Content-Type-Options: + - nosniff + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-6ukn + X-Cache: + - Miss from cloudfront + Via: + - 1.1 b48dedcc55e63f14261aa92cf2d61522.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - bKf5EzeLCeOmGMbJv56x-7XdCR7vcq_RNy7HVT5NmTUNt2qWD_TNLg== + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"not_authed"}' + http_version: + recorded_at: Tue, 10 Sep 2019 22:40:44 GMT +- request: + method: get + uri: https://slack.com/api/users.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '890' + Connection: + - keep-alive + Date: + - Tue, 10 Sep 2019 22:48:26 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 3e418da3-3b30-49bc-b6c6-7f71dae70318 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - users:read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-1zz5 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 e9f9d4725d6328edca783d6dff756da8.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - PQ03_ZElu0k8IL5h8lRexqmCYNK-1M5Nw4da8K0zK35xnxegJYLnkA== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TMZSSV3BK","name":"slackbot","deleted":false,"color":"757575","real_name":"Slackbot","tz":null,"tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Slackbot","real_name_normalized":"Slackbot","display_name":"Slackbot","display_name_normalized":"Slackbot","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"sv41d8cd98f0","always_active":true,"first_name":"slackbot","last_name":"","image_24":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_24.png","image_32":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_32.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_72.png","image_192":"https:\/\/a.slack-edge.com\/80588\/marketing\/img\/avatars\/slackbot\/avatar-slackbot.png","image_512":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":0},{"id":"UMUR2C1QB","team_id":"TMZSSV3BK","name":"kemp.bri","deleted":false,"color":"4bbe2e","real_name":"Brianna","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Brianna","real_name_normalized":"Brianna","display_name":"Brianna","display_name_normalized":"Brianna","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g8b19f49d1fe","image_24":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/8b19f49d1fe7ef78d5a7701d616f2c8b.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1568071208,"has_2fa":false},{"id":"UN5R1N5A8","team_id":"TMZSSV3BK","name":"kristy.hisaw","deleted":false,"color":"9f69e7","real_name":"kristy.hisaw","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"kristy.hisaw","real_name_normalized":"kristy.hisaw","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g50943abd90a","image_24":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/50943abd90aaff8b9f7e7c624654d33b.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-512.png","status_text_canonical":"","team":"TMZSSV3BK"},"is_admin":true,"is_owner":true,"is_primary_owner":true,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1568071144}],"cache_ts":1568155706,"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Tue, 10 Sep 2019 22:48:26 GMT +- request: + method: get + uri: https://slack.com/api/conversations.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '608' + Connection: + - keep-alive + Date: + - Tue, 10 Sep 2019 23:18:35 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 93d66039-dcad-4e9e-97d4-afbcf1f31c04 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - channels:read,groups:read,mpim:read,im:read,read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-vfyi + X-Cache: + - Miss from cloudfront + Via: + - 1.1 d16c3f15bd14953a9d4109eaaa991de2.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - Gb1NgoUxWrYjh3vRvjlRG6yd0KkvAGE8tH25UmkrIYKltWdD0JiWAQ== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CMTFYSFTL","name":"general","is_channel":true,"is_group":false,"is_im":false,"created":1568071144,"is_archived":false,"is_general":true,"unlinked":0,"name_normalized":"general","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UN5R1N5A8","last_set":1568071144},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UN5R1N5A8","last_set":1568071144},"previous_names":[],"num_members":2},{"id":"CN69H4HK7","name":"random","is_channel":true,"is_group":false,"is_im":false,"created":1568071144,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"random","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UN5R1N5A8","last_set":1568071144},"purpose":{"value":"A + place for non-work-related flimflam, faffing, hodge-podge or jibber-jabber + you''d prefer to keep out of more focused work-related channels.","creator":"UN5R1N5A8","last_set":1568071144},"previous_names":[],"num_members":2},{"id":"CN8FM00MU","name":"slack-api","is_channel":true,"is_group":false,"is_im":false,"created":1568071145,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"slack-api","is_shared":false,"parent_conversation":null,"creator":"UN5R1N5A8","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TMZSSV3BK"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Tue, 10 Sep 2019 23:18:35 GMT +recorded_with: VCR 5.0.0 diff --git a/test/channel_test.rb b/test/channel_test.rb new file mode 100644 index 00000000..dd6dcb60 --- /dev/null +++ b/test/channel_test.rb @@ -0,0 +1,62 @@ +require_relative 'test_helper' + +describe "Channel" do + describe "intialize" do + it "creates a new instance of channel" do + VCR.use_cassette("load_channels") do + channels = Channel.get + + expect(channels[0]).must_be_kind_of Channel + expect(channels).must_be_kind_of Array + end + end + end + + describe "self.get" do + it "has correct channel data" do + VCR.use_cassette("load_channels") do + channels = Channel.get + + expect(channels[0].name).must_equal "general" + expect(channels[0].topic).must_equal "Company-wide announcements and work-based matters" + expect(channels[0].member_count).must_equal 2 + expect(channels[0].slack_id).must_equal "CMTFYSFTL" + end + end + + it "has the correct number of channels" do + VCR.use_cassette("load_channels") do + channels = Channel.get + + expect(channels.length).must_equal 3 + + end + end + end + + describe "self.list" do + it "prints correct info for channels in a table" do + VCR.use_cassette("load_users") do + channels = Channel.list + + expect(channels).must_be_kind_of TablePrint::Returnable + + end + end + end + + describe "details" do + it "prints correct details for a channel" do + VCR.use_cassette("load_users") do + channels = Channel.get + result = channels[0].details + + expect(result).must_be_kind_of String + expect(result.length).must_equal 126 + + end + end + end + + +end \ No newline at end of file diff --git a/test/recipient_test.rb b/test/recipient_test.rb new file mode 100644 index 00000000..bd13b2f3 --- /dev/null +++ b/test/recipient_test.rb @@ -0,0 +1,14 @@ +require_relative 'test_helper' + +describe "Recipient" do + describe "send message" do + it "raises API error for bad request" do + VCR.use_cassette("api_request") do + recipient = Recipient.new("id", "name") + expect(recipient.send_message("Hi","dsdfsd")).must_equal false + + end + end + end + +end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index 90aeb408..b2782159 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -9,9 +9,22 @@ require 'minitest/skip_dsl' require 'vcr' +require_relative '../lib/recipient' +require_relative '../lib/user' +require_relative '../lib/channel' +require_relative '../lib/workspace' + Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new VCR.configure do |config| config.cassette_library_dir = "test/cassettes" config.hook_into :webmock + config.default_cassette_options = { + :record => :new_episodes, # record new data when we don't have it yet + :match_requests_on => [:method, :uri, :body], # The http method, URI and body of a request all need to match + } + # Don't leave our token lying around in a cassette file. + config.filter_sensitive_data("") do + ENV["SLACK_API_TOKEN"] + end end diff --git a/test/user_test.rb b/test/user_test.rb new file mode 100644 index 00000000..54070130 --- /dev/null +++ b/test/user_test.rb @@ -0,0 +1,66 @@ +require_relative 'test_helper' +require 'pry' +require 'table_print' + +describe "User" do + describe "intialize" do + it "creates a new instance of user" do + VCR.use_cassette("load_users") do + users = User.get + + expect(users[0]).must_be_kind_of User + expect(users).must_be_kind_of Array + end + end + end + + describe "self.get" do + it "has correct user data" do + VCR.use_cassette("load_users") do + users = User.get + + expect(users[0].name).must_equal "slackbot" + expect(users[0].real_name).must_equal "Slackbot" + expect(users[0].status_text).must_be_nil + expect(users[0].status_emoji).must_be_nil + expect(users[0].slack_id).must_equal "USLACKBOT" + end + end + + it "has the correct number of users" do + VCR.use_cassette("load_users") do + users = User.get + + expect(users.length).must_equal 3 + + end + end + end + + describe "self.list" do + it "prints correct info for user" do + VCR.use_cassette("load_users") do + users = User.list + + expect(users).must_be_kind_of TablePrint::Returnable + + end + end + + end + + describe "details" do + it "prints correct details for user" do + VCR.use_cassette("load_users") do + users = User.get + result = users[0].details + + expect(result).must_be_kind_of String + expect(result.length).must_equal 104 + + end + end + + end + +end \ No newline at end of file diff --git a/test/workspace_test.rb b/test/workspace_test.rb new file mode 100644 index 00000000..10d0394d --- /dev/null +++ b/test/workspace_test.rb @@ -0,0 +1,168 @@ +require_relative 'test_helper' + +describe "Workspace" do + describe "intialize" do + it "creates a new instance of workspace" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + + expect(workspace).must_be_kind_of Workspace + end + end + + it "contains an array of all users" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + + expect(workspace.users).must_be_kind_of Array + expect(workspace.users.length).must_equal 3 + expect(workspace.users[0]).must_be_kind_of User + end + end + + it "contains an array of all channels" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + + expect(workspace.channels).must_be_kind_of Array + expect(workspace.channels.length).must_equal 3 + expect(workspace.channels[0]).must_be_kind_of Channel + end + end + end + + describe "select users" do + it "selects the correct user" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + workspace.select_user("kemp.bri") + + expect(workspace.selected).must_be_kind_of User + expect(workspace.selected.name).must_equal "kemp.bri" + expect(workspace.selected.slack_id).must_equal "UMUR2C1QB" + end + end + + it "selects the correct user" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + workspace.select_user("UMUR2C1QB") + + expect(workspace.selected).must_be_kind_of User + expect(workspace.selected.name).must_equal "kemp.bri" + expect(workspace.selected.slack_id).must_equal "UMUR2C1QB" + end + end + + it "returns message if user is not found" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + result = workspace.select_user("aerstdhsg") + + expect(result).must_be_kind_of String + expect(result.length).must_equal 19 + end + end + end + + describe "select channel" do + it "selects the correct channel" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + workspace.select_channel("general") + + expect(workspace.selected).must_be_kind_of Channel + expect(workspace.selected.name).must_equal "general" + expect(workspace.selected.slack_id).must_equal "CMTFYSFTL" + end + end + + it "selects the correct channel" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + workspace.select_channel("CMTFYSFTL") + + expect(workspace.selected).must_be_kind_of Channel + expect(workspace.selected.name).must_equal "general" + expect(workspace.selected.slack_id).must_equal "CMTFYSFTL" + end + end + + it "returns message if channel is not found" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + result = workspace.select_channel("hgfdghf") + + expect(result).must_be_kind_of String + expect(result.length).must_equal 22 + end + end + end + + describe "show details" do + it "shows details for selected user" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + workspace.select_user("kemp.bri") + details = workspace.show_details + + expect(details).must_be_kind_of String + expect(details.length).must_equal 103 + end + end + + it "shows details for selected channel" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + workspace.select_channel("general") + details = workspace.show_details + + expect(details).must_be_kind_of String + expect(details.length).must_equal 126 + end + end + + it "returns message for non-selected user/channel" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + workspace.select_channel("sshtirl") + details = workspace.show_details + + expect(details).must_be_kind_of String + expect(details.length).must_equal 32 + end + end + end + + describe "send message" do + it "sends message to selected user/channel" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + workspace.select_user("kemp.bri") + message = workspace.send_message(message: "Test message") + + expect(message).must_equal true + end + end + + it "returns message if user/channel are not selected" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + message = workspace.send_message(message: "Test message") + + expect(message).must_equal false + end + end + + it "returns false if an API error is raises" do + VCR.use_cassette("create_workspace") do + workspace = Workspace.new + recipient = Recipient.new("id", "name") + workspace.selected = recipient + message = workspace.send_message(message: "Test message") + + expect(message).must_equal false + end + end + end +end