From ae2a852d963f90a4dc7020e6dc53ea7f0a424afa Mon Sep 17 00:00:00 2001 From: Antonia Date: Sat, 28 Mar 2020 11:28:21 -0700 Subject: [PATCH] completed through wave 3 --- lib/channel.rb | 32 +++ lib/recipient.rb | 40 +++ lib/slack.rb | 61 ++++- lib/user.rb | 33 +++ lib/workspace.rb | 29 +++ test/cassettes/channel-list-endpoint.yml | 147 +++++++++++ test/cassettes/user-list-endpoint.yml | 67 +++++ test/cassettes/users-list-endpoint.yml | 82 ++++++ test/cassettes/workspace_endpoint.yml | 312 +++++++++++++++++++++++ test/channel_test.rb | 46 ++++ test/recipient_test.rb | 0 test/test_helper.rb | 10 +- test/user_test.rb | 57 +++++ test/workspace_test.rb | 61 +++++ 14 files changed, 972 insertions(+), 5 deletions(-) create mode 100644 lib/channel.rb create mode 100644 lib/recipient.rb create mode 100644 lib/user.rb create mode 100644 lib/workspace.rb create mode 100644 test/cassettes/channel-list-endpoint.yml create mode 100644 test/cassettes/user-list-endpoint.yml create mode 100644 test/cassettes/users-list-endpoint.yml create mode 100644 test/cassettes/workspace_endpoint.yml create mode 100644 test/channel_test.rb create mode 100644 test/recipient_test.rb create mode 100644 test/user_test.rb create mode 100644 test/workspace_test.rb diff --git a/lib/channel.rb b/lib/channel.rb new file mode 100644 index 00000000..11ffbe76 --- /dev/null +++ b/lib/channel.rb @@ -0,0 +1,32 @@ +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 + + def details + return details = "Slack ID: #{self.slack_id}, Name: #{self.name}, Topic: #{self.topic}, Member Count: #{self.member_count}" + end + + def self.list_all + + data = self.get("https://slack.com/api/conversations.list") + + channels = [] + + data["channels"].each do |item| + channels << Channel.new( + name: item["name"], + slack_id: item["id"], + topic: item["topic"]["value"], + member_count: item["num_members"] + ) + end + + return channels + end +end \ No newline at end of file diff --git a/lib/recipient.rb b/lib/recipient.rb new file mode 100644 index 00000000..8b468af1 --- /dev/null +++ b/lib/recipient.rb @@ -0,0 +1,40 @@ +require 'httparty' + +class Recipient + + attr_reader :slack_id, :name + + def initialize(slack_id:, name:) + @slack_id = slack_id + @name = name + end + + def send_message(message) + #send message using HTTParty + response = HTTParty.post("https://slack.com/api/chat.postMessage", body: {token: ENV['SLACK_TOKEN'], text: message, channel: @slack_id}) + if response.code != 200 || response['ok'] == false + raise SlackAPIError + end + + return true + + end + + def self.get(url) + response = HTTParty.get(url, query: {token: ENV['SLACK_TOKEN']}) + if response.code != 200 || response['ok'] == false + raise SlackAPIError + end + + return response + + end + + # def self.list_all + # end + + +end + +class SlackAPIError < Exception +end \ No newline at end of file diff --git a/lib/slack.rb b/lib/slack.rb index 8a0b659b..d1044243 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -1,12 +1,67 @@ #!/usr/bin/env ruby +require 'dotenv' +require 'httparty' +require 'table_print' + +require_relative 'workspace' + +#try to place dotenv.load on first file that loads +Dotenv.load def main puts "Welcome to the Ada Slack CLI!" workspace = Workspace.new - + input = nil # TODO project - - puts "Thank you for using the Ada Slack CLI" + until input == 'quit' + puts "\n What would you like to do? Choose one of the following numbers:" + puts "\n 1. List channels \n 2. List users \n 3. Select Channel \n 4. Select User \n 5. Get details \n 6. Send message" + puts "\n Or type QUIT to exit" + + input = gets.chomp + begin + case input + when "1" + tp workspace.channels, "slack_id", "name", "member_count", "topic" + when "2" + tp workspace.users, "slack_id", "name", "real_name", "status_text", "status_emoji" + when "3" + selected_channel = nil + # selected_channel = workspace.select_channel + while selected_channel.nil? + puts "Please enter a channel name or ID" + input = gets.chomp + selected_channel = workspace.select_channel(input) + end + + when "4" + selected_user = nil + while selected_user.nil? + puts "\nPlease enter a user name or ID" + input = gets.chomp + selected_user = workspace.select_user(input) + end + when "5" + if workspace.selected.nil? + puts "\nPlease select a channel or user to view their details!" + else + puts workspace.show_details + + end + when "6" + if workspace.selected.nil? + puts "\nPlease select a channel or user to send a message to! Or enter QUIT to exit" + else + puts "\nPlease enter your message" + message = gets.chomp + workspace.selected.send_message(message) + end + when "quit" || "QUIT" || "Quit" + + puts "Thank you for using the Ada Slack CLI" + end + end + end 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..0c09cb73 --- /dev/null +++ b/lib/user.rb @@ -0,0 +1,33 @@ +require_relative 'recipient' + +class User < Recipient + attr_reader :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 + + def details + return details = "Slack ID: #{self.slack_id}, Name: #{self.name}, Real Name: #{self.real_name}, Status Text: #{self.status_text}, Status Emoji: #{self.status_emoji}" +end + + def self.list_all + #get the data + data = self.get("https://slack.com/api/users.list") + users = [] + data["members"].each do |user| + users << 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 users + end +end \ No newline at end of file diff --git a/lib/workspace.rb b/lib/workspace.rb new file mode 100644 index 00000000..edfb2810 --- /dev/null +++ b/lib/workspace.rb @@ -0,0 +1,29 @@ +require_relative 'user' +require_relative 'channel' +require_relative 'recipient' + +class Workspace + attr_reader :users, :channels, :selected + + def initialize + @users = User.list_all + @channels = Channel.list_all + @selected = nil + end + + def select_channel(input) + @selected = @channels.find { |channel| channel.name == input.downcase || channel.slack_id == input.upcase} + end + + def select_user(input) + @selected = @users.find { |user| user.name == input.downcase || user.slack_id == input.upcase} + end + + def show_details + return @selected.details + end + + def send_message(message) + return @selected.send_message(message) + end +end \ No newline at end of file diff --git a/test/cassettes/channel-list-endpoint.yml b/test/cassettes/channel-list-endpoint.yml new file mode 100644 index 00000000..7505cfe8 --- /dev/null +++ b/test/cassettes/channel-list-endpoint.yml @@ -0,0 +1,147 @@ +--- +http_interactions: +- request: + method: get + uri: https://slack.com/api/bogus.call?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: + - '76' + Connection: + - keep-alive + Date: + - Sat, 28 Mar 2020 14:54:49 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: + - 55a09595dcf746f4da06efe47cc33ebf + X-Xss-Protection: + - '0' + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-9hkc + X-Cache: + - Miss from cloudfront + Via: + - 1.1 b4085435efbe95a420f374958bd145bf.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - HQoaRAIYbwzrXU_VtKr43kKbkRaNh1vqcFtIrGSv5oW7Z--yc5Nv1w== + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"unknown_method","req_method":"bogus.call"}' + http_version: null + recorded_at: Sat, 28 Mar 2020 14:54:49 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: + - '613' + Connection: + - keep-alive + Date: + - Sat, 28 Mar 2020 14:54:49 GMT + Server: + - Apache + X-Slack-Req-Id: + - 9b9a1ad86daa3b778fd5a30d1c51c1e2 + X-Oauth-Scopes: + - chat:write,channels:read,users:read,chat:write.public + 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-nv5l + X-Cache: + - Miss from cloudfront + Via: + - 1.1 b838ef1ff22a4a994af82d5178c30e1d.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - bCJkuZqb2ih9AMgpLZgY38U3gAubfto0e61kC0KRK4oYEort3PQcWA== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CV4BEHPCK","name":"slackcli-stuff","is_channel":true,"is_group":false,"is_im":false,"created":1584333898,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"slackcli-stuff","is_shared":false,"parent_conversation":null,"creator":"U0101R6DJN4","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV3215G10"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":3},{"id":"C0101BT4820","name":"general","is_channel":true,"is_group":false,"is_im":false,"created":1584333898,"is_archived":false,"is_general":true,"unlinked":0,"name_normalized":"general","is_shared":false,"parent_conversation":null,"creator":"U0101R6DJN4","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV3215G10"],"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":"U0101R6DJN4","last_set":1584333898},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"U0101R6DJN4","last_set":1584333898},"previous_names":[],"num_members":3},{"id":"C0101RR2QBF","name":"random","is_channel":true,"is_group":false,"is_im":false,"created":1584333898,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"random","is_shared":false,"parent_conversation":null,"creator":"U0101R6DJN4","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV3215G10"],"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":"U0101R6DJN4","last_set":1584333898},"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":"U0101R6DJN4","last_set":1584333898},"previous_names":[],"num_members":3}],"response_metadata":{"next_cursor":""}}' + http_version: null + recorded_at: Sat, 28 Mar 2020 14:54:49 GMT +recorded_with: VCR 5.1.0 diff --git a/test/cassettes/user-list-endpoint.yml b/test/cassettes/user-list-endpoint.yml new file mode 100644 index 00000000..63a1a461 --- /dev/null +++ b/test/cassettes/user-list-endpoint.yml @@ -0,0 +1,67 @@ +--- +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: + - Sat, 28 Mar 2020 14:54:49 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: + - 196639a7c358d19dcef733bad9b0178b + X-Xss-Protection: + - '0' + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-je5i + X-Cache: + - Miss from cloudfront + Via: + - 1.1 599f04a365a179d553682d476509c389.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - prUjCngdSDDmJ_-nv9gDJSBdsWh7o9a6uXhXaaRuwnknOYbol6BU3w== + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"unknown_method","req_method":"bogus.endpoint"}' + http_version: null + recorded_at: Sat, 28 Mar 2020 14:54:49 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..379e903a --- /dev/null +++ b/test/cassettes/users-list-endpoint.yml @@ -0,0 +1,82 @@ +--- +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: + - '1204' + Connection: + - keep-alive + Date: + - Sat, 28 Mar 2020 14:54:49 GMT + Server: + - Apache + X-Slack-Req-Id: + - 3b965bc0bb8d1a3d43b945f2a2f1c06d + X-Oauth-Scopes: + - chat:write,channels:read,users:read,chat:write.public + 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-y98o + X-Cache: + - Miss from cloudfront + Via: + - 1.1 786d821259e050ebca76b8e357819f78.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - hhV4x4SglujvTZ2Nf2lQS55wC16E9wHUxWSJQE7a5T5elDPhjv67wA== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TV3215G10","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":"TV3215G10"},"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":"UV321K2CA","team_id":"TV3215G10","name":"antoniacirizarry","deleted":false,"color":"e7392d","real_name":"antoniacirizarry","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"antoniacirizarry","real_name_normalized":"antoniacirizarry","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g3f6b768bf68","image_24":"https:\/\/secure.gravatar.com\/avatar\/3f6b768bf68871cc366e791028a97bf5.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/3f6b768bf68871cc366e791028a97bf5.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/3f6b768bf68871cc366e791028a97bf5.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/3f6b768bf68871cc366e791028a97bf5.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/3f6b768bf68871cc366e791028a97bf5.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/3f6b768bf68871cc366e791028a97bf5.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-512.png","status_text_canonical":"","team":"TV3215G10"},"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":1584333929,"is_invited_user":true},{"id":"U0101R6DJN4","team_id":"TV3215G10","name":"acirizarry","deleted":false,"color":"9f69e7","real_name":"acirizarry","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"acirizarry","real_name_normalized":"acirizarry","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g1d52593258f","image_24":"https:\/\/secure.gravatar.com\/avatar\/1d52593258f3269ce7df6f47eede3926.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0024-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/1d52593258f3269ce7df6f47eede3926.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0024-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/1d52593258f3269ce7df6f47eede3926.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0024-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/1d52593258f3269ce7df6f47eede3926.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0024-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/1d52593258f3269ce7df6f47eede3926.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0024-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/1d52593258f3269ce7df6f47eede3926.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0024-512.png","status_text_canonical":"","team":"TV3215G10"},"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":1584333897},{"id":"U01041Z3AF8","team_id":"TV3215G10","name":"antonianomamiukor","deleted":false,"color":"4bbe2e","real_name":"Flantonia","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Flantonia","real_name_normalized":"Flantonia","display_name":"Flantonia","display_name_normalized":"Flantonia","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"ge5b8684a299","image_24":"https:\/\/secure.gravatar.com\/avatar\/e5b8684a299904a5d154dffb08e8bab0.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0009-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/e5b8684a299904a5d154dffb08e8bab0.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0009-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/e5b8684a299904a5d154dffb08e8bab0.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0009-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/e5b8684a299904a5d154dffb08e8bab0.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0009-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/e5b8684a299904a5d154dffb08e8bab0.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0009-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/e5b8684a299904a5d154dffb08e8bab0.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0009-512.png","status_text_canonical":"","team":"TV3215G10"},"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":1584334007},{"id":"U01066KJS3H","team_id":"TV3215G10","name":"space_antonia_slack_c","deleted":false,"color":"3c989f","real_name":"space_antonia_slack_c","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"space_antonia_slack_c","real_name_normalized":"space_antonia_slack_c","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g5c578c48c2e","api_app_id":"AV5GFATDY","always_active":true,"bot_id":"BV5GUR0LA","first_name":"space_antonia_slack_c","last_name":"","image_24":"https:\/\/secure.gravatar.com\/avatar\/5c578c48c2e1d6719a78fcb93e71e159.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\/5c578c48c2e1d6719a78fcb93e71e159.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\/5c578c48c2e1d6719a78fcb93e71e159.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\/5c578c48c2e1d6719a78fcb93e71e159.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\/5c578c48c2e1d6719a78fcb93e71e159.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\/5c578c48c2e1d6719a78fcb93e71e159.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-512.png","status_text_canonical":"","team":"TV3215G10"},"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":1585171050}],"cache_ts":1585407289,"response_metadata":{"next_cursor":""}}' + http_version: null + recorded_at: Sat, 28 Mar 2020 14:54:50 GMT +recorded_with: VCR 5.1.0 diff --git a/test/cassettes/workspace_endpoint.yml b/test/cassettes/workspace_endpoint.yml new file mode 100644 index 00000000..ccf327aa --- /dev/null +++ b/test/cassettes/workspace_endpoint.yml @@ -0,0 +1,312 @@ +--- +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: + - '1204' + Connection: + - keep-alive + Date: + - Sat, 28 Mar 2020 14:54:48 GMT + Server: + - Apache + X-Slack-Req-Id: + - 5c8bd42579710daf0bff4cd8d53caba3 + X-Oauth-Scopes: + - chat:write,channels:read,users:read,chat:write.public + 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-nhgw + X-Cache: + - Miss from cloudfront + Via: + - 1.1 aa623e134417515bd2496cb01d5e5626.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - lIpUPgwxmCLAZhEIjaXNXHYkkgNfRJRvg1GWXO11E5qIcwODJLOMvg== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TV3215G10","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":"TV3215G10"},"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":"UV321K2CA","team_id":"TV3215G10","name":"antoniacirizarry","deleted":false,"color":"e7392d","real_name":"antoniacirizarry","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"antoniacirizarry","real_name_normalized":"antoniacirizarry","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g3f6b768bf68","image_24":"https:\/\/secure.gravatar.com\/avatar\/3f6b768bf68871cc366e791028a97bf5.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/3f6b768bf68871cc366e791028a97bf5.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/3f6b768bf68871cc366e791028a97bf5.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/3f6b768bf68871cc366e791028a97bf5.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/3f6b768bf68871cc366e791028a97bf5.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/3f6b768bf68871cc366e791028a97bf5.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-512.png","status_text_canonical":"","team":"TV3215G10"},"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":1584333929,"is_invited_user":true},{"id":"U0101R6DJN4","team_id":"TV3215G10","name":"acirizarry","deleted":false,"color":"9f69e7","real_name":"acirizarry","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"acirizarry","real_name_normalized":"acirizarry","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g1d52593258f","image_24":"https:\/\/secure.gravatar.com\/avatar\/1d52593258f3269ce7df6f47eede3926.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0024-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/1d52593258f3269ce7df6f47eede3926.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0024-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/1d52593258f3269ce7df6f47eede3926.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0024-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/1d52593258f3269ce7df6f47eede3926.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0024-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/1d52593258f3269ce7df6f47eede3926.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0024-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/1d52593258f3269ce7df6f47eede3926.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0024-512.png","status_text_canonical":"","team":"TV3215G10"},"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":1584333897},{"id":"U01041Z3AF8","team_id":"TV3215G10","name":"antonianomamiukor","deleted":false,"color":"4bbe2e","real_name":"Flantonia","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Flantonia","real_name_normalized":"Flantonia","display_name":"Flantonia","display_name_normalized":"Flantonia","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"ge5b8684a299","image_24":"https:\/\/secure.gravatar.com\/avatar\/e5b8684a299904a5d154dffb08e8bab0.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0009-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/e5b8684a299904a5d154dffb08e8bab0.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0009-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/e5b8684a299904a5d154dffb08e8bab0.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0009-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/e5b8684a299904a5d154dffb08e8bab0.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0009-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/e5b8684a299904a5d154dffb08e8bab0.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0009-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/e5b8684a299904a5d154dffb08e8bab0.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0009-512.png","status_text_canonical":"","team":"TV3215G10"},"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":1584334007},{"id":"U01066KJS3H","team_id":"TV3215G10","name":"space_antonia_slack_c","deleted":false,"color":"3c989f","real_name":"space_antonia_slack_c","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"space_antonia_slack_c","real_name_normalized":"space_antonia_slack_c","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g5c578c48c2e","api_app_id":"AV5GFATDY","always_active":true,"bot_id":"BV5GUR0LA","first_name":"space_antonia_slack_c","last_name":"","image_24":"https:\/\/secure.gravatar.com\/avatar\/5c578c48c2e1d6719a78fcb93e71e159.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\/5c578c48c2e1d6719a78fcb93e71e159.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\/5c578c48c2e1d6719a78fcb93e71e159.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\/5c578c48c2e1d6719a78fcb93e71e159.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\/5c578c48c2e1d6719a78fcb93e71e159.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\/5c578c48c2e1d6719a78fcb93e71e159.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-512.png","status_text_canonical":"","team":"TV3215G10"},"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":1585171050}],"cache_ts":1585407288,"response_metadata":{"next_cursor":""}}' + http_version: null + recorded_at: Sat, 28 Mar 2020 14:54:48 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: + - '613' + Connection: + - keep-alive + Date: + - Sat, 28 Mar 2020 14:54:48 GMT + Server: + - Apache + X-Slack-Req-Id: + - 3cb773901d5dcf5a27c273c55744720f + X-Oauth-Scopes: + - chat:write,channels:read,users:read,chat:write.public + 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-5fln + X-Cache: + - Miss from cloudfront + Via: + - 1.1 2241406ac19fffc8f35d6ddef8e22f56.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - gCmUn7S05QOHSA7akN0GG_RJ5DgwAyIFHX0upPbcnDb-5Qn68o3WXw== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CV4BEHPCK","name":"slackcli-stuff","is_channel":true,"is_group":false,"is_im":false,"created":1584333898,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"slackcli-stuff","is_shared":false,"parent_conversation":null,"creator":"U0101R6DJN4","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV3215G10"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":3},{"id":"C0101BT4820","name":"general","is_channel":true,"is_group":false,"is_im":false,"created":1584333898,"is_archived":false,"is_general":true,"unlinked":0,"name_normalized":"general","is_shared":false,"parent_conversation":null,"creator":"U0101R6DJN4","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV3215G10"],"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":"U0101R6DJN4","last_set":1584333898},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"U0101R6DJN4","last_set":1584333898},"previous_names":[],"num_members":3},{"id":"C0101RR2QBF","name":"random","is_channel":true,"is_group":false,"is_im":false,"created":1584333898,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"random","is_shared":false,"parent_conversation":null,"creator":"U0101R6DJN4","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV3215G10"],"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":"U0101R6DJN4","last_set":1584333898},"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":"U0101R6DJN4","last_set":1584333898},"previous_names":[],"num_members":3}],"response_metadata":{"next_cursor":""}}' + http_version: null + recorded_at: Sat, 28 Mar 2020 14:54:48 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&text=Message&channel=USLACKBOT + 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: + - '329' + Connection: + - keep-alive + Date: + - Sat, 28 Mar 2020 14:54:49 GMT + Server: + - Apache + X-Slack-Req-Id: + - e0f581a6588a1797ca57dde98abd1071 + X-Oauth-Scopes: + - chat:write,channels:read,users:read,chat:write.public + 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-eidd + X-Cache: + - Miss from cloudfront + Via: + - 1.1 e9f9d4725d6328edca783d6dff756da8.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - hcdgecov2j9RT60Jugjmq2X1QPPGiIyXf6_DZJc8Ar3pOwdk2hcXMg== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channel":"D0104B4FKEZ","ts":"1585407289.000100","message":{"bot_id":"BV5GUR0LA","type":"message","text":"Message","user":"U01066KJS3H","ts":"1585407289.000100","team":"TV3215G10","bot_profile":{"id":"BV5GUR0LA","deleted":false,"name":"Space + - Antonia - Slack CLI","updated":1584400857,"app_id":"AV5GFATDY","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":"TV3215G10"}}}' + http_version: null + recorded_at: Sat, 28 Mar 2020 14:54:49 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&text=Message&channel=C0101RR2QBF + 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: + - Sat, 28 Mar 2020 14:54:49 GMT + Server: + - Apache + X-Slack-Req-Id: + - 6f32b8ff51a05219f7d7b1e0d727d781 + X-Oauth-Scopes: + - chat:write,channels:read,users:read,chat:write.public + X-Accepted-Oauth-Scopes: + - chat:write + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + 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' + 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-gf66 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 6b03f32d70ff9f666371f69d2672d273.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - 3RQOD-j_xgQMeAlFxt4d4dlE-Ar7pgUa1qhx7KiLAwoYak-zzacIZA== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channel":"C0101RR2QBF","ts":"1585407289.000100","message":{"bot_id":"BV5GUR0LA","type":"message","text":"Message","user":"U01066KJS3H","ts":"1585407289.000100","team":"TV3215G10","bot_profile":{"id":"BV5GUR0LA","deleted":false,"name":"Space + - Antonia - Slack CLI","updated":1584400857,"app_id":"AV5GFATDY","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":"TV3215G10"}}}' + http_version: null + recorded_at: Sat, 28 Mar 2020 14:54:49 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..fdc54f8f --- /dev/null +++ b/test/channel_test.rb @@ -0,0 +1,46 @@ +require_relative 'test_helper' +require_relative '../lib/channel' + +describe 'Channel' do + describe 'self.get' do + it 'can get a list of channels' do + result = {} + VCR.use_cassette('channel-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 + end + + describe 'details' do + before do + @channel = Channel.new(slack_id: "C0101BT4820", name: "general", topic: "Company-wide announcements and work-based matters", member_count: 4) + end + it "returns user details" do + expect(@channel.details).must_equal "Slack ID: #{@channel.slack_id}, Name: #{@channel.name}, Topic: #{@channel.topic}, Member Count: #{@channel.member_count}" + end + end + + it 'raises an error when a call fails' do + VCR.use_cassette('channel-list-endpoint') do + expect {Channel.get('https://slack.com/api/bogus.call')}.must_raise SlackAPIError + end + end + end + + describe 'self.list_all' do + it 'returns a list of valid channels' do + result = [] + VCR.use_cassette('channel-list-endpoint') do + result = Channel.list_all + end + expect(result).must_be_kind_of Array + expect(result.length).must_be :>, 0 + result.each do |item| + expect(item).must_be_kind_of Channel + end + + end + end +end \ No newline at end of file diff --git a/test/recipient_test.rb b/test/recipient_test.rb new file mode 100644 index 00000000..e69de29b diff --git a/test/test_helper.rb b/test/test_helper.rb index 1fcf2bab..a68e608d 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -8,6 +8,10 @@ require 'minitest/reporters' require 'minitest/skip_dsl' require 'vcr' +require 'webmock/minitest' +require 'dotenv' + +Dotenv.load Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new @@ -24,6 +28,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. - + # 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..cffb6b73 --- /dev/null +++ b/test/user_test.rb @@ -0,0 +1,57 @@ +require_relative 'test_helper' +require_relative '../lib/user' +####test initialize +describe "User" do + describe "initialize" do + before do + @user = User.new(slack_id: "USLACKBOT", name: "slackbot", real_name: "Slackbot", status_text: "", status_emoji: "") + end + + it "is an instance of User" do + expect(@user).must_be_kind_of User + end + end + describe "details" do + before do + @user = User.new(slack_id: "USLACKBOT", name: "slackbot", real_name: "Slackbot", status_text: "", status_emoji: "") + end + it "returns user details" do + expect(@user.details).must_equal "Slack ID: #{@user.slack_id}, Name: #{@user.name}, Real Name: #{@user.real_name}, Status Text: #{@user.status_text}, Status Emoji: #{@user.status_emoji}" + end +end + + describe "self.get" do + 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 + end + + it "raises an error when a call fails" do + VCR.use_cassette("user-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..8bcb03f3 --- /dev/null +++ b/test/workspace_test.rb @@ -0,0 +1,61 @@ +require_relative 'test_helper' +require_relative '../lib/workspace' + +describe "Workspace" do + before do + @workspace = nil + VCR.use_cassette("workspace_endpoint") do + @workspace = Workspace.new + end + end + describe "initialize" do + it "creates a instance of Workspace" do + # VCR.use_cassette("workspace_endpoint") do + + expect(@workspace).must_be_kind_of Workspace + end + end + + describe "select" do + it "selects a channel" do + @workspace.select_channel('random') + expect(@workspace.selected).must_be_kind_of Channel + end + end + + it "selects a user" do + VCR.use_cassette("workspace_endpoint") do + # @workspace = Workspace.new + @workspace.select_user('USLACKBOT') + expect(@workspace.selected).must_be_kind_of User + end + end + + describe "send message" do + it 'sends message to user' do + VCR.use_cassette('workspace_endpoint') do + # @workspace = Workspace.new + @workspace.select_user('USLACKBOT') + @message = @workspace.send_message('Message') + end + expect(@message).must_equal true + end + + it 'sends message to channel' do + VCR.use_cassette('workspace_endpoint') do + @workspace.select_channel('random') + @message = @workspace.send_message('Message') + end + expect(@message).must_equal true + end + + describe "show details" do + it 'shows details of the user' do + VCR.use_cassette('workspace_endpoint') do + @workspace.select_user('USLACKBOT') + end + expect(@workspace.show_details).must_be_kind_of String + end + end + end +end \ No newline at end of file