diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 00000000..fe6d9068 Binary files /dev/null and b/.DS_Store differ diff --git a/lib/channel.rb b/lib/channel.rb new file mode 100644 index 00000000..f37a8072 --- /dev/null +++ b/lib/channel.rb @@ -0,0 +1,35 @@ +require_relative 'recipient' +require 'httparty' +require 'dotenv' + +Dotenv.load + +module Slack + class Channel < Recipient + BASE_URL = "https://slack.com/api/channels.list" + TOKEN = ENV["SLACK_TOKEN"] + QUERY = { + token: TOKEN + } + attr_reader :id, :name, :topic, :member_count + + def initialize(id, name, topic, member_count) + super(id, name) + @topic = topic + @member_count = member_count + end + end + + def self.list + response = self.get(BASE_URL + "channels.list", query: QUERY) + + channels = response["channels"].map do |channel| + self.new(channel["id"], channel["name"], channel["topic"]["value"], channel["num_members"]) + end + return channels + end + + def details + super.push("topic", "member_count") + end +end \ No newline at end of file diff --git a/lib/recipient.rb b/lib/recipient.rb new file mode 100644 index 00000000..e9f1b414 --- /dev/null +++ b/lib/recipient.rb @@ -0,0 +1,26 @@ +module Slack + class Recipient + URL = "https://slack.com/api/chat.postMessage" + + attr_reader :id, :name + + def initialize(id, name) + @id = id + @name = name + end + + def get(url, query) + return HTTParty.get(url, query) + end + + # ABSTRACT METHODS + def details + raise NotImplementedError, "Implement me in a child class!" + end + + def self.list + raise NotImplementedError, "Implement me in a child class!" + end + end +end + diff --git a/lib/slack.rb b/lib/slack.rb index 960cf2f7..7bd65c38 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -1,11 +1,71 @@ -#!/usr/bin/env ruby +require_relative 'workspace' +require 'table_print' +require 'colorize' def main - puts "Welcome to the Ada Slack CLI!" + workspace = Slack::Workspace.new - # TODO project + command_table = [{command: 'list users', description: 'lists all users'}, {command: 'list channels', description: 'lists all channels'}, {command: 'select user', description: 'selects a user'}, {command: 'select channel', description: 'selects a channel'}, {command: 'details', description: 'shows recipient details'}, {command: 'send message', description: 'sends message to recipient'}] + + puts "Welcome to the Ada Slack CLI!\n\n".colorize(:light_cyan) + + tp command_table + puts "\n\nWhat would you like to do? Enter a command from the list above: ".colorize(:light_cyan) - puts "Thank you for using the Ada Slack CLI" + user_input = "" + + while user_input != "quit" + user_input = gets.chomp + + case user_input + when "list users" + workspace.display_users + + when "list channels" + workspace.display_channels + + when "select user" + puts "Enter the name or slack id of the user: ".colorize(:light_cyan) + user_input = gets.chomp + if workspace.select_user(user_input) == [] + puts "Invalid entry! Please enter another user: ".colorize(:red) + user_input = gets.chomp + end + + when "select channel" + puts "Enter the name or slack id of the channel: ".colorize(:light_cyan) + user_input = gets.chomp + if workspace.select_channel(user_input) == [] + puts "Invalid entry! Please enter another channel: ".colorize(:red) + user_input = gets.chomp + end + + when "details" + if workspace.selected == nil + puts "No recipient selected!".colorize(:red) + else + workspace.show_details + puts "\n\n" + end + + when "send message" + if workspace.selected == nil + puts "No recipient selected!".colorize(:red) + else + puts "What do you want to send to #{workspace.selected[0].name}?" + message = gets.chomp + workspace.send_message(message) + end + + when "quit" + puts "Thank you for using the Ada Slack CLI!".colorize(:light_cyan) + exit + + else + puts "Invalid command!".colorize(:red) + end + puts "Enter another command or type 'quit' to exit the program.".colorize(:light_cyan) + 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..52769c0d --- /dev/null +++ b/lib/user.rb @@ -0,0 +1,37 @@ +require_relative 'recipient' +require 'httparty' +require 'dotenv' + +Dotenv.load + +module Slack + class User < Recipient + BASE_URL = "https://slack.com/api/users.list" + TOKEN = ENV["SLACK_TOKEN"] + + QUERY = { + token: TOKEN} + + attr_reader :id, :name, :real_name + + def initialize(id, name, real_name) + super(id, name) + @real_name = real_name + end + + def self.list + response = self.get(BASE_URL, query: QUERY) + + users = response["members"].map do |member| + self.new(member["id"], member["name"], member["real_name"]) + end + return users + end + + def details + super << "real_name" + end + + end +end + diff --git a/lib/workspace.rb b/lib/workspace.rb new file mode 100644 index 00000000..4c56b2dd --- /dev/null +++ b/lib/workspace.rb @@ -0,0 +1,57 @@ +require_relative 'user' +require_relative 'channel' +require_relative 'recipient' +require 'httparty' +require 'dotenv' + +Dotenv.load + +module Slack + class Workspace < Recipient + BASE_URL = "https://slack.com/api/" + TOKEN = ENV["SLACK_TOKEN"] + QUERY = { + token: TOKEN + } + + attr_reader :users, :channels + attr_accessor :selected + + def initialize + @users = User.list + @channels = Channel.list + @selected = nil + end + + def display_users + tp @users, :id, :name, :real_name + puts "\n\n" + end + + def display_channels + tp @channels, :id, :name, :topic, :member_count + puts "\n\n" + end + + def select_user(user_input) + @selected = users.select { |user| user.name == user_input || user.id == user_input } + end + + def select_channel(user_input) + @selected = channels.select { |channel| channel.name == user_input || channel.id == user_input } + end + + def show_details + tp @selected + end + + def send_message(message) + post_query = { + token: TOKEN, + channel: @selected[0].id, + text: message + } + HTTParty.post(BASE_URL + "chat.postMessage", query: post_query) + end + end +end \ No newline at end of file diff --git a/test/cassettes/channel_instantiation.yml b/test/cassettes/channel_instantiation.yml new file mode 100644 index 00000000..cf069a70 --- /dev/null +++ b/test/cassettes/channel_instantiation.yml @@ -0,0 +1,157 @@ +--- +http_interactions: +- request: + method: get + uri: https://slack.com/api/channels.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: + - '543' + Connection: + - keep-alive + Date: + - Wed, 11 Sep 2019 20:52:16 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 4b358914-3134-45c9-a2f0-dd832be28eb2 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - channels:read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-70cb + X-Cache: + - Miss from cloudfront + Via: + - 1.1 34f8ef0e4c880df0650a814412a26ea6.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - IH01InwKtA4ZoYN4h-7q1oZxKjOGc9L9tYR0bokwiDas3zQp2hC4Sw== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CN1416ABB","name":"general","is_channel":true,"created":1568143132,"is_archived":false,"is_general":true,"unlinked":0,"creator":"UN7G5G4TF","name_normalized":"general","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UN7G5G4TF","UN9N9T9LN"],"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UN7G5G4TF","last_set":1568143132},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UN7G5G4TF","last_set":1568143132},"previous_names":[],"num_members":2},{"id":"CN7G5GYGM","name":"slack-api","is_channel":true,"created":1568143132,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UN7G5G4TF","name_normalized":"slack-api","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UN7G5G4TF","UN9N9T9LN"],"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2},{"id":"CN9N9ECF8","name":"random","is_channel":true,"created":1568143132,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UN7G5G4TF","name_normalized":"random","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UN7G5G4TF","UN9N9T9LN"],"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UN7G5G4TF","last_set":1568143132},"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":"UN7G5G4TF","last_set":1568143132},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Wed, 11 Sep 2019 20:52:16 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: + - '934' + Connection: + - keep-alive + Date: + - Fri, 13 Sep 2019 18:54:43 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 220861a4-3307-4dbd-8c33-f1cab4adc367 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - users:read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-wycu + X-Cache: + - Miss from cloudfront + Via: + - 1.1 6bd725b6233f3b787d5f5373be153d66.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - HIO51-C1 + X-Amz-Cf-Id: + - zZ-GhiXLpWYMMlaSs2oHHLRjfeSAD6I83aMPISF-mJmhPwPnpOqUGw== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TN7G5G3M3","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":"TN7G5G3M3"},"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":"UN7G5G4TF","team_id":"TN7G5G3M3","name":"dianah46","deleted":false,"color":"9f69e7","real_name":"Diana + Han","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Diana + Han","real_name_normalized":"Diana Han","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gb342b6bf000","first_name":"Diana","last_name":"Han","image_24":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-512.png","status_text_canonical":"","team":"TN7G5G3M3"},"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":1568143240},{"id":"UN9N9T9LN","team_id":"TN7G5G3M3","name":"linnea.johnson1","deleted":false,"color":"4bbe2e","real_name":"Linnea + Johnson","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Linnea + Johnson","real_name_normalized":"Linnea Johnson","display_name":"Linnea Johnson","display_name_normalized":"Linnea + Johnson","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g62a333e3c5a","image_24":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-512.png","status_text_canonical":"","team":"TN7G5G3M3"},"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":1568143209,"has_2fa":false}],"cache_ts":1568400883,"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Fri, 13 Sep 2019 18:54:43 GMT +recorded_with: VCR 5.0.0 diff --git a/test/cassettes/channel_list_generation.yml b/test/cassettes/channel_list_generation.yml new file mode 100644 index 00000000..6d2fb8d7 --- /dev/null +++ b/test/cassettes/channel_list_generation.yml @@ -0,0 +1,157 @@ +--- +http_interactions: +- request: + method: get + uri: https://slack.com/api/channels.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: + - '543' + Connection: + - keep-alive + Date: + - Wed, 11 Sep 2019 20:52:16 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 8f6ca9e1-9cd0-4fcb-a089-be56f2647397 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - channels:read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-p70f + X-Cache: + - Miss from cloudfront + Via: + - 1.1 f126db770f21f288439f44d357978a27.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - SyEQ5dT_oAo9YJYKIvHhi8lCNWHCH9GKHpmo-qd2FIwtKDF3J3jTDA== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CN1416ABB","name":"general","is_channel":true,"created":1568143132,"is_archived":false,"is_general":true,"unlinked":0,"creator":"UN7G5G4TF","name_normalized":"general","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UN7G5G4TF","UN9N9T9LN"],"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UN7G5G4TF","last_set":1568143132},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UN7G5G4TF","last_set":1568143132},"previous_names":[],"num_members":2},{"id":"CN7G5GYGM","name":"slack-api","is_channel":true,"created":1568143132,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UN7G5G4TF","name_normalized":"slack-api","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UN7G5G4TF","UN9N9T9LN"],"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2},{"id":"CN9N9ECF8","name":"random","is_channel":true,"created":1568143132,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UN7G5G4TF","name_normalized":"random","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UN7G5G4TF","UN9N9T9LN"],"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UN7G5G4TF","last_set":1568143132},"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":"UN7G5G4TF","last_set":1568143132},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Wed, 11 Sep 2019 20:52:16 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: + - '934' + Connection: + - keep-alive + Date: + - Thu, 12 Sep 2019 23:02:54 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 035eecfd-88e5-4899-a745-8b9f4e006c35 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - users:read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-qt4f + X-Cache: + - Miss from cloudfront + Via: + - 1.1 c1ac198ab82768c141e2da4f5b4eb71c.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - DEN50-C1 + X-Amz-Cf-Id: + - 5BrU6LYVaNvb4vlUa2ByjDHkrwj85fzRncja0HCt5dMET4JBi0ITiQ== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TN7G5G3M3","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":"TN7G5G3M3"},"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":"UN7G5G4TF","team_id":"TN7G5G3M3","name":"dianah46","deleted":false,"color":"9f69e7","real_name":"Diana + Han","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Diana + Han","real_name_normalized":"Diana Han","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gb342b6bf000","first_name":"Diana","last_name":"Han","image_24":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-512.png","status_text_canonical":"","team":"TN7G5G3M3"},"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":1568143240},{"id":"UN9N9T9LN","team_id":"TN7G5G3M3","name":"linnea.johnson1","deleted":false,"color":"4bbe2e","real_name":"Linnea + Johnson","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Linnea + Johnson","real_name_normalized":"Linnea Johnson","display_name":"Linnea Johnson","display_name_normalized":"Linnea + Johnson","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g62a333e3c5a","image_24":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-512.png","status_text_canonical":"","team":"TN7G5G3M3"},"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":1568143209,"has_2fa":false}],"cache_ts":1568329374,"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Thu, 12 Sep 2019 23:02:55 GMT +recorded_with: VCR 5.0.0 diff --git a/test/cassettes/user_list_generation.yml b/test/cassettes/user_list_generation.yml new file mode 100644 index 00000000..44edfed3 --- /dev/null +++ b/test/cassettes/user_list_generation.yml @@ -0,0 +1,220 @@ +--- +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: + - '934' + Connection: + - keep-alive + Date: + - Wed, 11 Sep 2019 20:52:16 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 7db9875b-1110-41d8-bfaf-e21d163a10b0 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - users:read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-nvih + X-Cache: + - Miss from cloudfront + Via: + - 1.1 599f04a365a179d553682d476509c389.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - "-DtCJIRaq008_-zBGOKWID7fCGezA55FHL5Fm67CIou3-Y0ronRKoA==" + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TN7G5G3M3","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":"TN7G5G3M3"},"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":"UN7G5G4TF","team_id":"TN7G5G3M3","name":"dianah46","deleted":false,"color":"9f69e7","real_name":"Diana + Han","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Diana + Han","real_name_normalized":"Diana Han","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gb342b6bf000","first_name":"Diana","last_name":"Han","image_24":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-512.png","status_text_canonical":"","team":"TN7G5G3M3"},"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":1568143240},{"id":"UN9N9T9LN","team_id":"TN7G5G3M3","name":"linnea.johnson1","deleted":false,"color":"4bbe2e","real_name":"Linnea + Johnson","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Linnea + Johnson","real_name_normalized":"Linnea Johnson","display_name":"Linnea Johnson","display_name_normalized":"Linnea + Johnson","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g62a333e3c5a","image_24":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-512.png","status_text_canonical":"","team":"TN7G5G3M3"},"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":1568143209,"has_2fa":false}],"cache_ts":1568235136,"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Wed, 11 Sep 2019 20:52:16 GMT +- request: + method: get + uri: https://slack.com/api/channels.list + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '53' + Connection: + - keep-alive + Date: + - Wed, 11 Sep 2019 21:47:43 GMT + Server: + - Apache + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + X-Accepted-Oauth-Scopes: + - channels:read + Vary: + - Accept-Encoding + X-Slack-Req-Id: + - 65b6a10a-d1c7-41ed-b0e4-3049c5ab0ce6 + X-Xss-Protection: + - '0' + X-Content-Type-Options: + - nosniff + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-qdiq + X-Cache: + - Miss from cloudfront + Via: + - 1.1 4ffd1199c1038a2d2062d6a465270ae2.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19 + X-Amz-Cf-Id: + - RvDg8Dz7b3HN1aTK93oE7mOTxLkcxz4kaChYNXpb8R5jvhFDaKXDlg== + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"not_authed"}' + http_version: + recorded_at: Wed, 11 Sep 2019 21:47:43 GMT +- request: + method: get + uri: https://slack.com/api/channels.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: + - '543' + Connection: + - keep-alive + Date: + - Wed, 11 Sep 2019 22:10:10 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - adb663e8-f30a-4a78-b9f9-9d3a6fb4bcf2 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - channels:read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-fdpw + X-Cache: + - Miss from cloudfront + Via: + - 1.1 68eedbdfabd017beabf28d04341fec21.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - syy4BotlFabMVnQq_72PzZrQkxTh6-bwx3ZgsWVUDKTw44UwGJ-BHQ== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CN1416ABB","name":"general","is_channel":true,"created":1568143132,"is_archived":false,"is_general":true,"unlinked":0,"creator":"UN7G5G4TF","name_normalized":"general","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UN7G5G4TF","UN9N9T9LN"],"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UN7G5G4TF","last_set":1568143132},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UN7G5G4TF","last_set":1568143132},"previous_names":[],"num_members":2},{"id":"CN7G5GYGM","name":"slack-api","is_channel":true,"created":1568143132,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UN7G5G4TF","name_normalized":"slack-api","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UN7G5G4TF","UN9N9T9LN"],"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2},{"id":"CN9N9ECF8","name":"random","is_channel":true,"created":1568143132,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UN7G5G4TF","name_normalized":"random","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UN7G5G4TF","UN9N9T9LN"],"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UN7G5G4TF","last_set":1568143132},"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":"UN7G5G4TF","last_set":1568143132},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Wed, 11 Sep 2019 22:10:09 GMT +recorded_with: VCR 5.0.0 diff --git a/test/cassettes/workspace.yml b/test/cassettes/workspace.yml new file mode 100644 index 00000000..2d67852c --- /dev/null +++ b/test/cassettes/workspace.yml @@ -0,0 +1,292 @@ +--- +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: + - '936' + Connection: + - keep-alive + Date: + - Fri, 13 Sep 2019 01:45:20 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 8b942435-8c2e-46f1-9cb7-e62892a7ffff + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - users:read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-33wb + X-Cache: + - Miss from cloudfront + Via: + - 1.1 599f04a365a179d553682d476509c389.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - Uu-hRxOGIbT7jMAt1Ynwg5gwy9k6COnoBL0kkORdnMnf0wo8damp8g== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TN7G5G3M3","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":"TN7G5G3M3"},"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":"UN7G5G4TF","team_id":"TN7G5G3M3","name":"dianah46","deleted":false,"color":"9f69e7","real_name":"Diana + Han","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Diana + Han","real_name_normalized":"Diana Han","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gb342b6bf000","first_name":"Diana","last_name":"Han","image_24":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/b342b6bf0000c042ed016ac628b2dd26.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0023-512.png","status_text_canonical":"","team":"TN7G5G3M3"},"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":1568143240,"has_2fa":false},{"id":"UN9N9T9LN","team_id":"TN7G5G3M3","name":"linnea.johnson1","deleted":false,"color":"4bbe2e","real_name":"Linnea + Johnson","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Linnea + Johnson","real_name_normalized":"Linnea Johnson","display_name":"Linnea Johnson","display_name_normalized":"Linnea + Johnson","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g62a333e3c5a","image_24":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/62a333e3c5a3b0eb455d4fa82c117c9d.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0009-512.png","status_text_canonical":"","team":"TN7G5G3M3"},"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":1568143209,"has_2fa":false}],"cache_ts":1568339120,"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Fri, 13 Sep 2019 01:45:21 GMT +- request: + method: get + uri: https://slack.com/api/channels.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: + - '543' + Connection: + - keep-alive + Date: + - Fri, 13 Sep 2019 01:45:21 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - ff724f1b-6a80-4da6-8500-efec4bcfe58f + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - channels:read + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-e4y4 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 0bb842bd5868b86440983b936bb0adef.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - q0TTvlLcz7MbePLHi8ickwy1QNkJLGqO1wryvPZEahURwvv9Zy2l0g== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CN1416ABB","name":"general","is_channel":true,"created":1568143132,"is_archived":false,"is_general":true,"unlinked":0,"creator":"UN7G5G4TF","name_normalized":"general","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UN7G5G4TF","UN9N9T9LN"],"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UN7G5G4TF","last_set":1568143132},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UN7G5G4TF","last_set":1568143132},"previous_names":[],"num_members":2},{"id":"CN7G5GYGM","name":"slack-api","is_channel":true,"created":1568143132,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UN7G5G4TF","name_normalized":"slack-api","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UN7G5G4TF","UN9N9T9LN"],"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2},{"id":"CN9N9ECF8","name":"random","is_channel":true,"created":1568143132,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UN7G5G4TF","name_normalized":"random","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UN7G5G4TF","UN9N9T9LN"],"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UN7G5G4TF","last_set":1568143132},"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":"UN7G5G4TF","last_set":1568143132},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Fri, 13 Sep 2019 01:45:21 GMT +- request: + method: get + uri: https://slack.com/api/users.list + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '53' + Connection: + - keep-alive + Date: + - Fri, 13 Sep 2019 19:19:26 GMT + Server: + - Apache + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + X-Accepted-Oauth-Scopes: + - users:read + Vary: + - Accept-Encoding + X-Slack-Req-Id: + - '09de2226-d01b-45a5-9ede-33edc331f70e' + X-Xss-Protection: + - '0' + X-Content-Type-Options: + - nosniff + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-m81p + X-Cache: + - Miss from cloudfront + Via: + - 1.1 098a28c90e7d4eca5d6cebe57828e74d.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - HIO51-C1 + X-Amz-Cf-Id: + - 8l0IxGRxUXxZy207w73clG56JlOPEF3Zt6lILPBAhHuJujZ1PU8epg== + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"not_authed"}' + http_version: + recorded_at: Fri, 13 Sep 2019 19:19:25 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage?channel=USLACKBOT&text=hello&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: + - '160' + Connection: + - keep-alive + Date: + - Fri, 13 Sep 2019 22:04:25 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - c74ec2a0-0c0a-4dcd-b382-430043819893 + X-Oauth-Scopes: + - identify,channels:read,users:read,chat:write:bot + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write:bot + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-4oho + X-Cache: + - Miss from cloudfront + Via: + - 1.1 4db3f26ee4fd9a14a343fada3315105f.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - HIO51-C1 + X-Amz-Cf-Id: + - YUYG9vmJdj9RAcXzIj5ViOQTDM6_dWmX__j8DtXQEJSjpSpct45Rrw== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channel":"DNDT2SWVD","ts":"1568412265.000100","message":{"type":"message","subtype":"bot_message","text":"hello","ts":"1568412265.000100","username":"Diana''s + App","bot_id":"BN14ERJAV"}}' + http_version: + recorded_at: Fri, 13 Sep 2019 22:04:25 GMT +recorded_with: VCR 5.0.0 diff --git a/test/channel_test.rb b/test/channel_test.rb new file mode 100644 index 00000000..5d8cf29a --- /dev/null +++ b/test/channel_test.rb @@ -0,0 +1,17 @@ +require_relative 'test_helper' + +describe "Channel class" do + + it "can create an instance of Channel" do + VCR.use_cassette("channel_instantiation") do + + id = "CN9N9ECF8" + name = "random" + topic = "Non-work banter and water cooler conversation" + member_count = 2 + channel = Channel.new(id, name, topic, member_count) + + expect(channel).must_be_instance_of Channel + 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..29e252ae --- /dev/null +++ b/test/recipient_test.rb @@ -0,0 +1,28 @@ +require_relative 'test_helper' + +describe "Recipient class" do + describe "initializer method" do + it "can create an instance" do + recipient = Recipient.new("USLACKBOT", "slackbot") + + expect(recipient).must_be_instance_of Recipient + expect(recipient.id).must_equal "USLACKBOT" + expect(recipient.name).must_equal "slackbot" + end + end + + describe "details method" do + it "will raise an error if this method is called" do + recipient = Recipient.new("USLACKBOT", "slackbot") + + proc{recipient.details}.must_raise NotImplementedError + end + end + + describe "self.list method" do + it "will raise an error if this method is called" do + + proc{Recipient.list}.must_raise NotImplementedError + end + end +end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index 90aeb408..3762f5ae 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -8,10 +8,27 @@ require 'minitest/reporters' require 'minitest/skip_dsl' require 'vcr' +require "webmock/minitest" +require "dotenv" +Dotenv.load Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new VCR.configure do |config| config.cassette_library_dir = "test/cassettes" config.hook_into :webmock + + config.default_cassette_options = { + :record => :new_episodes, # record new data when we don't have it yet + :match_requests_on => [:method, :uri, :body], # The http method, URI and body of a request all need to match + } + + config.filter_sensitive_data("") do + ENV["SLACK_TOKEN"] + end end + +require_relative "../lib/channel" +require_relative "../lib/user" +require_relative "../lib/slack" +require_relative "../lib/recipient" diff --git a/test/user_test.rb b/test/user_test.rb new file mode 100644 index 00000000..8218afa3 --- /dev/null +++ b/test/user_test.rb @@ -0,0 +1,17 @@ +require_relative 'test_helper' + +describe "User class" do + + it "can create an instance" do + VCR.use_cassette("user_list_generation") do + + id = "USLACKBOT" + name = "slackbot" + real_name = "Slackbot" + user = User.new(id, name, real_name) + + expect(user).must_be_instance_of User + expect(user.id).must_equal "USLACKBOT" + 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..fa471e43 --- /dev/null +++ b/test/workspace_test.rb @@ -0,0 +1,85 @@ +require_relative 'test_helper' + +describe "Workspace class" do + before do + VCR.use_cassette("workspace") do + @workspace = Workspace.new + end + end + + describe "initializer" do + it "can create an instance" do + + expect(@workspace).must_be_instance_of Workspace + end + + it "establishes the base data structures when instantiated" do + + expect(@workspace.users).must_be_kind_of Array + expect(@workspace.channels).must_be_kind_of Array + end + end + + describe "get_users method" do + it "can return user data from Slack API" do + + users = @workspace.users + + expect(users[0].id).must_equal "USLACKBOT" + expect(users[0].name).must_equal "slackbot" + expect(users[0].real_name).must_equal "Slackbot" + end + end + + describe "get_channels method" do + it "can return channel data from Slack API" do + + channels = @workspace.channels + + expect(channels[2].id).must_equal "CN9N9ECF8" + expect(channels[2].name).must_equal "random" + expect(channels[2].topic).must_equal "Non-work banter and water cooler conversation" + expect(channels[2].member_count).must_equal 2 + end + end + + describe "select_user method" do + it "can return a valid user from list based on user input" do + VCR.use_cassette("workspace") do + workspace = Workspace.new + + user = workspace.select_user("slackbot") + + expect(user[0]).must_be_instance_of User + end + end + + end + + describe "select_channel method" do + it "can return a valid channel from list based on user input" do + VCR.use_cassette("workspace") do + workspace = Workspace.new + + channel = workspace.select_channel("random") + + expect(channel[0]).must_be_instance_of Channel + end + end + end + + describe "send_message method" do + it "can send a message to the selected user or channel" do + VCR.use_cassette("workspace") do + workspace = Workspace.new + + workspace.select_user("slackbot") + + message = "hello" + new_message = workspace.send_message(message) + + expect(new_message["message"]["text"]).must_equal message + end + end + end +end