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..c5621d14 --- /dev/null +++ b/lib/channel.rb @@ -0,0 +1,35 @@ +require_relative "recipient" + +class Channel < Recipient + attr_reader :topic, :member_count + + def initialize( topic:, member_count:, name:, slack_id:) + super(slack_id: slack_id, name: name) + @topic = topic + @member_count = member_count + end + + # displays channels details to command line + def details + tp self, "slack_id", "name", "topic", "member_count" + end + + # gathers relevant information about channels in this workspace + def self.list_all + data = self.get("https://slack.com/api/conversations.list") + + channel_info = [] + + data["channels"].each do |item| + channel_info << Channel.new( + name: item["name"], + slack_id: item["id"], + topic: item["topic"]["value"], + member_count: item["num_members"] + ) + end + + return channel_info + end + +end diff --git a/lib/recipient.rb b/lib/recipient.rb new file mode 100644 index 00000000..27a889b0 --- /dev/null +++ b/lib/recipient.rb @@ -0,0 +1,56 @@ +require "httparty" + +class Recipient + + attr_reader :slack_id, :name + + def initialize(slack_id:, name:) + @slack_id = slack_id + @name = name + end + + # ----- IMPLEMENTED METHODS ----- + + # gets desired data from Slack API + def self.get(url) + requested_data = HTTParty.get(url, query: {token: ENV["BOT_TOKEN"]}) + + if requested_data.code != 200 || requested_data["ok"] == false + raise SlackAPIError, "Encountered error: #{requested_data["error"]}" + end + + return requested_data + end + + # post a message to a slack channel + def send_message(message) + message_reciever = self.slack_id + + sent_message_details = HTTParty.post("https://slack.com/api/chat.postMessage", + query: {token: ENV["BOT_TOKEN"], channel: message_reciever, text: message} ) + + if sent_message_details["ok"] == false + raise SlackAPIError, "Encountered error: #{sent_message_details["error"]}" + else + puts "\n" + puts "Message sent successfully." + end + + return sent_message_details + end + + # ----- ABSTRACT METHODS ----- + + def self.list_all + raise NotImplementedError, "Implement me in a child class!" + end + + def details + raise NotImplementedError, "Implement me in a child class!" + end + +end + +# custom exception created here so that it is accessible by all other classes in this project +class SlackAPIError < Exception +end \ No newline at end of file diff --git a/lib/slack.rb b/lib/slack.rb index 8a0b659b..8a9eafd0 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -1,12 +1,87 @@ #!/usr/bin/env ruby +require 'dotenv' +require "table_print" +require_relative "workspace" +Dotenv.load + +# prompts user for their input and records it +def prompt_action + puts "You have six options: list users, list channels, select user, select channel, display details, send message, or quit." + puts "\n" + print "Please enter your choice: " + return gets.chomp.downcase +end + +# controls command line interactivity def main - puts "Welcome to the Ada Slack CLI!" + workspace = Workspace.new - # TODO project + puts "\n" + puts "Welcome to the Ada Slack CLI! This Slack workspace currently has #{workspace.users.count} users and #{workspace.channels.count} channels." + puts "\n" + + user_input = prompt_action + + until user_input == "quit" + + case user_input + + when "list users" + tp workspace.users, "slack_id", "name", "real_name" + puts "\n" + + when "list channels" + tp workspace.channels, "name", "topic", "member_count", "slack_id" + puts "\n" + + when "select user" + print "Please enter the user's username or ID: " + requested_user = gets.chomp + puts workspace.select_user(requested_user) + puts "\n" + + when "select channel" + print "Please enter the channel's name or ID: " + requested_channel = gets.chomp + puts workspace.select_channel(requested_channel) + puts "\n" + + when "display details" + if workspace.selected == nil + puts "You must \"select user\" or \"select channel\" first." + puts "\n" + else + workspace.display_details + user_input = nil + puts "\n" + end + + when "send message" + if workspace.selected == nil + puts "You must \"select user\" or \"select channel\" first." + puts "\n" + else + print "Enter your message: " + message = gets.chomp + workspace.send_message(message) + user_input = nil + puts "\n" + end + + else + puts "\n" + puts "I cannot perform \"#{user_input}\". Please try again ->" + puts "\n" + end + + user_input = prompt_action # call again until valid input is provided + end + + puts "\n" + puts "Okay, thank you for using the Ada Slack CLI. Goodbye!" - puts "Thank you for using the Ada Slack CLI" end main if __FILE__ == $PROGRAM_NAME \ No newline at end of file diff --git a/lib/user.rb b/lib/user.rb new file mode 100644 index 00000000..60bab485 --- /dev/null +++ b/lib/user.rb @@ -0,0 +1,38 @@ +require_relative "recipient" + +class User < Recipient + + attr :real_name, :status_text, :status_emoji + + def initialize(real_name:, status_text:, status_emoji:, name:, slack_id:) + super(slack_id: slack_id, name: name) + @real_name = real_name + @status_text = status_text + @status_emoji = status_emoji + end + + # displays user details to command line + def details + tp self, "slack_id", "name", "real_name" + end + + # gathers relevant information about users in this workspace + def self.list_all + data = self.get("https://slack.com/api/users.list") + + user_info = [] + + data["members"].each do |user| + user_info << User.new( + name: user["name"], + slack_id: user["id"], + real_name: user["profile"]["real_name"], + status_emoji: user["profile"]["status_emoji"], + status_text: user["profile"]["status_text"] + ) + end + + return user_info + end + +end \ No newline at end of file diff --git a/lib/workspace.rb b/lib/workspace.rb new file mode 100644 index 00000000..7ca9e698 --- /dev/null +++ b/lib/workspace.rb @@ -0,0 +1,46 @@ +require_relative "user" +require_relative "channel" + +class Workspace + + attr_reader :users, :channels, :selected + + def initialize(users: [], channels: []) + @users = User.list_all + @channels = Channel.list_all + @selected = nil + end + + def select_user(requested_user) + users.each do |user| + if user.name == requested_user || user.slack_id == requested_user + @selected = user + return "User \"#{selected.real_name}\" has been selected." + end + end + + return "Sorry, user \"#{requested_user}\" does not exist in this workspace." + end + + def select_channel(requested_channel) + channels.each do |channel| + if channel.name == requested_channel || channel.slack_id == requested_channel + @selected = channel + return "Channel titled \"#{selected.name}\" has been selected." + end + end + + return "Sorry, channel \"#{requested_channel}\" does not exist in this workspace." + end + + # displays workspace info to command line based on selected recipient + def display_details + return @selected.details + end + + # posts a message in the selected channel in workspace + def send_message(message_text) + @selected.send_message(message_text) + end + +end diff --git a/test/cassettes/channels-list-endpoint.yml b/test/cassettes/channels-list-endpoint.yml new file mode 100644 index 00000000..773bb63d --- /dev/null +++ b/test/cassettes/channels-list-endpoint.yml @@ -0,0 +1,148 @@ +--- +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: + - '622' + Connection: + - keep-alive + Date: + - Mon, 16 Mar 2020 03:22:52 GMT + Server: + - Apache + X-Slack-Req-Id: + - d7f49c1caf2eb218be923f6b59c6ce41 + X-Oauth-Scopes: + - chat:write,channels:read,users:read + X-Accepted-Oauth-Scopes: + - channels:read,groups:read,mpim:read,im:read,read + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Slack-Backend: + - h + 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' + Vary: + - Accept-Encoding + Pragma: + - no-cache + 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 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-n3sn + X-Cache: + - Miss from cloudfront + Via: + - 1.1 73bd23077f64204bc8f5efea09d16ebd.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - HIO51-C1 + X-Amz-Cf-Id: + - uMtHnT4m_QKtD8dhxSrC3V3LdRPDDFgxFZ0VFcnXlaj1n5Dr4I9DZw== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CUTE4M96W","name":"general","is_channel":true,"is_group":false,"is_im":false,"created":1583872630,"is_archived":false,"is_general":true,"unlinked":0,"name_normalized":"general","is_shared":false,"parent_conversation":null,"creator":"UV68ES05B","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV83W4WBZ"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UV68ES05B","last_set":1583872630},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UV68ES05B","last_set":1583872630},"previous_names":[],"num_members":6},{"id":"CUTE4MTD0","name":"api-testing","is_channel":true,"is_group":false,"is_im":false,"created":1583872631,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"api-testing","is_shared":false,"parent_conversation":null,"creator":"UV68ES05B","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV83W4WBZ"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"For + covid testing","creator":"UV68ES05B","last_set":1583958329},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":6},{"id":"CV83W5SS3","name":"random","is_channel":true,"is_group":false,"is_im":false,"created":1583872630,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"random","is_shared":false,"parent_conversation":null,"creator":"UV68ES05B","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV83W4WBZ"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UV68ES05B","last_set":1583872630},"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":"UV68ES05B","last_set":1583872630},"previous_names":[],"num_members":6}],"response_metadata":{"next_cursor":""}}' + http_version: null + recorded_at: Mon, 16 Mar 2020 03:22:52 GMT +- request: + method: get + uri: https://slack.com/api/bogus.endpoint?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: + - '80' + Connection: + - keep-alive + Date: + - Mon, 16 Mar 2020 03:34:25 GMT + Server: + - Apache + 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 + Referrer-Policy: + - no-referrer + X-Slack-Backend: + - h + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 5e3c119a4d761c801d6c1e5004dc0110 + X-Xss-Protection: + - '0' + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-lemb + X-Cache: + - Miss from cloudfront + Via: + - 1.1 6faf668782fbb3c2aa466f6fccc76047.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - HIO51-C1 + X-Amz-Cf-Id: + - BF6ljb0_yTCNJXXC1w-LfDFyHbnMc5ylhJLWzofNTtVqMRDo0vmRtw== + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"unknown_method","req_method":"bogus.endpoint"}' + http_version: null + recorded_at: Mon, 16 Mar 2020 03:34:25 GMT +recorded_with: VCR 5.1.0 diff --git a/test/cassettes/post-messages.yml b/test/cassettes/post-messages.yml new file mode 100644 index 00000000..9523d56a --- /dev/null +++ b/test/cassettes/post-messages.yml @@ -0,0 +1,229 @@ +--- +http_interactions: +- request: + method: post + uri: https://slack.com/api/chat.postMessage?channel=CUTE4M96W&text=Hey%20I%20can%20post%20messages!&token= + body: + encoding: UTF-8 + 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: + - '330' + Connection: + - keep-alive + Date: + - Tue, 24 Mar 2020 03:49:30 GMT + Server: + - Apache + X-Slack-Req-Id: + - 136be28e56e8134b14cf679b0ce71278 + X-Oauth-Scopes: + - chat:write,channels:read,users:read + X-Accepted-Oauth-Scopes: + - chat:write + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Slack-Backend: + - h + 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' + Vary: + - Accept-Encoding + Pragma: + - no-cache + 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 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-4pwe + X-Cache: + - Miss from cloudfront + Via: + - 1.1 72b77c557ac4c265c32d99bdef4e9d6a.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - IAD79-C3 + X-Amz-Cf-Id: + - mFF4H1KNEaXgOCsomXykFNsI0ktm1_OGbbQBqOOFYoG4XRIzD-Driw== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channel":"CUTE4M96W","ts":"1585021770.000100","message":{"bot_id":"BV7FDL9LL","type":"message","text":"Hey + I can post messages!","user":"UVA5KE0H4","ts":"1585021770.000100","team":"TV83W4WBZ","bot_profile":{"id":"BV7FDL9LL","deleted":false,"name":"Yesenia + App","updated":1583943022,"app_id":"AUV59CB7U","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":"TV83W4WBZ"}}}' + http_version: null + recorded_at: Tue, 24 Mar 2020 03:49:30 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage?channel=CHAT1234&text=Hey%20I%20can%20post%20messages!&token= + body: + encoding: UTF-8 + 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: + - '60' + Connection: + - keep-alive + Date: + - Tue, 24 Mar 2020 04:41:14 GMT + Server: + - Apache + X-Slack-Req-Id: + - d101672e7d5ef874fb74ac3e941ced7d + X-Oauth-Scopes: + - chat:write,channels:read,users:read + X-Accepted-Oauth-Scopes: + - chat:write + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Slack-Backend: + - h + 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' + Vary: + - Accept-Encoding + Pragma: + - no-cache + 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 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-hnt8 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 1f2a017323162153f3cbc068c08d683d.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - LAX50-C2 + X-Amz-Cf-Id: + - oRqWWAM1OGNtdkNjG0HaA4JevyTdfjup8loxpgLjtJtXAx6_W3f6xw== + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"channel_not_found"}' + http_version: null + recorded_at: Tue, 24 Mar 2020 04:41:14 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage?channel=CUTE4MTD0&text=heeeey%20everyone!%20:)&token= + body: + encoding: UTF-8 + 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: + - '328' + Connection: + - keep-alive + Date: + - Tue, 24 Mar 2020 04:50:09 GMT + Server: + - Apache + X-Slack-Req-Id: + - f20ed718473fbf2796e9c20b796344ce + X-Oauth-Scopes: + - chat:write,channels:read,users:read + X-Accepted-Oauth-Scopes: + - chat:write + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Slack-Backend: + - h + 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' + Vary: + - Accept-Encoding + Pragma: + - no-cache + 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 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-o4r2 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 4c7fd3c8d1d5afb1ce8ed03385580c2e.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - HIO50-C2 + X-Amz-Cf-Id: + - vadnCmLmapqRjqpgU_tH2c-1WKyEoTc-fctGnDCBaBRhpLvOHh50Tw== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channel":"CUTE4MTD0","ts":"1585025409.000500","message":{"bot_id":"BV7FDL9LL","type":"message","text":"heeeey + everyone! :)","user":"UVA5KE0H4","ts":"1585025409.000500","team":"TV83W4WBZ","bot_profile":{"id":"BV7FDL9LL","deleted":false,"name":"Yesenia + App","updated":1583943022,"app_id":"AUV59CB7U","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":"TV83W4WBZ"}}}' + http_version: null + recorded_at: Tue, 24 Mar 2020 04:50:09 GMT +recorded_with: VCR 5.1.0 diff --git a/test/cassettes/users-list-endpoint.yml b/test/cassettes/users-list-endpoint.yml new file mode 100644 index 00000000..82b268cd --- /dev/null +++ b/test/cassettes/users-list-endpoint.yml @@ -0,0 +1,158 @@ +--- +http_interactions: +- request: + method: get + uri: https://slack.com/api/bogus.endpoint?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: + - '80' + Connection: + - keep-alive + Date: + - Mon, 16 Mar 2020 02:33:58 GMT + Server: + - Apache + 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 + Referrer-Policy: + - no-referrer + X-Slack-Backend: + - h + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 2e7b30fe6247eb1d52b05a85e1eb1622 + X-Xss-Protection: + - '0' + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-qel1 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 b4085435efbe95a420f374958bd145bf.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - FyqFJEw1_elhJwQmSQtzq9TASIWSan6dLFaxe4ybgT0ftkP2PxFyIQ== + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"unknown_method","req_method":"bogus.endpoint"}' + http_version: null + recorded_at: Mon, 16 Mar 2020 02:33:59 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: + - '2096' + Connection: + - keep-alive + Date: + - Mon, 16 Mar 2020 02:33:59 GMT + Server: + - Apache + X-Slack-Req-Id: + - be89b5205c2ba23ec39b9f0e0d148be6 + X-Oauth-Scopes: + - chat:write,channels:read,users:read + X-Accepted-Oauth-Scopes: + - users:read + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Slack-Backend: + - h + 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' + Vary: + - Accept-Encoding + Pragma: + - no-cache + 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 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-9s4u + X-Cache: + - Miss from cloudfront + Via: + - 1.1 6a6653dfb47ccc5082f2a5b9d0d168ce.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - z4o1rpp96EJZGgjapV5J-Y4fWmhFCihUGhSeA-Xpd91d0_CJNX1Naw== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TV83W4WBZ","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":"TV83W4WBZ"},"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":"UUTK13WE6","team_id":"TV83W4WBZ","name":"yesentorres","deleted":false,"color":"674b1b","real_name":"Yesenia + Torres","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Yesenia + Torres","real_name_normalized":"Yesenia Torres","display_name":"Yesenia Torres","display_name_normalized":"Yesenia + Torres","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gb1d9884842a","image_24":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"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":1583878026},{"id":"UUW5E7SF3","team_id":"TV83W4WBZ","name":"norshonda.warren","deleted":false,"color":"4bbe2e","real_name":"SW","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"SW","real_name_normalized":"SW","display_name":"SW","display_name_normalized":"SW","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g33a4a608a6a","image_24":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"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":1583872754},{"id":"UUXS7N05P","team_id":"TV83W4WBZ","name":"space_leah_api_projec","deleted":false,"color":"e96699","real_name":"LeahBot","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"LeahBot","real_name_normalized":"LeahBot","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gd1ee90cd32b","api_app_id":"AUUV0AX99","always_active":false,"bot_id":"BUV5H5PAN","image_24":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"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":1583942929},{"id":"UV5UMJ4F6","team_id":"TV83W4WBZ","name":"leahwhughes","deleted":false,"color":"3c989f","real_name":"Leah + Hughes","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Leah + Hughes","real_name_normalized":"Leah Hughes","display_name":"Leah Hughes","display_name_normalized":"Leah + Hughes","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g05e8a60fb2a","image_24":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"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":1583877799},{"id":"UV68ES05B","team_id":"TV83W4WBZ","name":"rebeccaroach12","deleted":false,"color":"9f69e7","real_name":"Becca + Roach","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Becca + Roach","real_name_normalized":"Becca Roach","display_name":"","display_name_normalized":"","status_text":"zenning + out and drinking tea","status_emoji":":tea:","status_expiration":0,"avatar_hash":"g97b58b9efa0","first_name":"Becca","last_name":"Roach","image_24":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"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":1584211950},{"id":"UV69NCUQY","team_id":"TV83W4WBZ","name":"space_sw_api_project","deleted":false,"color":"e7392d","real_name":"space_sw_api_project","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"space_sw_api_project","real_name_normalized":"space_sw_api_project","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g2695ae5a0c7","api_app_id":"AV5RMRMKN","always_active":false,"bot_id":"BV85N9WNB","first_name":"space_sw_api_project","last_name":"","image_24":"https:\/\/secure.gravatar.com\/avatar\/2695ae5a0c7c91e77bb05f8a437c5380.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\/2695ae5a0c7c91e77bb05f8a437c5380.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\/2695ae5a0c7c91e77bb05f8a437c5380.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\/2695ae5a0c7c91e77bb05f8a437c5380.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\/2695ae5a0c7c91e77bb05f8a437c5380.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\/2695ae5a0c7c91e77bb05f8a437c5380.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"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":1583893274},{"id":"UV8J3KKU5","team_id":"TV83W4WBZ","name":"space_becca_api_testi","deleted":false,"color":"684b6c","real_name":"space_becca_api_testi","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"space_becca_api_testi","real_name_normalized":"space_becca_api_testi","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g1572253725f","api_app_id":"AUX3QTQKD","always_active":false,"bot_id":"BVADJSEHM","first_name":"space_becca_api_testi","last_name":"","image_24":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"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":1583962744},{"id":"UVA5KE0H4","team_id":"TV83W4WBZ","name":"yesenia_app","deleted":false,"color":"e0a729","real_name":"yesenia_app","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"yesenia_app","real_name_normalized":"yesenia_app","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gf34360f759b","api_app_id":"AUV59CB7U","always_active":false,"bot_id":"BV7FDL9LL","image_24":"https:\/\/secure.gravatar.com\/avatar\/f34360f759b97596f887a292520ed479.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\/f34360f759b97596f887a292520ed479.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\/f34360f759b97596f887a292520ed479.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\/f34360f759b97596f887a292520ed479.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\/f34360f759b97596f887a292520ed479.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\/f34360f759b97596f887a292520ed479.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"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":1583943022},{"id":"UVD5RQHB9","team_id":"TV83W4WBZ","name":"yienislackbot","deleted":false,"color":"2b6836","real_name":"yienislackbot","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"yienislackbot","real_name_normalized":"yienislackbot","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g3bf2249fbba","api_app_id":"AVARF5Q20","always_active":false,"bot_id":"BV17DLJ8Z","image_24":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"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":1584049652},{"id":"UVDEMQMV4","team_id":"TV83W4WBZ","name":"yaynee8d","deleted":false,"color":"5b89d5","real_name":"Yieni","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Yieni","real_name_normalized":"Yieni","display_name":"Yieni","display_name_normalized":"Yieni","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g9a1079d7bce","image_24":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"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":1584048223}],"cache_ts":1584326039,"response_metadata":{"next_cursor":""}}' + http_version: null + recorded_at: Mon, 16 Mar 2020 02:33:59 GMT +recorded_with: VCR 5.1.0 diff --git a/test/cassettes/workspace-test.yml b/test/cassettes/workspace-test.yml new file mode 100644 index 00000000..b7a4c1b8 --- /dev/null +++ b/test/cassettes/workspace-test.yml @@ -0,0 +1,175 @@ +--- +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: + - '2096' + Connection: + - keep-alive + Date: + - Mon, 16 Mar 2020 07:57:29 GMT + Server: + - Apache + X-Slack-Req-Id: + - b8e0a4605b1e3fdf4d9a0f760d7a3423 + X-Oauth-Scopes: + - chat:write,channels:read,users:read + X-Accepted-Oauth-Scopes: + - users:read + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Slack-Backend: + - h + 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' + Vary: + - Accept-Encoding + Pragma: + - no-cache + 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 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-4d24 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 e66162aafd55b64ba1478ff7105150fb.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C2 + X-Amz-Cf-Id: + - p-WEzzov2EAygLCT18X3LW6j0B6mnJGhqXGOAxHSQZ3074DXz2OWag== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TV83W4WBZ","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":"TV83W4WBZ"},"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":"UUTK13WE6","team_id":"TV83W4WBZ","name":"yesentorres","deleted":false,"color":"674b1b","real_name":"Yesenia + Torres","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Yesenia + Torres","real_name_normalized":"Yesenia Torres","display_name":"Yesenia Torres","display_name_normalized":"Yesenia + Torres","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gb1d9884842a","image_24":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"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":1583878026},{"id":"UUW5E7SF3","team_id":"TV83W4WBZ","name":"norshonda.warren","deleted":false,"color":"4bbe2e","real_name":"SW","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"SW","real_name_normalized":"SW","display_name":"SW","display_name_normalized":"SW","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g33a4a608a6a","image_24":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"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":1583872754},{"id":"UUXS7N05P","team_id":"TV83W4WBZ","name":"space_leah_api_projec","deleted":false,"color":"e96699","real_name":"LeahBot","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"LeahBot","real_name_normalized":"LeahBot","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gd1ee90cd32b","api_app_id":"AUUV0AX99","always_active":false,"bot_id":"BUV5H5PAN","image_24":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"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":1583942929},{"id":"UV5UMJ4F6","team_id":"TV83W4WBZ","name":"leahwhughes","deleted":false,"color":"3c989f","real_name":"Leah + Hughes","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Leah + Hughes","real_name_normalized":"Leah Hughes","display_name":"Leah Hughes","display_name_normalized":"Leah + Hughes","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g05e8a60fb2a","image_24":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"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":1583877799},{"id":"UV68ES05B","team_id":"TV83W4WBZ","name":"rebeccaroach12","deleted":false,"color":"9f69e7","real_name":"Becca + Roach","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Becca + Roach","real_name_normalized":"Becca Roach","display_name":"","display_name_normalized":"","status_text":"zenning + out and drinking tea","status_emoji":":tea:","status_expiration":0,"avatar_hash":"g97b58b9efa0","first_name":"Becca","last_name":"Roach","image_24":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"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":1584211950},{"id":"UV69NCUQY","team_id":"TV83W4WBZ","name":"space_sw_api_project","deleted":false,"color":"e7392d","real_name":"space_sw_api_project","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"space_sw_api_project","real_name_normalized":"space_sw_api_project","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g2695ae5a0c7","api_app_id":"AV5RMRMKN","always_active":false,"bot_id":"BV85N9WNB","first_name":"space_sw_api_project","last_name":"","image_24":"https:\/\/secure.gravatar.com\/avatar\/2695ae5a0c7c91e77bb05f8a437c5380.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\/2695ae5a0c7c91e77bb05f8a437c5380.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\/2695ae5a0c7c91e77bb05f8a437c5380.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\/2695ae5a0c7c91e77bb05f8a437c5380.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\/2695ae5a0c7c91e77bb05f8a437c5380.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\/2695ae5a0c7c91e77bb05f8a437c5380.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"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":1583893274},{"id":"UV8J3KKU5","team_id":"TV83W4WBZ","name":"space_becca_api_testi","deleted":false,"color":"684b6c","real_name":"space_becca_api_testi","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"space_becca_api_testi","real_name_normalized":"space_becca_api_testi","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g1572253725f","api_app_id":"AUX3QTQKD","always_active":false,"bot_id":"BVADJSEHM","first_name":"space_becca_api_testi","last_name":"","image_24":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"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":1583962744},{"id":"UVA5KE0H4","team_id":"TV83W4WBZ","name":"yesenia_app","deleted":false,"color":"e0a729","real_name":"yesenia_app","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"yesenia_app","real_name_normalized":"yesenia_app","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gf34360f759b","api_app_id":"AUV59CB7U","always_active":false,"bot_id":"BV7FDL9LL","image_24":"https:\/\/secure.gravatar.com\/avatar\/f34360f759b97596f887a292520ed479.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\/f34360f759b97596f887a292520ed479.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\/f34360f759b97596f887a292520ed479.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\/f34360f759b97596f887a292520ed479.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\/f34360f759b97596f887a292520ed479.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\/f34360f759b97596f887a292520ed479.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"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":1583943022},{"id":"UVD5RQHB9","team_id":"TV83W4WBZ","name":"yienislackbot","deleted":false,"color":"2b6836","real_name":"yienislackbot","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"yienislackbot","real_name_normalized":"yienislackbot","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g3bf2249fbba","api_app_id":"AVARF5Q20","always_active":false,"bot_id":"BV17DLJ8Z","image_24":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"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":1584049652},{"id":"UVDEMQMV4","team_id":"TV83W4WBZ","name":"yaynee8d","deleted":false,"color":"5b89d5","real_name":"Yieni","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Yieni","real_name_normalized":"Yieni","display_name":"Yieni","display_name_normalized":"Yieni","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g9a1079d7bce","image_24":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"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":1584048223}],"cache_ts":1584345449,"response_metadata":{"next_cursor":""}}' + http_version: null + recorded_at: Mon, 16 Mar 2020 07:57:29 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: + - '622' + Connection: + - keep-alive + Date: + - Mon, 16 Mar 2020 07:57:29 GMT + Server: + - Apache + X-Slack-Req-Id: + - 27f98c18351115a82cef9b96bc1a6c4c + X-Oauth-Scopes: + - chat:write,channels:read,users:read + X-Accepted-Oauth-Scopes: + - channels:read,groups:read,mpim:read,im:read,read + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Slack-Backend: + - h + 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' + Vary: + - Accept-Encoding + Pragma: + - no-cache + 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 + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-2nvs + X-Cache: + - Miss from cloudfront + Via: + - 1.1 5565a51537c689d1d16f6b4d41f40082.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C2 + X-Amz-Cf-Id: + - yl6GGrtjQfaqecRUEPRwGtCTgxZKztV4eExlQj-i99s58EvZuLIuTQ== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CUTE4M96W","name":"general","is_channel":true,"is_group":false,"is_im":false,"created":1583872630,"is_archived":false,"is_general":true,"unlinked":0,"name_normalized":"general","is_shared":false,"parent_conversation":null,"creator":"UV68ES05B","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV83W4WBZ"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UV68ES05B","last_set":1583872630},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UV68ES05B","last_set":1583872630},"previous_names":[],"num_members":6},{"id":"CUTE4MTD0","name":"api-testing","is_channel":true,"is_group":false,"is_im":false,"created":1583872631,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"api-testing","is_shared":false,"parent_conversation":null,"creator":"UV68ES05B","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV83W4WBZ"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"For + covid testing","creator":"UV68ES05B","last_set":1583958329},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":6},{"id":"CV83W5SS3","name":"random","is_channel":true,"is_group":false,"is_im":false,"created":1583872630,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"random","is_shared":false,"parent_conversation":null,"creator":"UV68ES05B","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV83W4WBZ"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UV68ES05B","last_set":1583872630},"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":"UV68ES05B","last_set":1583872630},"previous_names":[],"num_members":6}],"response_metadata":{"next_cursor":""}}' + http_version: null + recorded_at: Mon, 16 Mar 2020 07:57:29 GMT +recorded_with: VCR 5.1.0 diff --git a/test/channel_test.rb b/test/channel_test.rb new file mode 100644 index 00000000..0a3d96a8 --- /dev/null +++ b/test/channel_test.rb @@ -0,0 +1,50 @@ +require_relative "test_helper" +require_relative "../lib/channel" + +describe "Channel" do + describe "initialize" do + before do + VCR.use_cassette("channels-list-endpoint") do + @test_channel = Channel.new(topic: "talk about stuffs", member_count: 2, name: "meaningless-chatter", slack_id:"CHAT1234") + end + end + + it "creates an instance of a Channel object with string & int keywords" do + expect(@test_channel).must_be_kind_of Channel + end + end + + describe "self.get" do # inherited from recipient + it "gets a list of channels" do + result = {} + VCR.use_cassette("channels-list-endpoint") do + result = Channel.get("https://slack.com/api/conversations.list") + end + + expect(result).must_be_kind_of HTTParty::Response + expect(result["ok"]).must_equal true # ensure its not a false positive response + end + + it "raises an error when a call fails" do + VCR.use_cassette("channels-list-endpoint") do + expect{ Channel.get("https://slack.com/api/bogus.endpoint") }.must_raise SlackAPIError + end + end + end + + describe "self.list" do + it "returns a valid list of channels" do + result = [] + + VCR.use_cassette("channels-list-endpoint") do + result = Channel.list_all + end + + expect(result).must_be_kind_of Array + expect(result.length).must_be :>, 0 + result.each do |channel| + expect(channel).must_be_kind_of Channel + end + end + end +end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index 1fcf2bab..32e82ebe 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -8,7 +8,9 @@ require 'minitest/reporters' require 'minitest/skip_dsl' require 'vcr' +require 'dotenv' +Dotenv.load Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new VCR.configure do |config| @@ -24,6 +26,8 @@ :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. - + # get bot token + config.filter_sensitive_data("") do + ENV['BOT_TOKEN'] + end end diff --git a/test/user_test.rb b/test/user_test.rb new file mode 100644 index 00000000..8657cc26 --- /dev/null +++ b/test/user_test.rb @@ -0,0 +1,50 @@ +require_relative "test_helper" +require_relative "../lib/user" + +describe "User" do + describe "initialize" do + before do + VCR.use_cassette("users-list-endpoint") do + @test_user = User.new(real_name: "Hugo", status_text: "WFH", status_emoji: "", name: "hugo95", slack_id:"1234HUGO") + end + end + + it "creates an instance of a User object with all string keywords" do + expect(@test_user).must_be_kind_of User + end + end + + describe "self.get" do # inherited from recipient + it "gets a list of users" do + result = {} + VCR.use_cassette("users-list-endpoint") do + result = User.get("https://slack.com/api/users.list") + end + + expect(result).must_be_kind_of HTTParty::Response + expect(result["ok"]).must_equal true # ensure its not a false positive response + end + + it "raises an error when a call fails" do + VCR.use_cassette("users-list-endpoint") do + expect{ User.get("https://slack.com/api/bogus.endpoint") }.must_raise SlackAPIError + end + end + end + + describe "self.list" do + it "returns a valid list of users" do + result = [] + + VCR.use_cassette("users-list-endpoint") do + result = User.list_all + end + + expect(result).must_be_kind_of Array + expect(result.length).must_be :>, 0 + result.each do |user| + expect(user).must_be_kind_of User + 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..dccd5e73 --- /dev/null +++ b/test/workspace_test.rb @@ -0,0 +1,136 @@ +require_relative "test_helper" +require_relative "../lib/workspace" + +describe "Workspace" do + before do + VCR.use_cassette("workspace-test") do + @test_workspace = Workspace.new() + end + end + + describe "initialize" do + it "creates an instance of a Workspace object" do + expect(@test_workspace).must_be_kind_of Workspace + end + + it "creates an array of User objects" do + expect(@test_workspace.users).must_be_kind_of Array + expect(@test_workspace.users.length).must_equal 11 # Assumption: This workspace will not have any more users created + end + + it "creates an array of Channel objects" do + expect(@test_workspace.channels).must_be_kind_of Array + end + end + + describe "select_user(requested_user)" do + before do + VCR.use_cassette("workspace-test") do + @test_workspace = Workspace.new() + end + end + + it "returns user's name associated with requested username" do + requested_user = "yesentorres" + associated_user = @test_workspace.users.find { |user| user.name == requested_user } + output = @test_workspace.select_user(requested_user) + expect(output).must_equal "User \"#{associated_user.real_name}\" has been selected." + end + + it "returns user's name associated with requested user slack id" do + requested_user= "UUTK13WE6" + associated_user = @test_workspace.users.find { |user| user.slack_id == requested_user } + output = @test_workspace.select_user(requested_user) + expect(output).must_equal "User \"#{associated_user.real_name}\" has been selected." + end + + it "returns a message if no user is found" do + requested_user = "doesnotexist" + output = @test_workspace.select_user(requested_user) + expect(output).must_equal "Sorry, user \"#{requested_user}\" does not exist in this workspace." + end + end + + describe "select_channel(requested_channel)" do + before do + VCR.use_cassette("workspace-test") do + @test_workspace = Workspace.new() + end + end + + it "returns channel name that matches requested channel name" do + requested_channel = "general" + output = @test_workspace.select_channel(requested_channel) + expect(output).must_equal "Channel titled \"#{requested_channel}\" has been selected." + end + + it "returns channel name associated with requested channel slack id" do + requested_channel = "CUTE4M96W" + associated_channel = @test_workspace.channels.find { |channel| channel.slack_id == requested_channel } + output = @test_workspace.select_channel(requested_channel) + expect(output).must_equal "Channel titled \"#{associated_channel.name}\" has been selected." + end + + it "returns a message if no channel name is found" do + requested_channel = "doesnotexist" + output = @test_workspace.select_channel(requested_channel) + expect(output).must_equal "Sorry, channel \"#{requested_channel}\" does not exist in this workspace." + end + end + + xdescribe "display_details" do + # TODO: write tests for this method + # i was unsure how to verify command line output + end + + describe "send_message" do + it "can send a valid message" do + # arrange + VCR.use_cassette("workspace-test") do + @test_workspace = Workspace.new() + @test_workspace.select_channel("general") + @selected_channel = @test_workspace.selected + end + result = {} + + # act + VCR.use_cassette("post-messages") do + result = @selected_channel.send_message("Hey I can post messages!") + end + + # assert + expect(result).must_be_kind_of HTTParty::Response + expect(result["ok"]).must_equal true + end + + it "raises an error if no recipient is selected" do + # arrange + @selected_channel = Channel.new(topic: "channel does not exist", member_count: 1, name: "bogus", slack_id:"CHAT1234") + + # act / assert + result = {} + VCR.use_cassette("post-messages") do + expect {@selected_channel.send_message("Hey I can post messages!")}.must_raise SlackAPIError + end + end + + it "sends the correct message to the correct channel" do + # arrange + VCR.use_cassette("workspace-test") do + @test_workspace = Workspace.new() + @test_workspace.select_channel("CUTE4MTD0") # "api-testing" + @selected_channel = @test_workspace.selected + end + result = {} + + # act + VCR.use_cassette("post-messages") do + result = @selected_channel.send_message("heeeey everyone! :)") + end + + # assert + expect(result["channel"]).must_equal "CUTE4MTD0" + expect(result["message"]["text"]).must_equal "heeeey everyone! :)" + end + end +end \ No newline at end of file