diff --git a/.gitignore b/.gitignore index 3ff4fada..82cc5be2 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,5 @@ .DS_Store -# Ignore environemnt variables +# Ignore environment variables .env diff --git a/lib/channel.rb b/lib/channel.rb new file mode 100644 index 00000000..4b034bad --- /dev/null +++ b/lib/channel.rb @@ -0,0 +1,37 @@ +require_relative 'recipient' + +class Channel < Recipient + + attr_reader :member_count, :topic + + def initialize(member_count:, topic:, name:, slack_id:) + super(name: name, slack_id: slack_id) + + @member_count = member_count + @topic = topic + end + + def details + tp self, "name", "topic", "member_count", "slack_id" + end + + # =====Class methods===== + def self.list_all + + response = Channel.get("https://slack.com/api/channels.list") + + # parsing the data + + + channels = response["channels"].map do |item| + Channel.new( + member_count: (item["members"]).length, + topic: item["topic"]["value"], + name: item["name"], + slack_id: item["id"], + ) + 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..ff010c5c --- /dev/null +++ b/lib/recipient.rb @@ -0,0 +1,54 @@ +require "httparty" +require 'dotenv' + +Dotenv.load + +class Recipient + + attr_reader :slack_id, :name + + def initialize(slack_id:, name:) + @slack_id = slack_id + @name = name + end + + def send_message(text) + response = HTTParty.post("https://slack.com/api/chat.postMessage", + query: {token: ENV['SLACK_TOKEN'], + channel: self.slack_id, + text: text}) + if response.code != 200 || response["ok"] == false + raise SlackAPIError, "We encountered a problem: #{response["error"]}" + end + end + + def details + # implement in child class + end + + +# =====Class methods===== + +# gets url, based off of API documentation + def self.get(url) + # send message using HTTParty + response = HTTParty.get(url, query: {token: ENV['SLACK_TOKEN']}) + + # accounting for errors + # slack still gives 200 code + if response.code != 200 || response["ok"] == false + raise SlackAPIError, "We encountered a problem: #{response["error"]}" + end + + return response + end + + def self.list_all + # to be defined in a child class + end + +end + + +class SlackAPIError < Exception +end diff --git a/lib/slack.rb b/lib/slack.rb index 8a0b659b..c49c681b 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -1,12 +1,81 @@ -#!/usr/bin/env ruby +# !/usr/bin/env ruby +require 'httparty' +require 'dotenv' +require 'table_print' +require_relative 'workspace' -def main +Dotenv.load + +def get_user_choice + puts "\n" puts "Welcome to the Ada Slack CLI!" + print "Please select one of the options: + (1) list users + (2) list channels + (3) select user + (4) select channel + (5) details + (6) send message + (7) quit + \n Selection: " + + + selection = gets.chomp + + puts "" + + return selection +end + +def main + # interface layout inspired by instructor solar system implementation + program_running = true workspace = Workspace.new + - # TODO project + while program_running + user_choice = get_user_choice - puts "Thank you for using the Ada Slack CLI" + case user_choice.downcase + when "list users", "1" + tp workspace.users, "name", "real_name", "slack_id" + + when "list channels", "2" + tp workspace.channels, "name", "topic", "member_count", "slack_id" + + when "select user", "3" + print "Please provide a user name: " + puts workspace.select_user + + when "select channel", "4" + print "Please provide a channel name: " + puts workspace.select_channel + + when "details", "5" + if workspace.selected == nil + puts "No channel or user selected." + else + workspace.show_details + end + + when "send message", "6" + if workspace.selected == nil + puts "No channel or user selected." + else + print "Enter your message: " + workspace.send_message + end + + when "quit", "7" + program_running = false + puts "Thank you for using the Ada Slack CLI!" + + else + puts "Invalid selection. Please provide a valid action." + 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..461f599a --- /dev/null +++ b/lib/user.rb @@ -0,0 +1,36 @@ +require_relative 'recipient' + +class User < Recipient + + attr_reader :real_name + + def initialize(real_name:, name: , slack_id:) + super(name: name, slack_id: slack_id) + + @real_name = real_name + end + + + def details + tp self, "name", "real_name", "slack_id" + end + + # =====Class methods===== + def self.list_all + + response = User.get("https://slack.com/api/users.list") + + # parsing the data + + + users = response["members"].map do |item| + User.new( + real_name: item["real_name"], + name: item["name"], + slack_id: item["id"], + ) + 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..86fc64bb --- /dev/null +++ b/lib/workspace.rb @@ -0,0 +1,56 @@ +require_relative 'channel' +require_relative 'user' + +class Workspace + + attr_reader :users, :channels, :selected + + def initialize() + @users = User.list_all + @channels = Channel.list_all + @selected = nil + end + + def get_user_input + gets.chomp + end + + def select_user + user_input = get_user_input + + users.each do |user| + if user.name == user_input || user.slack_id == user_input + @selected = user + return "#{selected.name} has been selected" + end + end + + @selected = nil + return "User could not be found." + end + + def select_channel + user_input = get_user_input + + channels.each do |channel| + if channel.name == user_input || channel.slack_id == user_input + @selected = channel + return "#{selected.name} has been selected" + end + end + + @selected = nil + return "Channel could not be found." + end + + def show_details + @selected.details + end + + def send_message + text = get_user_input + + @selected.send_message(text) + end + +end diff --git a/test/cassettes/channels-list-endpoint.yml b/test/cassettes/channels-list-endpoint.yml new file mode 100644 index 00000000..d6129332 --- /dev/null +++ b/test/cassettes/channels-list-endpoint.yml @@ -0,0 +1,147 @@ +--- +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: + - '697' + Connection: + - keep-alive + Date: + - Mon, 16 Mar 2020 02:55:06 GMT + Server: + - Apache + X-Slack-Req-Id: + - 28cc48420777b86626a97ba7362d9082 + X-Oauth-Scopes: + - identify,channels:read,users:read,users.profile:read,chat:write,users:write,users.profile:write + X-Accepted-Oauth-Scopes: + - channels: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-erl2 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 4c48e9fb20d53d40e9fe273dbdae1099.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - fpPSyoo34jzbXQ8sYvYLTMMxVztNWcknwtIdYrEhkuSOl52S2arpNQ== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CV5KRSHJQ","name":"general","is_channel":true,"created":1583868608,"is_archived":false,"is_general":true,"unlinked":0,"creator":"UUT9Z80AE","name_normalized":"general","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UUW1CJZ41","UUTA3S16E","UV63Y1672","UUUKJ03NX","UUT9Z80AE"],"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UUT9Z80AE","last_set":1583868608},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UUT9Z80AE","last_set":1583868608},"previous_names":[],"num_members":5},{"id":"CV649DWUV","name":"slack-api","is_channel":true,"created":1583868609,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UUT9Z80AE","name_normalized":"slack-api","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UUTJAGAEN","UUW1CJZ41","UUTA3S16E","UV63Y1672","UUUKJ03NX","UUT9Z80AE","UV3CAV859"],"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":7},{"id":"CV7V4KYLF","name":"random","is_channel":true,"created":1583868609,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UUT9Z80AE","name_normalized":"random","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UUW1CJZ41","UUTA3S16E","UV63Y1672","UUUKJ03NX","UUT9Z80AE"],"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UUT9Z80AE","last_set":1583868609},"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":"UUT9Z80AE","last_set":1583868609},"previous_names":[],"num_members":5},{"id":"CVASS4US0","name":"test","is_channel":true,"created":1584050770,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UUT9Z80AE","name_normalized":"test","is_shared":false,"is_org_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"members":["UUT9Z80AE"],"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":1},{"id":"CVBS8GW8M","name":"dianas_test_channel","is_channel":true,"created":1584078400,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UUTA3S16E","name_normalized":"dianas_test_channel","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UUTA3S16E"],"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":1}],"response_metadata":{"next_cursor":""}}' + http_version: null + recorded_at: Mon, 16 Mar 2020 02:55:06 GMT +- request: + method: get + uri: https://slack.com/api/bogus.endpoint?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '80' + Connection: + - keep-alive + Date: + - Mon, 16 Mar 2020 03:01:01 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: + - 966991ef3e9a56ecc07519ea3b0fa32a + X-Xss-Protection: + - '0' + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-vmz3 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 814362d7589b223cc8927cc821d97136.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C2 + X-Amz-Cf-Id: + - ssKUWz4neKMawaMVqn-GqhPQAmpATPMnRbWQeHMb1gSoZXDI__1tpw== + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"unknown_method","req_method":"bogus.endpoint"}' + http_version: null + recorded_at: Mon, 16 Mar 2020 03:01:01 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..51ebb744 --- /dev/null +++ b/test/cassettes/users-list-endpoint.yml @@ -0,0 +1,156 @@ +--- +http_interactions: +- request: + method: get + uri: https://slack.com/api/bogus.endpoint?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '80' + Connection: + - keep-alive + Date: + - Mon, 16 Mar 2020 02:55:06 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: + - 9613d6fdca998c3ac22884e36abc5185 + X-Xss-Protection: + - '0' + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-ij90 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 6b03f32d70ff9f666371f69d2672d273.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - avg0UWtOMC7ByfxUlRrVuy6U4lgtl7x239PnVZuvziw6MaNoUn-7sg== + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"unknown_method","req_method":"bogus.endpoint"}' + http_version: null + recorded_at: Mon, 16 Mar 2020 02:55:06 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: + - '2299' + Connection: + - keep-alive + Date: + - Mon, 16 Mar 2020 02:55:07 GMT + Server: + - Apache + X-Slack-Req-Id: + - 98b60b848a97607542cd3a3a9d83b926 + X-Oauth-Scopes: + - identify,channels:read,users:read,users.profile:read,chat:write,users:write,users.profile:write + 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-kirk + X-Cache: + - Miss from cloudfront + Via: + - 1.1 68eedbdfabd017beabf28d04341fec21.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - XYbrcP03ciCImF70YfVxhqIfdH63U7EyV94nCpnm4MFyJ33te0fDtQ== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TV63QKAAU","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":"TV63QKAAU"},"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":"UUT9Z80AE","team_id":"TV63QKAAU","name":"thenora","deleted":false,"color":"9f69e7","real_name":"Nora","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Nora","real_name_normalized":"Nora","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gecfa8e6728a","first_name":"Nora","last_name":"","image_24":"https:\/\/secure.gravatar.com\/avatar\/ecfa8e6728af18fdb2a467aed6cc4688.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/ecfa8e6728af18fdb2a467aed6cc4688.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/ecfa8e6728af18fdb2a467aed6cc4688.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/ecfa8e6728af18fdb2a467aed6cc4688.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/ecfa8e6728af18fdb2a467aed6cc4688.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/ecfa8e6728af18fdb2a467aed6cc4688.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-512.png","status_text_canonical":"","team":"TV63QKAAU"},"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":1583868865},{"id":"UUTA3S16E","team_id":"TV63QKAAU","name":"nguyen_diana","deleted":false,"color":"3c989f","real_name":"Diana + Nguyen","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Diana + Nguyen","real_name_normalized":"Diana Nguyen","display_name":"Diana Nguyen","display_name_normalized":"Diana + Nguyen","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g53546304cba","image_24":"https:\/\/secure.gravatar.com\/avatar\/53546304cba703fdbcc3d6eadf959046.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/53546304cba703fdbcc3d6eadf959046.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/53546304cba703fdbcc3d6eadf959046.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/53546304cba703fdbcc3d6eadf959046.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/53546304cba703fdbcc3d6eadf959046.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/53546304cba703fdbcc3d6eadf959046.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-512.png","status_text_canonical":"","team":"TV63QKAAU"},"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":1583876186,"has_2fa":false},{"id":"UUTJAGAEN","team_id":"TV63QKAAU","name":"time_yolotzin_api_pro","deleted":false,"color":"e96699","real_name":"time_yolotzin_api_pro","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"time_yolotzin_api_pro","real_name_normalized":"time_yolotzin_api_pro","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g3ed47f067f5","api_app_id":"AV68RSJH3","always_active":false,"bot_id":"BV881SK2B","image_24":"https:\/\/secure.gravatar.com\/avatar\/3ed47f067f52bf041336c4087124e81a.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0026-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/3ed47f067f52bf041336c4087124e81a.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0026-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/3ed47f067f52bf041336c4087124e81a.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0026-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/3ed47f067f52bf041336c4087124e81a.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0026-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/3ed47f067f52bf041336c4087124e81a.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0026-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/3ed47f067f52bf041336c4087124e81a.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0026-512.png","status_text_canonical":"","team":"TV63QKAAU"},"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":1583877148},{"id":"UUUKJ03NX","team_id":"TV63QKAAU","name":"kate.d.mangubat","deleted":false,"color":"4bbe2e","real_name":"Kate + M","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Kate + M","real_name_normalized":"Kate M","display_name":"Kate","display_name_normalized":"Kate","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g078604cbcfb","first_name":"Kate","last_name":"M","image_24":"https:\/\/secure.gravatar.com\/avatar\/078604cbcfb8a676a713a3a870a026f9.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0026-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/078604cbcfb8a676a713a3a870a026f9.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0026-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/078604cbcfb8a676a713a3a870a026f9.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0026-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/078604cbcfb8a676a713a3a870a026f9.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0026-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/078604cbcfb8a676a713a3a870a026f9.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0026-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/078604cbcfb8a676a713a3a870a026f9.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0026-512.png","status_text_canonical":"","team":"TV63QKAAU"},"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":1583997418},{"id":"UUW1CJZ41","team_id":"TV63QKAAU","name":"yltzndnbr","deleted":false,"color":"e7392d","real_name":"Yolotzin + Dunbar","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Yolotzin + Dunbar","real_name_normalized":"Yolotzin Dunbar","display_name":"Yoyo","display_name_normalized":"Yoyo","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g574a1cc3875","first_name":"Yolotzin","last_name":"Dunbar","image_24":"https:\/\/secure.gravatar.com\/avatar\/574a1cc387525e2e334bb718a551e3a7.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0026-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/574a1cc387525e2e334bb718a551e3a7.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0026-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/574a1cc387525e2e334bb718a551e3a7.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0026-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/574a1cc387525e2e334bb718a551e3a7.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0026-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/574a1cc387525e2e334bb718a551e3a7.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0026-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/574a1cc387525e2e334bb718a551e3a7.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0026-512.png","status_text_canonical":"","team":"TV63QKAAU"},"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":1584083810},{"id":"UV3CAV859","team_id":"TV63QKAAU","name":"space_kate_m_api_proj","deleted":false,"color":"99a949","real_name":"space_kate_m_api_proj","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"space_kate_m_api_proj","real_name_normalized":"space_kate_m_api_proj","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gbabfb89bbad","api_app_id":"AV22W21DG","always_active":false,"bot_id":"BV3CAV7UK","image_24":"https:\/\/secure.gravatar.com\/avatar\/babfb89bbada2418eed047a5eb3a5132.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/babfb89bbada2418eed047a5eb3a5132.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/babfb89bbada2418eed047a5eb3a5132.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/babfb89bbada2418eed047a5eb3a5132.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/babfb89bbada2418eed047a5eb3a5132.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/babfb89bbada2418eed047a5eb3a5132.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-512.png","status_text_canonical":"","team":"TV63QKAAU"},"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":1584239628},{"id":"UV63Y1672","team_id":"TV63QKAAU","name":"tithvorlakmok","deleted":false,"color":"674b1b","real_name":"Lak","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Lak","real_name_normalized":"Lak","display_name":"Lak","display_name_normalized":"Lak","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gfc5b2d94a48","image_24":"https:\/\/secure.gravatar.com\/avatar\/fc5b2d94a48b155ada6a0aee8b0882a8.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0010-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/fc5b2d94a48b155ada6a0aee8b0882a8.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0010-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/fc5b2d94a48b155ada6a0aee8b0882a8.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0010-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/fc5b2d94a48b155ada6a0aee8b0882a8.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0010-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/fc5b2d94a48b155ada6a0aee8b0882a8.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0010-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/fc5b2d94a48b155ada6a0aee8b0882a8.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0010-512.png","status_text_canonical":"","team":"TV63QKAAU"},"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":1583869256},{"id":"UV66LJW5A","team_id":"TV63QKAAU","name":"noras_api","deleted":false,"color":"684b6c","real_name":"Nora + API","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Nora + API","real_name_normalized":"Nora API","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"46a0f74c1fda","api_app_id":"AV6LEP79B","always_active":false,"image_original":"https:\/\/avatars.slack-edge.com\/2020-03-15\/988889716034_46a0f74c1fda75680243_original.jpg","is_custom_image":true,"bot_id":"BV8FZCLK1","first_name":"Nora","last_name":"API","image_24":"https:\/\/avatars.slack-edge.com\/2020-03-15\/988889716034_46a0f74c1fda75680243_24.jpg","image_32":"https:\/\/avatars.slack-edge.com\/2020-03-15\/988889716034_46a0f74c1fda75680243_32.jpg","image_48":"https:\/\/avatars.slack-edge.com\/2020-03-15\/988889716034_46a0f74c1fda75680243_48.jpg","image_72":"https:\/\/avatars.slack-edge.com\/2020-03-15\/988889716034_46a0f74c1fda75680243_72.jpg","image_192":"https:\/\/avatars.slack-edge.com\/2020-03-15\/988889716034_46a0f74c1fda75680243_192.jpg","image_512":"https:\/\/avatars.slack-edge.com\/2020-03-15\/988889716034_46a0f74c1fda75680243_512.jpg","image_1024":"https:\/\/avatars.slack-edge.com\/2020-03-15\/988889716034_46a0f74c1fda75680243_1024.jpg","status_text_canonical":"","team":"TV63QKAAU"},"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":1584322293},{"id":"UV8PJ6R0W","team_id":"TV63QKAAU","name":"diana_slack_cli","deleted":true,"profile":{"title":"","phone":"","skype":"","real_name":"diana_slack_cli","real_name_normalized":"diana_slack_cli","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"c8e976fcbc63","api_app_id":"AUWEPCVDF","always_active":false,"image_original":"https:\/\/avatars.slack-edge.com\/2020-03-11\/983924921969_c8e976fcbc63dabe20be_original.jpg","is_custom_image":true,"bot_id":"BUTPL5J58","first_name":"diana_slack_cli","last_name":"","image_24":"https:\/\/avatars.slack-edge.com\/2020-03-11\/983924921969_c8e976fcbc63dabe20be_24.jpg","image_32":"https:\/\/avatars.slack-edge.com\/2020-03-11\/983924921969_c8e976fcbc63dabe20be_32.jpg","image_48":"https:\/\/avatars.slack-edge.com\/2020-03-11\/983924921969_c8e976fcbc63dabe20be_48.jpg","image_72":"https:\/\/avatars.slack-edge.com\/2020-03-11\/983924921969_c8e976fcbc63dabe20be_72.jpg","image_192":"https:\/\/avatars.slack-edge.com\/2020-03-11\/983924921969_c8e976fcbc63dabe20be_192.jpg","image_512":"https:\/\/avatars.slack-edge.com\/2020-03-11\/983924921969_c8e976fcbc63dabe20be_512.jpg","image_1024":"https:\/\/avatars.slack-edge.com\/2020-03-11\/983924921969_c8e976fcbc63dabe20be_1024.jpg","status_text_canonical":"","team":"TV63QKAAU"},"is_bot":true,"is_app_user":false,"updated":1584228234},{"id":"UVAALE528","team_id":"TV63QKAAU","name":"github","deleted":false,"color":"2b6836","real_name":"GitHub","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"GitHub","real_name_normalized":"GitHub","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"a384f3b8cb58","api_app_id":"A8GBNUWU8","always_active":true,"image_original":"https:\/\/avatars.slack-edge.com\/2020-03-12\/986735341441_a384f3b8cb58f2705e8a_original.png","is_custom_image":true,"bot_id":"BVAALE484","image_24":"https:\/\/avatars.slack-edge.com\/2020-03-12\/986735341441_a384f3b8cb58f2705e8a_24.png","image_32":"https:\/\/avatars.slack-edge.com\/2020-03-12\/986735341441_a384f3b8cb58f2705e8a_32.png","image_48":"https:\/\/avatars.slack-edge.com\/2020-03-12\/986735341441_a384f3b8cb58f2705e8a_48.png","image_72":"https:\/\/avatars.slack-edge.com\/2020-03-12\/986735341441_a384f3b8cb58f2705e8a_72.png","image_192":"https:\/\/avatars.slack-edge.com\/2020-03-12\/986735341441_a384f3b8cb58f2705e8a_192.png","image_512":"https:\/\/avatars.slack-edge.com\/2020-03-12\/986735341441_a384f3b8cb58f2705e8a_512.png","image_1024":"https:\/\/avatars.slack-edge.com\/2020-03-12\/986735341441_a384f3b8cb58f2705e8a_1024.png","status_text_canonical":"","team":"TV63QKAAU"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":true,"updated":1584036089},{"id":"UVB4TQ89M","team_id":"TV63QKAAU","name":"lak_slackapi","deleted":true,"profile":{"title":"","phone":"","skype":"","real_name":"lak_slackapi","real_name_normalized":"lak_slackapi","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g6ea0fcda828","api_app_id":"AV998UM2R","always_active":false,"bot_id":"BV98UFAHE","image_24":"https:\/\/secure.gravatar.com\/avatar\/6ea0fcda82863d18be01442fb08dc35b.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0017-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/6ea0fcda82863d18be01442fb08dc35b.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0017-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/6ea0fcda82863d18be01442fb08dc35b.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0017-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/6ea0fcda82863d18be01442fb08dc35b.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0017-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/6ea0fcda82863d18be01442fb08dc35b.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0017-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/6ea0fcda82863d18be01442fb08dc35b.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0017-512.png","status_text_canonical":"","team":"TV63QKAAU"},"is_bot":true,"is_app_user":false,"updated":1584323188}],"cache_ts":1584327307,"response_metadata":{"next_cursor":""}}' + http_version: null + recorded_at: Mon, 16 Mar 2020 02:55:07 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..7a49ae0b --- /dev/null +++ b/test/channel_test.rb @@ -0,0 +1,43 @@ +require_relative 'test_helper' +require_relative '../lib/channel' + +describe "Channel" do + describe "self.get" do + it "gets a list of channels" do + result = {} + + # make an API call + VCR.use_cassette("channels-list-endpoint") do + # call method you intend to use + result = Channel.get("https://slack.com/api/channels.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("channels-list-endpoint") do + # call method you intend to use + expect {Channel.get("https://slack.com/api/bogus.endpoint")}.must_raise SlackAPIError + end + end + end + + describe "self.list_all" do + it "returns a valid list of channels" do + result = [] + + VCR.use_cassette("channels-list-endpoint") do + result = Channel.list_all + end + + expect(result).must_be_kind_of Array + expect(result.length).must_be :>, 0 + result.each do |channel| + expect(channel).must_be_kind_of Channel + end + end + end +end \ No newline at end of file diff --git a/test/recipient_test.rb b/test/recipient_test.rb new file mode 100644 index 00000000..630a4dbf --- /dev/null +++ b/test/recipient_test.rb @@ -0,0 +1,27 @@ +require_relative 'test_helper' +require_relative '../lib/recipient' + +describe "Recipient" do + describe "send_message" do + it "can send a message" do + result = {} + + # make an API call + VCR.use_cassette("recipients-list-endpoint") do + # call method you intend to use + result = Recipient.send_message("hi") + 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("recipients-list-endpoint") do + # call method you intend to use + expect {Recipient.send_message("https://slack.com/api/bogus.endpoint")}.must_raise SlackAPIError + end + end + end +end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index 1fcf2bab..59dee41f 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -9,6 +9,7 @@ require 'minitest/skip_dsl' require 'vcr' + Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new VCR.configure do |config| @@ -24,6 +25,9 @@ :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 # Don't leave our token lying around in a cassette file. end diff --git a/test/user_test.rb b/test/user_test.rb new file mode 100644 index 00000000..2737ea07 --- /dev/null +++ b/test/user_test.rb @@ -0,0 +1,43 @@ +require_relative 'test_helper' +require_relative "../lib/user" + +describe "User" do + describe "self.get" do + it "gets a list of users" do + result = {} + + # make an API call + VCR.use_cassette("users-list-endpoint") do + # call method you intend to use + 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("users-list-endpoint") do + # call method you intend to use + expect {User.get("https://slack.com/api/bogus.endpoint")}.must_raise SlackAPIError + end + end + end + + describe "self.list_all" 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..20e858a7 --- /dev/null +++ b/test/workspace_test.rb @@ -0,0 +1,62 @@ +require_relative 'test_helper' +require_relative '../lib/workspace.rb' +require 'table_print' + +describe "Workspace" do + before do + VCR.use_cassette("users-list-endpoint") do + VCR.use_cassette("channels-list-endpoint") do + @workspace = Workspace.new + end + end + end + + describe "Workspace instantiation" do + it "is an instance of Workspace" do + expect(@workspace).must_be_kind_of Workspace + end + + it "is set up for specific attributes" do + expect(@workspace.channels).must_be_kind_of Array + expect(@workspace.users).must_be_kind_of Array + end + + it "has default status of nil for selected" do + expect(@workspace.selected).must_equal nil + end + end + + describe "select_user" do + it "correctly selects a user by username" do + def @workspace.get_user_input; "slackbot" end + expect(@workspace.select_user).must_equal "slackbot has been selected" + end + + it "correctly selects a user by slack_id" do + def @workspace.get_user_input; "USLACKBOT" end + expect(@workspace.select_user).must_equal "slackbot has been selected" + end + + it "provides a message if a user could not be found" do + def @workspace.get_user_input; "notauser" end + expect(@workspace.select_user).must_equal "User could not be found." + end + end + + describe "select_channel" do + it "correctly selects a channel by channel name" do + def @workspace.get_user_input; "random" end + expect(@workspace.select_channel).must_equal "random has been selected" + end + + it "correctly selects a channel by slack_id" do + def @workspace.get_user_input; "CV7V4KYLF" end + expect(@workspace.select_channel).must_equal "random has been selected" + end + + it "provides a message if a channel could not be found" do + def @workspace.get_user_input; "notachannel" end + expect(@workspace.select_channel).must_equal "Channel could not be found." + end + end +end