diff --git a/.gitignore b/.gitignore index 3ff4fada..82cc5be2 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,5 @@ .DS_Store -# Ignore environemnt variables +# Ignore environment variables .env diff --git a/lib/channel.rb b/lib/channel.rb new file mode 100644 index 00000000..e34d0819 --- /dev/null +++ b/lib/channel.rb @@ -0,0 +1,29 @@ +require_relative 'recipient' + +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 details + return "Channel #{@name}'s topic is #{@topic} and has #{@member_count} members. Its ID on Slack is #{@slack_id}." + end + + def self.list_all + response = self.get("#{BASE_URL}conversations.list", { token: SLACK_TOKEN }) + + channels_list = response["channels"].map do |channels_hash| + self.new(channels_hash["id"], + channels_hash["name"], + channels_hash["topic"]["value"], + channels_hash["num_members"]) + end + + return channels_list + end + +end \ No newline at end of file diff --git a/lib/recipient.rb b/lib/recipient.rb new file mode 100644 index 00000000..b42787ee --- /dev/null +++ b/lib/recipient.rb @@ -0,0 +1,52 @@ +require 'httparty' +require 'dotenv' + +require_relative 'slack_api_error' + +Dotenv.load +SLACK_TOKEN = ENV["SLACK_TOKEN"] + +BASE_URL = "https://slack.com/api/" + +class Recipient + attr_reader :slack_id, :name + + def initialize(slack_id, name) + @slack_id = slack_id + @name = name + end + + def send_message(message) + response = HTTParty.post("#{BASE_URL}chat.postMessage", + headers: { 'Content-Type' => 'application/x-www-form-urlencoded' }, + body: { + token: SLACK_TOKEN, + channel: self.slack_id, + text: message + }) + + unless response.code == 200 && response["ok"] + raise SlackApiError, "API call failed with error: #{response["error"]}" + end + + return true + end + + def self.get(url, params) + response = HTTParty.get(url, query: params) + + unless response.code == 200 && response["ok"] + raise SlackApiError, "API call failed with error: #{response["error"]}" + end + + return response + end + + def details + raise NotImplementedError, "Implement me in a child class!" + end + + def self.list_all + raise NotImplementedError, "Implement me in a child class!" + end +end \ No newline at end of file diff --git a/lib/slack.rb b/lib/slack.rb index 8a0b659b..78a8b39e 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -1,12 +1,66 @@ #!/usr/bin/env ruby +require_relative 'workspace' def main puts "Welcome to the Ada Slack CLI!" workspace = Workspace.new # TODO project + puts "What do you want to do?" + puts "1. list users\n2. list channels\n3. select user\n4. select channel\n5. details\n6. send message\n7. quit" + print ">> " + + user_input = gets.chomp.downcase + + until user_input == "quit" || user_input == "7" + case user_input + when "list users", "1" + workspace.list_users + when "list channels", "2" + workspace.list_channels + when "select user", "3" + print "Enter the user's name or Slack ID: " + user_input = gets.chomp + + begin + puts workspace.select_user(user_input) + rescue ArgumentError => exception + puts "#{exception}" + end + when "select channel", "4" + print "Enter the channel's name or Slack ID: " + user_input = gets.chomp + + begin + puts workspace.select_channel(user_input) + rescue ArgumentError => exception + puts "#{exception}" + end + when "details", "5" + begin + puts workspace.show_details + rescue NoMethodError => exception + puts "#{exception}" + end + when "send message", "6" + print "Type out a message: " + user_input = gets.chomp + + begin + puts workspace.send_message(user_input) + rescue NoMethodError => exception + puts "#{exception}" + end + else + puts "Invalid input. Try again." + end + + print "What do you want to do next? " + user_input = gets.chomp.downcase + end puts "Thank you for using the Ada Slack CLI" + exit end main if __FILE__ == $PROGRAM_NAME \ No newline at end of file diff --git a/lib/slack_api_error.rb b/lib/slack_api_error.rb new file mode 100644 index 00000000..5a82c3d9 --- /dev/null +++ b/lib/slack_api_error.rb @@ -0,0 +1 @@ +class SlackApiError < Exception; end diff --git a/lib/user.rb b/lib/user.rb new file mode 100644 index 00000000..2544ec80 --- /dev/null +++ b/lib/user.rb @@ -0,0 +1,31 @@ +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 details + return "User #{@name}'s real name is #{@real_name}, and their ID on Slack is #{@slack_id}. Their current status reads: #{@status_text} #{@status_emoji}." + end + + def self.list_all + response = self.get("#{BASE_URL}users.list", { token: SLACK_TOKEN }) + + users_list = response["members"].map do |members_hash| + self.new(members_hash["id"], + members_hash["name"], + members_hash["profile"]["real_name"], + members_hash["profile"]["status_text"], + members_hash["profile"]["status_emoji"]) + end + + return users_list + end + +end \ No newline at end of file diff --git a/lib/workspace.rb b/lib/workspace.rb new file mode 100644 index 00000000..9b60d13d --- /dev/null +++ b/lib/workspace.rb @@ -0,0 +1,51 @@ +require 'table_print' + +require_relative 'user' +require_relative 'channel' + +class Workspace + attr_reader :users, :channels, :selected + + def initialize + @users = User.list_all + @channels = Channel.list_all + @selected = nil + end + + def list_users + tp @users, "slack_id", "name", "real_name", "status_text", "status_emoji" + end + + def list_channels + tp @channels, "slack_id", "name", "topic", "member_count" + end + + def no_recipient + return @selected.nil? + end + + def select_user(id_or_name) + @selected = @users.find { |user| user.slack_id == id_or_name || user.name == id_or_name } + + raise ArgumentError, "User with that name or Slack ID not found." if no_recipient + return "User #{id_or_name} selected." + end + + def select_channel(id_or_name) + @selected = @channels.find { |channel| channel.slack_id == id_or_name || channel.name == id_or_name } + + raise ArgumentError, "Channel with that name or Slack ID not found." if no_recipient + return "Channel #{id_or_name} selected." + end + + def show_details + raise NoMethodError, "No recipient is currently selected." if no_recipient + return @selected.details + end + + def send_message(message) + raise NoMethodError, "No recipient is currently selected." if no_recipient + return "Message sent to #{@selected.class} #{@selected.name}!" if @selected.send_message(message) + end + +end diff --git a/test/cassettes/bad_post_request.yml b/test/cassettes/bad_post_request.yml new file mode 100644 index 00000000..349bb326 --- /dev/null +++ b/test/cassettes/bad_post_request.yml @@ -0,0 +1,133 @@ +--- +http_interactions: +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&channel=&text=u%20can%27t%20read%20me%20%3Asob%3A + headers: + Content-Type: + - application/x-www-form-urlencoded + 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: + Date: + - Fri, 09 Oct 2020 05:18:58 GMT + Server: + - Apache + X-Slack-Req-Id: + - 769ecbe9f8661ddbaaead934518a2273 + X-Oauth-Scopes: + - identify,channels:read,groups:read,im:read,mpim:read,users:read,chat:write + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Origin: + - "*" + X-Slack-Backend: + - r + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Content-Length: + - '60' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-n4uf,haproxy-edge-iad-fc1p + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"channel_not_found"}' + recorded_at: Fri, 09 Oct 2020 05:18:58 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&channel=U01CQMA06F2&text= + headers: + Content-Type: + - application/x-www-form-urlencoded + 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: + Date: + - Fri, 09 Oct 2020 05:18:59 GMT + Server: + - Apache + X-Slack-Req-Id: + - 2a56ed3322e4a884d5fdaf9f11293850 + X-Oauth-Scopes: + - identify,channels:read,groups:read,im:read,mpim:read,users:read,chat:write + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Origin: + - "*" + X-Slack-Backend: + - r + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Content-Length: + - '50' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-hhav,haproxy-edge-iad-g302 + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"no_text"}' + recorded_at: Fri, 09 Oct 2020 05:18:59 GMT +recorded_with: VCR 6.0.0 diff --git a/test/cassettes/list_channels.yml b/test/cassettes/list_channels.yml new file mode 100644 index 00000000..0736b784 --- /dev/null +++ b/test/cassettes/list_channels.yml @@ -0,0 +1,129 @@ +--- +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: + Date: + - Fri, 09 Oct 2020 04:55:52 GMT + Server: + - Apache + X-Slack-Req-Id: + - c5f7e044380cb70134e01fae37fa0d39 + X-Oauth-Scopes: + - identify,channels:read,groups:read,im:read,mpim:read,users:read,chat:write + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Origin: + - "*" + X-Slack-Backend: + - r + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - channels:read,groups:read,mpim:read,im:read,read + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Content-Length: + - '718' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-y70x,haproxy-edge-iad-t0k4 + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"C01BTQN36CF","name":"sos","is_channel":true,"is_group":false,"is_im":false,"created":1602182145,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"sos","is_shared":false,"parent_conversation":null,"creator":"U01CQMA06F2","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["T01CQM3LG6L"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"help + me","creator":"U01CQMA06F2","last_set":1602182189},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2},{"id":"C01C0RQN3H8","name":"general","is_channel":true,"is_group":false,"is_im":false,"created":1601958469,"is_archived":false,"is_general":true,"unlinked":0,"name_normalized":"general","is_shared":false,"parent_conversation":null,"creator":"U01C12E4CF5","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["T01CQM3LG6L"],"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":"This + is the one channel that will always include everyone. It\u2019s a great spot + for announcements and team-wide conversations.","creator":"U01C12E4CF5","last_set":1601958469},"previous_names":[],"num_members":2},{"id":"C01CQM3LQ5N","name":"random","is_channel":true,"is_group":false,"is_im":false,"created":1601958469,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"random","is_shared":false,"parent_conversation":null,"creator":"U01C12E4CF5","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["T01CQM3LG6L"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"anything + and everything","creator":"U01CQMA06F2","last_set":1602181915},"purpose":{"value":"This + channel is for... well, everything else. It\u2019s a place for team jokes, + spur-of-the-moment ideas, and funny GIFs. Go wild!","creator":"U01C12E4CF5","last_set":1601958469},"previous_names":[],"num_members":2},{"id":"C01CQMA6E56","name":"testing","is_channel":true,"is_group":false,"is_im":false,"created":1601958837,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"testing","is_shared":false,"parent_conversation":null,"creator":"U01C12E4CF5","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["T01CQM3LG6L"],"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":"This + *channel* is for working on a project. Hold meetings, share docs, and make + decisions together with your team.","creator":"U01C12E4CF5","last_set":1601958837},"previous_names":[],"num_members":3}],"response_metadata":{"next_cursor":""}}' + recorded_at: Fri, 09 Oct 2020 04:55:52 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: + Date: + - Fri, 09 Oct 2020 04:55:52 GMT + Server: + - Apache + X-Xss-Protection: + - '0' + Referrer-Policy: + - no-referrer + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + X-Accepted-Oauth-Scopes: + - conversations:read + X-Slack-Req-Id: + - 55bd84baa387ec8373aa2f6bd10cb87d + X-Slack-Backend: + - r + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Content-Type-Options: + - nosniff + Content-Length: + - '53' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-572o,haproxy-edge-iad-w3jt + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"not_authed"}' + recorded_at: Fri, 09 Oct 2020 04:55:52 GMT +recorded_with: VCR 6.0.0 diff --git a/test/cassettes/list_users.yml b/test/cassettes/list_users.yml new file mode 100644 index 00000000..9517683f --- /dev/null +++ b/test/cassettes/list_users.yml @@ -0,0 +1,130 @@ +--- +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: + Date: + - Fri, 09 Oct 2020 04:39:45 GMT + Server: + - Apache + X-Slack-Req-Id: + - 1e7ed38b160b0fa8573c046abfa79387 + X-Oauth-Scopes: + - identify,channels:read,groups:read,im:read,mpim:read,users:read,chat:write + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Origin: + - "*" + X-Slack-Backend: + - r + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - users:read + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Content-Length: + - '1316' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-7tp5,haproxy-edge-iad-w3jt + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"T01CQM3LG6L","name":"slackbot","deleted":false,"color":"757575","real_name":"Slackbot","tz":"America\/Los_Angeles","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":"T01CQM3LG6L"},"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":"U01BU4T45M4","team_id":"T01CQM3LG6L","name":"eartholgaslackcli","deleted":false,"color":"3c989f","real_name":"Earth-Olga-SlackCLI","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Earth-Olga-SlackCLI","real_name_normalized":"Earth-Olga-SlackCLI","display_name":"","display_name_normalized":"","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gbab7602ab3d","api_app_id":"A01C72A3R60","always_active":false,"bot_id":"B01CDFD9RED","image_24":"https:\/\/secure.gravatar.com\/avatar\/bab7602ab3d9731903ea0f8322150e35.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/bab7602ab3d9731903ea0f8322150e35.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/bab7602ab3d9731903ea0f8322150e35.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/bab7602ab3d9731903ea0f8322150e35.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/bab7602ab3d9731903ea0f8322150e35.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/bab7602ab3d9731903ea0f8322150e35.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-512.png","status_text_canonical":"","team":"T01CQM3LG6L"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1601959642},{"id":"U01C12E4CF5","team_id":"T01CQM3LG6L","name":"olga.tka4eva","deleted":false,"color":"9f69e7","real_name":"olga.tka4eva","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"olga.tka4eva","real_name_normalized":"olga.tka4eva","display_name":"","display_name_normalized":"","fields":null,"status_text":"YAy!","status_emoji":":+1:","status_expiration":1602226799,"avatar_hash":"ga2ccc03ad6a","image_24":"https:\/\/secure.gravatar.com\/avatar\/a2ccc03ad6a78c01a9496acde6b590d8.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/a2ccc03ad6a78c01a9496acde6b590d8.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/a2ccc03ad6a78c01a9496acde6b590d8.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/a2ccc03ad6a78c01a9496acde6b590d8.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/a2ccc03ad6a78c01a9496acde6b590d8.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/a2ccc03ad6a78c01a9496acde6b590d8.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-512.png","status_text_canonical":"","team":"T01CQM3LG6L"},"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":1602181955},{"id":"U01CQMA06F2","team_id":"T01CQM3LG6L","name":"bak02013","deleted":false,"color":"4bbe2e","real_name":"Beauttie","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Beauttie","real_name_normalized":"Beauttie","display_name":"Beauttie","display_name_normalized":"Beauttie","fields":null,"status_text":"trying + to make my code work","status_emoji":":female-technologist:","status_expiration":1602226799,"avatar_hash":"g51d0ec2dd94","image_24":"https:\/\/secure.gravatar.com\/avatar\/51d0ec2dd944e58eba412486ed4e2400.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/51d0ec2dd944e58eba412486ed4e2400.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/51d0ec2dd944e58eba412486ed4e2400.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/51d0ec2dd944e58eba412486ed4e2400.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/51d0ec2dd944e58eba412486ed4e2400.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/51d0ec2dd944e58eba412486ed4e2400.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-512.png","status_text_canonical":"","team":"T01CQM3LG6L"},"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":1602181796,"has_2fa":false},{"id":"U01CQMN9XR6","team_id":"T01CQM3LG6L","name":"beauttie_api_project","deleted":false,"color":"e7392d","real_name":"Earth + - Beauttie - API Project","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Earth + - Beauttie - API Project","real_name_normalized":"Earth - Beauttie - API Project","display_name":"","display_name_normalized":"","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g55b958146df","api_app_id":"A01BL47ENLX","always_active":false,"bot_id":"B01BU4SJZT8","first_name":"Earth","last_name":"- + Beauttie - API Project","image_24":"https:\/\/secure.gravatar.com\/avatar\/55b958146dffe9b57f5f4ee786e5b408.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/55b958146dffe9b57f5f4ee786e5b408.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/55b958146dffe9b57f5f4ee786e5b408.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/55b958146dffe9b57f5f4ee786e5b408.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/55b958146dffe9b57f5f4ee786e5b408.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/55b958146dffe9b57f5f4ee786e5b408.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-512.png","status_text_canonical":"","team":"T01CQM3LG6L"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1601961016}],"cache_ts":1602218385,"response_metadata":{"next_cursor":""}}' + recorded_at: Fri, 09 Oct 2020 04:39: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: + Date: + - Fri, 09 Oct 2020 04:39:45 GMT + Server: + - Apache + X-Xss-Protection: + - '0' + Referrer-Policy: + - no-referrer + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + X-Accepted-Oauth-Scopes: + - users:read + X-Slack-Req-Id: + - 66cc01cd54470bce1da3bfb45b4cec7e + X-Slack-Backend: + - r + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Content-Type-Options: + - nosniff + Content-Length: + - '53' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-wsih,haproxy-edge-iad-r943 + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"not_authed"}' + recorded_at: Fri, 09 Oct 2020 04:39:45 GMT +recorded_with: VCR 6.0.0 diff --git a/test/cassettes/load_workspace.yml b/test/cassettes/load_workspace.yml new file mode 100644 index 00000000..b235aa54 --- /dev/null +++ b/test/cassettes/load_workspace.yml @@ -0,0 +1,146 @@ +--- +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: + Date: + - Fri, 09 Oct 2020 05:15:39 GMT + Server: + - Apache + X-Slack-Req-Id: + - 745964ff0b2bb1be995851218cc18d58 + X-Oauth-Scopes: + - identify,channels:read,groups:read,im:read,mpim:read,users:read,chat:write + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Origin: + - "*" + X-Slack-Backend: + - r + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - users:read + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Content-Length: + - '1316' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-xysk,haproxy-edge-pdx-5vxz + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"T01CQM3LG6L","name":"slackbot","deleted":false,"color":"757575","real_name":"Slackbot","tz":"America\/Los_Angeles","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":"T01CQM3LG6L"},"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":"U01BU4T45M4","team_id":"T01CQM3LG6L","name":"eartholgaslackcli","deleted":false,"color":"3c989f","real_name":"Earth-Olga-SlackCLI","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Earth-Olga-SlackCLI","real_name_normalized":"Earth-Olga-SlackCLI","display_name":"","display_name_normalized":"","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gbab7602ab3d","api_app_id":"A01C72A3R60","always_active":false,"bot_id":"B01CDFD9RED","image_24":"https:\/\/secure.gravatar.com\/avatar\/bab7602ab3d9731903ea0f8322150e35.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/bab7602ab3d9731903ea0f8322150e35.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/bab7602ab3d9731903ea0f8322150e35.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/bab7602ab3d9731903ea0f8322150e35.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/bab7602ab3d9731903ea0f8322150e35.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/bab7602ab3d9731903ea0f8322150e35.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-512.png","status_text_canonical":"","team":"T01CQM3LG6L"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1601959642},{"id":"U01C12E4CF5","team_id":"T01CQM3LG6L","name":"olga.tka4eva","deleted":false,"color":"9f69e7","real_name":"olga.tka4eva","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"olga.tka4eva","real_name_normalized":"olga.tka4eva","display_name":"","display_name_normalized":"","fields":null,"status_text":"YAy!","status_emoji":":+1:","status_expiration":1602226799,"avatar_hash":"ga2ccc03ad6a","image_24":"https:\/\/secure.gravatar.com\/avatar\/a2ccc03ad6a78c01a9496acde6b590d8.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/a2ccc03ad6a78c01a9496acde6b590d8.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/a2ccc03ad6a78c01a9496acde6b590d8.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/a2ccc03ad6a78c01a9496acde6b590d8.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/a2ccc03ad6a78c01a9496acde6b590d8.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/a2ccc03ad6a78c01a9496acde6b590d8.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-512.png","status_text_canonical":"","team":"T01CQM3LG6L"},"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":1602181955},{"id":"U01CQMA06F2","team_id":"T01CQM3LG6L","name":"bak02013","deleted":false,"color":"4bbe2e","real_name":"Beauttie","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Beauttie","real_name_normalized":"Beauttie","display_name":"Beauttie","display_name_normalized":"Beauttie","fields":null,"status_text":"trying + to make my code work","status_emoji":":female-technologist:","status_expiration":1602226799,"avatar_hash":"g51d0ec2dd94","image_24":"https:\/\/secure.gravatar.com\/avatar\/51d0ec2dd944e58eba412486ed4e2400.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/51d0ec2dd944e58eba412486ed4e2400.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/51d0ec2dd944e58eba412486ed4e2400.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/51d0ec2dd944e58eba412486ed4e2400.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/51d0ec2dd944e58eba412486ed4e2400.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/51d0ec2dd944e58eba412486ed4e2400.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-512.png","status_text_canonical":"","team":"T01CQM3LG6L"},"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":1602181796,"has_2fa":false},{"id":"U01CQMN9XR6","team_id":"T01CQM3LG6L","name":"beauttie_api_project","deleted":false,"color":"e7392d","real_name":"Earth + - Beauttie - API Project","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Earth + - Beauttie - API Project","real_name_normalized":"Earth - Beauttie - API Project","display_name":"","display_name_normalized":"","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g55b958146df","api_app_id":"A01BL47ENLX","always_active":false,"bot_id":"B01BU4SJZT8","first_name":"Earth","last_name":"- + Beauttie - API Project","image_24":"https:\/\/secure.gravatar.com\/avatar\/55b958146dffe9b57f5f4ee786e5b408.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/55b958146dffe9b57f5f4ee786e5b408.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/55b958146dffe9b57f5f4ee786e5b408.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/55b958146dffe9b57f5f4ee786e5b408.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/55b958146dffe9b57f5f4ee786e5b408.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/55b958146dffe9b57f5f4ee786e5b408.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-512.png","status_text_canonical":"","team":"T01CQM3LG6L"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1601961016}],"cache_ts":1602220539,"response_metadata":{"next_cursor":""}}' + recorded_at: Fri, 09 Oct 2020 05:15:39 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: + Date: + - Fri, 09 Oct 2020 05:15:39 GMT + Server: + - Apache + X-Slack-Req-Id: + - a1bc8562fd69e42756e1df2fa1fa6efd + X-Oauth-Scopes: + - identify,channels:read,groups:read,im:read,mpim:read,users:read,chat:write + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Origin: + - "*" + X-Slack-Backend: + - r + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - channels:read,groups:read,mpim:read,im:read,read + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Content-Length: + - '718' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-104q,haproxy-edge-pdx-f5k6 + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"C01BTQN36CF","name":"sos","is_channel":true,"is_group":false,"is_im":false,"created":1602182145,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"sos","is_shared":false,"parent_conversation":null,"creator":"U01CQMA06F2","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["T01CQM3LG6L"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"help + me","creator":"U01CQMA06F2","last_set":1602182189},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2},{"id":"C01C0RQN3H8","name":"general","is_channel":true,"is_group":false,"is_im":false,"created":1601958469,"is_archived":false,"is_general":true,"unlinked":0,"name_normalized":"general","is_shared":false,"parent_conversation":null,"creator":"U01C12E4CF5","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["T01CQM3LG6L"],"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":"This + is the one channel that will always include everyone. It\u2019s a great spot + for announcements and team-wide conversations.","creator":"U01C12E4CF5","last_set":1601958469},"previous_names":[],"num_members":2},{"id":"C01CQM3LQ5N","name":"random","is_channel":true,"is_group":false,"is_im":false,"created":1601958469,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"random","is_shared":false,"parent_conversation":null,"creator":"U01C12E4CF5","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["T01CQM3LG6L"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"topic":{"value":"anything + and everything","creator":"U01CQMA06F2","last_set":1602181915},"purpose":{"value":"This + channel is for... well, everything else. It\u2019s a place for team jokes, + spur-of-the-moment ideas, and funny GIFs. Go wild!","creator":"U01C12E4CF5","last_set":1601958469},"previous_names":[],"num_members":2},{"id":"C01CQMA6E56","name":"testing","is_channel":true,"is_group":false,"is_im":false,"created":1601958837,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"testing","is_shared":false,"parent_conversation":null,"creator":"U01C12E4CF5","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["T01CQM3LG6L"],"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":"This + *channel* is for working on a project. Hold meetings, share docs, and make + decisions together with your team.","creator":"U01C12E4CF5","last_set":1601958837},"previous_names":[],"num_members":3}],"response_metadata":{"next_cursor":""}}' + recorded_at: Fri, 09 Oct 2020 05:15:39 GMT +recorded_with: VCR 6.0.0 diff --git a/test/cassettes/send_message.yml b/test/cassettes/send_message.yml new file mode 100644 index 00000000..fd046d9a --- /dev/null +++ b/test/cassettes/send_message.yml @@ -0,0 +1,137 @@ +--- +http_interactions: +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&channel=C01CQMA6E56&text=This%20is%20our%20first%20message%21 + headers: + Content-Type: + - application/x-www-form-urlencoded + 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: + Date: + - Fri, 09 Oct 2020 06:00:05 GMT + Server: + - Apache + X-Slack-Req-Id: + - d2297e55216ae57df10a1c483870cc25 + X-Oauth-Scopes: + - identify,channels:read,groups:read,im:read,mpim:read,users:read,chat:write + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Origin: + - "*" + X-Slack-Backend: + - r + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Content-Length: + - '348' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-qbdl,haproxy-edge-pdx-mprq + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channel":"C01CQMA6E56","ts":"1602223205.000600","message":{"bot_id":"B01BL5M2VT9","type":"message","text":"This + is our first message!","user":"U01CQMA06F2","ts":"1602223205.000600","team":"T01CQM3LG6L","bot_profile":{"id":"B01BL5M2VT9","deleted":false,"name":"Earth + - Beauttie - API Project","updated":1601961796,"app_id":"A01BL47ENLX","icons":{"image_36":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/bot_36.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/bot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/service_72.png"},"team_id":"T01CQM3LG6L"}}}' + recorded_at: Fri, 09 Oct 2020 06:00:05 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&channel=U01CQMA06F2&text=can%20u%20not%20be%20such%20a%20perfectionist%3F + headers: + Content-Type: + - application/x-www-form-urlencoded + 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: + Date: + - Fri, 09 Oct 2020 06:00:05 GMT + Server: + - Apache + X-Slack-Req-Id: + - a55e7c98bd55edfe81461425768d300e + X-Oauth-Scopes: + - identify,channels:read,groups:read,im:read,mpim:read,users:read,chat:write + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Origin: + - "*" + X-Slack-Backend: + - r + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Content-Length: + - '359' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-cv6x,haproxy-edge-pdx-uln4 + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channel":"D01C0RX1T50","ts":"1602223205.000800","message":{"bot_id":"B01BL5M2VT9","type":"message","text":"can + u not be such a perfectionist?","user":"U01CQMA06F2","ts":"1602223205.000800","team":"T01CQM3LG6L","bot_profile":{"id":"B01BL5M2VT9","deleted":false,"name":"Earth + - Beauttie - API Project","updated":1601961796,"app_id":"A01BL47ENLX","icons":{"image_36":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/bot_36.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/bot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/service_72.png"},"team_id":"T01CQM3LG6L"}}}' + recorded_at: Fri, 09 Oct 2020 06:00:05 GMT +recorded_with: VCR 6.0.0 diff --git a/test/cassettes/users_details.yml b/test/cassettes/users_details.yml new file mode 100644 index 00000000..4406478e --- /dev/null +++ b/test/cassettes/users_details.yml @@ -0,0 +1,75 @@ +--- +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: + Date: + - Fri, 09 Oct 2020 04:39:45 GMT + Server: + - Apache + X-Slack-Req-Id: + - b66e8cf6da56461a8a8803179155cba9 + X-Oauth-Scopes: + - identify,channels:read,groups:read,im:read,mpim:read,users:read,chat:write + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Origin: + - "*" + X-Slack-Backend: + - r + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - users:read + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Content-Length: + - '1316' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-xfba,haproxy-edge-iad-rxcd + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"T01CQM3LG6L","name":"slackbot","deleted":false,"color":"757575","real_name":"Slackbot","tz":"America\/Los_Angeles","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":"T01CQM3LG6L"},"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":"U01BU4T45M4","team_id":"T01CQM3LG6L","name":"eartholgaslackcli","deleted":false,"color":"3c989f","real_name":"Earth-Olga-SlackCLI","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Earth-Olga-SlackCLI","real_name_normalized":"Earth-Olga-SlackCLI","display_name":"","display_name_normalized":"","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gbab7602ab3d","api_app_id":"A01C72A3R60","always_active":false,"bot_id":"B01CDFD9RED","image_24":"https:\/\/secure.gravatar.com\/avatar\/bab7602ab3d9731903ea0f8322150e35.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/bab7602ab3d9731903ea0f8322150e35.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/bab7602ab3d9731903ea0f8322150e35.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/bab7602ab3d9731903ea0f8322150e35.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/bab7602ab3d9731903ea0f8322150e35.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/bab7602ab3d9731903ea0f8322150e35.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-512.png","status_text_canonical":"","team":"T01CQM3LG6L"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1601959642},{"id":"U01C12E4CF5","team_id":"T01CQM3LG6L","name":"olga.tka4eva","deleted":false,"color":"9f69e7","real_name":"olga.tka4eva","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"olga.tka4eva","real_name_normalized":"olga.tka4eva","display_name":"","display_name_normalized":"","fields":null,"status_text":"YAy!","status_emoji":":+1:","status_expiration":1602226799,"avatar_hash":"ga2ccc03ad6a","image_24":"https:\/\/secure.gravatar.com\/avatar\/a2ccc03ad6a78c01a9496acde6b590d8.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/a2ccc03ad6a78c01a9496acde6b590d8.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/a2ccc03ad6a78c01a9496acde6b590d8.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/a2ccc03ad6a78c01a9496acde6b590d8.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/a2ccc03ad6a78c01a9496acde6b590d8.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/a2ccc03ad6a78c01a9496acde6b590d8.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-512.png","status_text_canonical":"","team":"T01CQM3LG6L"},"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":1602181955},{"id":"U01CQMA06F2","team_id":"T01CQM3LG6L","name":"bak02013","deleted":false,"color":"4bbe2e","real_name":"Beauttie","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Beauttie","real_name_normalized":"Beauttie","display_name":"Beauttie","display_name_normalized":"Beauttie","fields":null,"status_text":"trying + to make my code work","status_emoji":":female-technologist:","status_expiration":1602226799,"avatar_hash":"g51d0ec2dd94","image_24":"https:\/\/secure.gravatar.com\/avatar\/51d0ec2dd944e58eba412486ed4e2400.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/51d0ec2dd944e58eba412486ed4e2400.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/51d0ec2dd944e58eba412486ed4e2400.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/51d0ec2dd944e58eba412486ed4e2400.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/51d0ec2dd944e58eba412486ed4e2400.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/51d0ec2dd944e58eba412486ed4e2400.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-512.png","status_text_canonical":"","team":"T01CQM3LG6L"},"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":1602181796,"has_2fa":false},{"id":"U01CQMN9XR6","team_id":"T01CQM3LG6L","name":"beauttie_api_project","deleted":false,"color":"e7392d","real_name":"Earth + - Beauttie - API Project","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Earth + - Beauttie - API Project","real_name_normalized":"Earth - Beauttie - API Project","display_name":"","display_name_normalized":"","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g55b958146df","api_app_id":"A01BL47ENLX","always_active":false,"bot_id":"B01BU4SJZT8","first_name":"Earth","last_name":"- + Beauttie - API Project","image_24":"https:\/\/secure.gravatar.com\/avatar\/55b958146dffe9b57f5f4ee786e5b408.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/55b958146dffe9b57f5f4ee786e5b408.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/55b958146dffe9b57f5f4ee786e5b408.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/55b958146dffe9b57f5f4ee786e5b408.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/55b958146dffe9b57f5f4ee786e5b408.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/55b958146dffe9b57f5f4ee786e5b408.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-512.png","status_text_canonical":"","team":"T01CQM3LG6L"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1601961016}],"cache_ts":1602218385,"response_metadata":{"next_cursor":""}}' + recorded_at: Fri, 09 Oct 2020 04:39:45 GMT +recorded_with: VCR 6.0.0 diff --git a/test/channel_test.rb b/test/channel_test.rb new file mode 100644 index 00000000..510c1c6e --- /dev/null +++ b/test/channel_test.rb @@ -0,0 +1,63 @@ +require_relative 'test_helper' +require_relative '../lib/channel' + +describe "Channel class" do + describe "Channel instantiation" do + before do + @channel = Channel.new("C14", "earth-adies", "collaborative space for the Earth classroom", 2) + end + + it "is an instance of Channel" do + expect(@channel).must_be_kind_of Channel + end + + it "is set up for specific attributes and data types" do + expect(@channel).must_respond_to :details + expect(Channel).must_respond_to :list_all + + expect(@channel.slack_id).must_be_kind_of String + expect(@channel.name).must_be_kind_of String + expect(@channel.topic).must_be_kind_of String + expect(@channel.member_count).must_be_kind_of Integer + end + end + + describe "list_all method" do + it "returns an Array of Channels" do + VCR.use_cassette("list_channels") do + channels_list = Channel.list_all + + expect(channels_list).must_be_kind_of Array + expect(channels_list.all?(Channel)).must_equal true + + expect(channels_list.length).must_equal 4 + end + end + + it "raises an error when token is not provided" do + VCR.use_cassette("list_channels") do + expect{ + Channel.get("#{BASE_URL}conversations.list", { token: "" }) + }.must_raise SlackApiError + end + end + end + + describe "details method" do + before do + @channel = Channel.new("C14", "earth-adies", "collaborative space for the Earth classroom", 2) + end + + it "returns a String including specific attributes" do + channel_details = @channel.details + + expect(channel_details).must_be_kind_of String + + expect(channel_details).must_include @channel.slack_id + expect(channel_details).must_include @channel.name + expect(channel_details).must_include @channel.topic + expect(channel_details).must_include @channel.member_count.to_s + end + end + +end diff --git a/test/test_helper.rb b/test/test_helper.rb index 1fcf2bab..ea79be3e 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -8,16 +8,13 @@ require 'minitest/reporters' require 'minitest/skip_dsl' require 'vcr' +require "dotenv" +Dotenv.load Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new VCR.configure do |config| - config.cassette_library_dir = "test/cassettes" - config.hook_into :webmock -end - -VCR.configure do |config| - config.cassette_library_dir = "test/cassettes" # folder where casettes will be located + config.cassette_library_dir = "test/cassettes" # folder where cassettes will be located config.hook_into :webmock # tie into this other tool called webmock config.default_cassette_options = { :record => :new_episodes, # record new data when we don't have it yet @@ -25,5 +22,7 @@ } # Don't leave our token lying around in a cassette file. - + config.filter_sensitive_data("") do + ENV["SLACK_TOKEN"] + end end diff --git a/test/user_test.rb b/test/user_test.rb new file mode 100644 index 00000000..81831619 --- /dev/null +++ b/test/user_test.rb @@ -0,0 +1,97 @@ +require_relative 'test_helper' +require_relative '../lib/user' + +describe "User class" do + describe "User instantiation" do + before do + @user = User.new("USLACKBOT", "slackbot", "Slackbot", "away", ":robot_face:") + end + + it "is an instance of User" do + expect(@user).must_be_kind_of User + end + + it "is set up for specific attributes and data types" do + expect(@user).must_respond_to :details + expect(User).must_respond_to :list_all + + expect(@user.slack_id).must_be_kind_of String + expect(@user.name).must_be_kind_of String + expect(@user.real_name).must_be_kind_of String + expect(@user.status_text).must_be_kind_of String + expect(@user.status_emoji).must_be_kind_of String + end + + it "initialized properly sets all properties" do + expect(@user.slack_id).must_equal "USLACKBOT" + expect(@user.name).must_equal "slackbot" + expect(@user.status_text).must_equal "away" + expect(@user.status_emoji).must_equal ":robot_face:" + end + end + + describe "list_all method" do + it "returns an Array of Users" do + VCR.use_cassette("list_users") do + users_list = User.list_all + + expect(users_list).must_be_kind_of Array + expect(users_list.all?(User)).must_equal true + + expect(users_list.length).must_equal 5 + end + end + + it "raises an error when token is not provided" do + VCR.use_cassette("list_users") do + expect{ + User.get("#{BASE_URL}users.list", { token: "" }) + }.must_raise SlackApiError + end + end + end + + describe "details method" do + let (:user) { + User.new( + "USLACKBOT", + "slackbot", + "Slackbot", + "away", + ":robot_face:" + ) + } + + it "returns a String including specific attributes" do + user_details = user.details + + expect(user_details).must_be_kind_of String + + expect(user_details).must_include user.slack_id + expect(user_details).must_include user.name + expect(user_details).must_include user.real_name + expect(user_details).must_include user.status_text + expect(user_details).must_include user.status_emoji + end + + it "returns correct details based on user's attributes" do + expect(user.details).must_equal "User slackbot's real name is Slackbot, and their ID on Slack is USLACKBOT. Their current status reads: away :robot_face:." + end + + it "returns correct details for current list of users" do + VCR.use_cassette("users_details") do + users_list = User.list_all + users_details = users_list.map { |user| user.details } + expected_details = ["User slackbot's real name is Slackbot, and their ID on Slack is USLACKBOT. Their current status reads: .", + "User eartholgaslackcli's real name is Earth-Olga-SlackCLI, and their ID on Slack is U01BU4T45M4. Their current status reads: .", + "User olga.tka4eva's real name is olga.tka4eva, and their ID on Slack is U01C12E4CF5. Their current status reads: YAy! :+1:.", + "User bak02013's real name is Beauttie, and their ID on Slack is U01CQMA06F2. Their current status reads: trying to make my code work :female-technologist:.", + "User beauttie_api_project's real name is Earth - Beauttie - API Project, and their ID on Slack is U01CQMN9XR6. Their current status reads: ."] + + expect(users_details).must_equal expected_details + end + end + end + +end + diff --git a/test/workspace_test.rb b/test/workspace_test.rb new file mode 100644 index 00000000..d232a1c1 --- /dev/null +++ b/test/workspace_test.rb @@ -0,0 +1,130 @@ +require_relative 'test_helper' +require_relative '../lib/workspace' +require_relative '../lib/recipient' + +describe "Workspace class" do + + before do + VCR.use_cassette("load_workspace") do + @workspace = Workspace.new + end + end + + describe "Workspace instantiation" do + it "is an instance of Workspace" do + expect(@workspace).must_be_kind_of Workspace + end + + it "is set up for specific attributes and data types" do + [:list_users, :list_channels, :no_recipient, :select_user, :select_channel, :show_details, :send_message].each do |prop| + expect(@workspace).must_respond_to prop + end + + expect(@workspace.users).must_be_kind_of Array + expect(@workspace.users.all?(User)).must_equal true + expect(@workspace.channels).must_be_kind_of Array + expect(@workspace.channels.all?(Channel)).must_equal true + expect(@workspace.selected).must_be_nil + end + end + + describe "no_recipient method" do + it "returns a Boolean" do + expect(@workspace.no_recipient).must_be_kind_of ( TrueClass || FalseClass ) + end + end + + describe "select_user method" do + it "stores an instance of User" do + @workspace.select_user("slackbot") + + expect(@workspace.selected).must_be_kind_of User + end + + it "raises an error when invalid user is entered" do + expect { + @workspace.select_user("troll") + }.must_raise ArgumentError + end + end + + describe "select_channel method" do + it "stores an instance of Channel" do + @workspace.select_channel("general") + + expect(@workspace.selected).must_be_kind_of Channel + end + + it "raises an error when invalid channel is entered" do + expect { + @workspace.select_channel("trolling") + }.must_raise ArgumentError + end + end + + describe "show_details method" do + it "returns a String when user is selected" do + @workspace.select_user("olga.tka4eva") + user_details = @workspace.show_details + + expect(user_details).must_be_kind_of String + expect(user_details).must_equal "User olga.tka4eva's real name is olga.tka4eva, and their ID on Slack is U01C12E4CF5. Their current status reads: YAy! :+1:." + end + + it "returns a String when channel is selected" do + @workspace.select_channel("random") + channel_details = @workspace.show_details + + expect(channel_details).must_be_kind_of String + expect(channel_details).must_equal "Channel random's topic is anything and everything and has 2 members. Its ID on Slack is C01CQM3LQ5N." + end + + it "raises an error when no recipient is selected" do + expect { + @workspace.show_details + }.must_raise NoMethodError + end + end + + describe "send_message method" do + it "can send a message to a valid channel" do + VCR.use_cassette("send_message") do + @workspace.select_channel("testing") + response = @workspace.send_message("This is our first message!") + + expect(response).must_equal "Message sent to Channel testing!" + end + end + + it "can send a message to a valid user" do + VCR.use_cassette("send_message") do + @workspace.select_user("bak02013") + response = @workspace.send_message("can u not be such a perfectionist?") + + expect(response).must_equal "Message sent to User bak02013!" + end + end + + it "raises an error when recipient doesn't exist" do + VCR.use_cassette("bad_post_request") do + recipient = Recipient.new("", "") + + expect { + recipient.send_message("u can't read me :sob:") + }.must_raise SlackApiError + end + end + + it "raises an error when the message is empty" do + VCR.use_cassette("bad_post_request") do + @workspace.select_user("bak02013") + recipient = @workspace.selected + + expect { + recipient.send_message("") + }.must_raise SlackApiError + end + end + end + +end \ No newline at end of file