diff --git a/.gitignore b/.gitignore index 8d6a243f..feaa51d7 100644 --- a/.gitignore +++ b/.gitignore @@ -51,6 +51,7 @@ build-iPhoneSimulator/ # Ignore environemnt variables .env +instructor-design.png # Ignore cassette files /specs/cassettes/ diff --git a/lib/channel.rb b/lib/channel.rb new file mode 100644 index 00000000..9ed648e5 --- /dev/null +++ b/lib/channel.rb @@ -0,0 +1,46 @@ +require 'dotenv' +require 'httparty' +require 'awesome_print' +Dotenv.load + +require_relative 'recipient' + +module SlackCli + class Channel < Recipient + attr_reader :name, :topic, :id, :num_members + + def initialize(name:, id:, topic:, num_members:) + @name = name + @id = id + @topic = topic + @num_members = num_members + end + + def self.list + method_url = "https://slack.com/api/channels.list" + query_params = { + token: ENV["SLACK_TOKEN"] + } + response = HTTParty.get(method_url, query: query_params) + + channels = response.parsed_response["channels"] + i = 0 + all_channels = [] + channels.each do |channel| + channel_hash = {} + name = response.parsed_response["channels"][i]["name"] + topic = response.parsed_response["channels"][i]["topic"]["value"] + id = response.parsed_response["channels"][i]["id"] + num_members = response.parsed_response["channels"][i]["num_members"] + channel_hash[:name] = name + channel_hash[:topic] = topic + channel_hash[:id] = id + channel_hash[:num_members] = num_members + all_channels.push(channel_hash) + i += 1 + end + return all_channels + end + + end +end \ No newline at end of file diff --git a/lib/recipient.rb b/lib/recipient.rb new file mode 100644 index 00000000..d010f6bf --- /dev/null +++ b/lib/recipient.rb @@ -0,0 +1,20 @@ +require 'dotenv' +require 'httparty' +require 'awesome_print' +Dotenv.load + +module SlackCli + class Recipient + def self.send_message(recipient:, message:) + method_url = "https://slack.com/api/chat.postMessage" + query_params = { + token: ENV["SLACK_TOKEN"], + channel: recipient, + text: message + } + slack_post = HTTParty.post(method_url, query: query_params) + return slack_post + end + end + +end \ No newline at end of file diff --git a/lib/slack.rb b/lib/slack.rb index 960cf2f7..6503cc96 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -1,11 +1,86 @@ -#!/usr/bin/env ruby +require 'dotenv' +require 'httparty' +require 'awesome_print' +Dotenv.load -def main - puts "Welcome to the Ada Slack CLI!" +require_relative './channel' +require_relative 'user' - # TODO project +def start_program + ap "Welcome to the Ada Slack CLI!" + print "What would you like to do? Type one of the following:\n - list channels\n - list users\n - select user\n - select channel\n - details\n - send message\n - quit\n" + user_input = gets.chomp.downcase - puts "Thank you for using the Ada Slack CLI" -end -main if __FILE__ == $PROGRAM_NAME \ No newline at end of file + while user_input != "quit" + case user_input + when "list channels" + ap SlackCli::Channel.list + when "list users" + ap SlackCli::User.list + when "select user" + ap "Type a username or Slack ID." + search_user = gets.chomp + selected_recipient = SlackCli::User.list.find do |i| + i[:user_name]== search_user || i[:id] == search_user + end + if selected_recipient == nil + ap "User not found" + else + selected_recipient = SlackCli::User.new( + name: selected_recipient[:user_name], + real_name: selected_recipient[:real_name], + id: selected_recipient[:id] + ) + ap "Recipient has been selected." + end + + when "select channel" + ap "Type a username or Slack ID." + search_channel = gets.chomp + selected_recipient = SlackCli::Channel.list.find do |i| + i[:name]== search_channel || i[:id] == search_channel + end + if selected_recipient == nil + ap "Channel not found" + else + selected_recipient = SlackCli::Channel.new( + name: selected_recipient[:name], + topic: selected_recipient[:topic], + id: selected_recipient[:id], + num_members: selected_recipient[:num_members] + ) + ap "Recipient has been selected." + end + + when "details" + if selected_recipient.class == SlackCli::Channel + ap "Channel name: #{selected_recipient.name}" + ap "Channel topic: #{selected_recipient.topic}" + ap "Channel id: #{selected_recipient.id}" + ap "Channel members count: #{selected_recipient.num_members}" + elsif selected_recipient.class == SlackCli::User + ap "Username: #{selected_recipient.name}" + ap "User real name: #{selected_recipient.real_name}" + ap "User id: #{selected_recipient.id}" + else + ap "No recipient is currently selected. Select a recipient in the main menu." + end + ap selected_recipient + when "send message" + if selected_recipient == nil + ap "No recipient selected." + else + ap "Type a message to send:" + message = gets.chomp + SlackCli::Recipient.send_message(recipient:selected_recipient.id, message:message) + end + else + ap "Not a valid command" + end + print "What would you like to do? Type one of the following:\n - list channels\n - list users\n - select user\n - select channel\n - details\n - send message\n - quit\n" + user_input = gets.chomp.downcase + end + ap "Thank you for using the Sara & Monick Slack CLI." +end +start_program \ No newline at end of file diff --git a/lib/user.rb b/lib/user.rb new file mode 100644 index 00000000..31a347cb --- /dev/null +++ b/lib/user.rb @@ -0,0 +1,42 @@ +require 'dotenv' +require 'httparty' +require 'awesome_print' +Dotenv.load + +require_relative 'recipient' + +module SlackCli + class User < Recipient + attr_reader :name, :real_name, :id + + def initialize(name:, real_name:, id:) + @real_name = real_name + @name = name + @id = id + end + + def self.list + method_url = "https://slack.com/api/users.list" + query_params = { + token: ENV["SLACK_TOKEN"] + } + response = HTTParty.get(method_url, query: query_params) + + users = response.parsed_response["members"] + i = 0 + all_users = [] + users.each do |user| + user_hash = {} + user_name = response.parsed_response["members"][i]["name"] + real_name = response.parsed_response["members"][i]["real_name"] + id = response.parsed_response["members"][i]["id"] + user_hash[:user_name] = user_name + user_hash[:real_name] = real_name + user_hash[:id] = id + all_users.push(user_hash) + i += 1 + end + return all_users + end + end +end \ No newline at end of file diff --git a/test/cassettes/slack_details.yml b/test/cassettes/slack_details.yml new file mode 100644 index 00000000..69cdc26e --- /dev/null +++ b/test/cassettes/slack_details.yml @@ -0,0 +1,523 @@ +--- +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: + - '930' + Connection: + - keep-alive + Date: + - Wed, 11 Sep 2019 22:07:31 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 58415489-ed1e-4ed2-ba69-5fa302291b2f + 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-pcsw + X-Cache: + - Miss from cloudfront + Via: + - 1.1 d0387b833e3ca8cb748a1296b4b4bf2b.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - RUtgLMtffX4G7lZtbTv4_Pf97Q2jl0ZPJUZmVAyfbkQGVQ-N8sixzQ== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TMTKBQZNW","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":"TMTKBQZNW"},"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":"UN8JZT96J","team_id":"TMTKBQZNW","name":"monick.keo","deleted":false,"color":"9f69e7","real_name":"monick.keo","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"monick.keo","real_name_normalized":"monick.keo","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g2c3fdb549fe","image_24":"https:\/\/secure.gravatar.com\/avatar\/2c3fdb549feab0cd8aae6d289dd5697f.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0015-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/2c3fdb549feab0cd8aae6d289dd5697f.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0015-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/2c3fdb549feab0cd8aae6d289dd5697f.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0015-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/2c3fdb549feab0cd8aae6d289dd5697f.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0015-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/2c3fdb549feab0cd8aae6d289dd5697f.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0015-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/2c3fdb549feab0cd8aae6d289dd5697f.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0015-512.png","status_text_canonical":"","team":"TMTKBQZNW"},"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":1568082002,"has_2fa":false},{"id":"UN8LCAGES","team_id":"TMTKBQZNW","name":"sarashahbaig","deleted":false,"color":"4bbe2e","real_name":"sara + shah","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"sara + shah","real_name_normalized":"sara shah","display_name":"sara shah","display_name_normalized":"sara + shah","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gbb5b56e38f3","first_name":"","last_name":"","image_24":"https:\/\/secure.gravatar.com\/avatar\/bb5b56e38f33ff58749dca957a693f1f.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/bb5b56e38f33ff58749dca957a693f1f.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/bb5b56e38f33ff58749dca957a693f1f.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/bb5b56e38f33ff58749dca957a693f1f.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/bb5b56e38f33ff58749dca957a693f1f.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/bb5b56e38f33ff58749dca957a693f1f.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-512.png","status_text_canonical":"","team":"TMTKBQZNW"},"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":1568087174,"has_2fa":false}],"cache_ts":1568239651,"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Wed, 11 Sep 2019 22:07:31 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: + - '930' + Connection: + - keep-alive + Date: + - Wed, 11 Sep 2019 22:07:31 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 9df2a638-d959-4398-9bc0-2b0384143cb2 + 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-vdbk + X-Cache: + - Miss from cloudfront + Via: + - 1.1 599f04a365a179d553682d476509c389.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - 6iT6cOlmeLJt_6uhkL9IdKvcwVzX9xd-mcayD-BMVmwnwsUwoYKMLg== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TMTKBQZNW","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":"TMTKBQZNW"},"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":"UN8JZT96J","team_id":"TMTKBQZNW","name":"monick.keo","deleted":false,"color":"9f69e7","real_name":"monick.keo","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"monick.keo","real_name_normalized":"monick.keo","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g2c3fdb549fe","image_24":"https:\/\/secure.gravatar.com\/avatar\/2c3fdb549feab0cd8aae6d289dd5697f.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0015-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/2c3fdb549feab0cd8aae6d289dd5697f.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0015-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/2c3fdb549feab0cd8aae6d289dd5697f.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0015-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/2c3fdb549feab0cd8aae6d289dd5697f.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0015-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/2c3fdb549feab0cd8aae6d289dd5697f.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0015-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/2c3fdb549feab0cd8aae6d289dd5697f.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0015-512.png","status_text_canonical":"","team":"TMTKBQZNW"},"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":1568082002,"has_2fa":false},{"id":"UN8LCAGES","team_id":"TMTKBQZNW","name":"sarashahbaig","deleted":false,"color":"4bbe2e","real_name":"sara + shah","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"sara + shah","real_name_normalized":"sara shah","display_name":"sara shah","display_name_normalized":"sara + shah","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gbb5b56e38f3","first_name":"","last_name":"","image_24":"https:\/\/secure.gravatar.com\/avatar\/bb5b56e38f33ff58749dca957a693f1f.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/bb5b56e38f33ff58749dca957a693f1f.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/bb5b56e38f33ff58749dca957a693f1f.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/bb5b56e38f33ff58749dca957a693f1f.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/bb5b56e38f33ff58749dca957a693f1f.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/bb5b56e38f33ff58749dca957a693f1f.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F80588%2Fimg%2Favatars%2Fuser_shapes%2Fava_0021-512.png","status_text_canonical":"","team":"TMTKBQZNW"},"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":1568087174,"has_2fa":false}],"cache_ts":1568239651,"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Wed, 11 Sep 2019 22:07:31 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: + - '549' + Connection: + - keep-alive + Date: + - Wed, 11 Sep 2019 22:34:47 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 0510f30a-f12a-4fae-9ea6-6b7939f0909e + 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-f2n6 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 d6a002c70d55f415107618b0750d493d.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C2 + X-Amz-Cf-Id: + - KhLjVxHEo9qEgrIB8O8_t3tgei94_ubnVJUJPdstN5v-1oVg2iEhFw== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CMTKBR8P4","name":"general","is_channel":true,"created":1568082002,"is_archived":false,"is_general":true,"unlinked":0,"creator":"UN8JZT96J","name_normalized":"general","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UN8JZT96J","UN8LCAGES"],"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UN8JZT96J","last_set":1568082002},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UN8JZT96J","last_set":1568082002},"previous_names":[],"num_members":2},{"id":"CN6CW5FBP","name":"random","is_channel":true,"created":1568082002,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UN8JZT96J","name_normalized":"random","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UN8JZT96J","UN8LCAGES"],"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UN8JZT96J","last_set":1568082002},"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":"UN8JZT96J","last_set":1568082002},"previous_names":[],"num_members":2},{"id":"CN88Q9RAB","name":"slack-cli","is_channel":true,"created":1568082003,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UN8JZT96J","name_normalized":"slack-cli","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UN8JZT96J","UN8LCAGES"],"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Wed, 11 Sep 2019 22:34:47 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: + - '549' + Connection: + - keep-alive + Date: + - Wed, 11 Sep 2019 22:34:47 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - caa2b1c4-4e15-4cdd-af89-7915f39b43cf + 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-lx8n + X-Cache: + - Miss from cloudfront + Via: + - 1.1 b2f9564ebf9c745cc2ceae96d434977e.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C2 + X-Amz-Cf-Id: + - xJfCSGBBOlCkgNCAvKQiBvk5NFWPuBTx45JAobb7lAssOriZpAgunA== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CMTKBR8P4","name":"general","is_channel":true,"created":1568082002,"is_archived":false,"is_general":true,"unlinked":0,"creator":"UN8JZT96J","name_normalized":"general","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UN8JZT96J","UN8LCAGES"],"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UN8JZT96J","last_set":1568082002},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UN8JZT96J","last_set":1568082002},"previous_names":[],"num_members":2},{"id":"CN6CW5FBP","name":"random","is_channel":true,"created":1568082002,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UN8JZT96J","name_normalized":"random","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UN8JZT96J","UN8LCAGES"],"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UN8JZT96J","last_set":1568082002},"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":"UN8JZT96J","last_set":1568082002},"previous_names":[],"num_members":2},{"id":"CN88Q9RAB","name":"slack-cli","is_channel":true,"created":1568082003,"is_archived":false,"is_general":false,"unlinked":0,"creator":"UN8JZT96J","name_normalized":"slack-cli","is_shared":false,"is_org_shared":false,"is_member":true,"is_private":false,"is_mpim":false,"members":["UN8JZT96J","UN8LCAGES"],"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' + http_version: + recorded_at: Wed, 11 Sep 2019 22:34:47 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage?channel=UN8JZT96J&text=%23%3CProc:0x00007ff717d91d48@/Users/monick/.rbenv/versions/2.5.5/lib/ruby/gems/2.5.0/gems/minitest-5.11.3/lib/minitest/assertions.rb:518%3E&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: + - '253' + Connection: + - keep-alive + Date: + - Fri, 13 Sep 2019 18:16:26 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - f03e4575-eaee-44b3-8d97-f0122bbe2edf + 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-m81p + X-Cache: + - Miss from cloudfront + Via: + - 1.1 d2bb0dc1233d3ab1747a4a160c14c25b.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - HIO51-C1 + X-Amz-Cf-Id: + - 8pPuh_jIEJnMki58UfBwWt43lRELTV9MD2GCt9JCau9swws1qskDgg== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channel":"DN6CP2UKS","ts":"1568398586.000100","message":{"type":"message","subtype":"bot_message","text":"#<Proc:0x00007ff717d91d48@\/Users\/monick\/.rbenv\/versions\/2.5.5\/lib\/ruby\/gems\/2.5.0\/gems\/minitest-5.11.3\/lib\/minitest\/assertions.rb:518>","ts":"1568398586.000100","username":"slack-cli","bot_id":"BN7MB352R"}}' + http_version: + recorded_at: Fri, 13 Sep 2019 18:16:26 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage?channel=UN8JZT96J&text=%23%3CProc:0x00007fb378674f98@/Users/monick/.rbenv/versions/2.5.5/lib/ruby/gems/2.5.0/gems/minitest-5.11.3/lib/minitest/assertions.rb:518%3E&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: + - '253' + Connection: + - keep-alive + Date: + - Fri, 13 Sep 2019 18:17:28 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - b7573b4b-9fc1-4dcf-86bf-9d360a800291 + 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-wsq7 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 bf747dc419d7840e37c22083d04ecd8e.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - HIO51-C1 + X-Amz-Cf-Id: + - 8ZnIAnloArrm-ub8AboKbUMeAYuWYrNxP4olEqUvi1KluKkgad9zxA== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channel":"DN6CP2UKS","ts":"1568398648.000200","message":{"type":"message","subtype":"bot_message","text":"#<Proc:0x00007fb378674f98@\/Users\/monick\/.rbenv\/versions\/2.5.5\/lib\/ruby\/gems\/2.5.0\/gems\/minitest-5.11.3\/lib\/minitest\/assertions.rb:518>","ts":"1568398648.000200","username":"slack-cli","bot_id":"BN7MB352R"}}' + http_version: + recorded_at: Fri, 13 Sep 2019 18:17:28 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage?channel=UN8JZT96J&text=IT%20WORKS!&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: + - '161' + Connection: + - keep-alive + Date: + - Fri, 13 Sep 2019 19:06:52 GMT + Server: + - Apache + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 5fb1f208-801a-4af6-842f-be131f86c7ad + 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-wycu + X-Cache: + - Miss from cloudfront + Via: + - 1.1 ceb7b8c925a9435b9b08b23014561fbb.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - HIO51-C1 + X-Amz-Cf-Id: + - XosWWMjNp3-mCDReiIa9aJtatbxrR34d5bUNhbmI2BohS2-W9zVFCg== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channel":"DN6CP2UKS","ts":"1568401612.000400","message":{"type":"message","subtype":"bot_message","text":"IT + WORKS!","ts":"1568401612.000400","username":"slack-cli","bot_id":"BN7MB352R"}}' + http_version: + recorded_at: Fri, 13 Sep 2019 19:06:52 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..04be02a5 --- /dev/null +++ b/test/channel_test.rb @@ -0,0 +1,42 @@ +require_relative 'test_helper' + +describe "channel instantiate" do + it "should instanitate as SlackCli::User" do + @channel = SlackCli::Channel.new(name:"Sara", id: "6", topic:"general", num_members: "3") + expect(@channel).must_be_kind_of SlackCli::Channel + end +end + +describe "channel list method should return correct values" do + it "all_users returns as an array with correct number of parameters" do + VCR.use_cassette("slack_details") do + expect(SlackCli::Channel.list).must_be_kind_of Array + expect(SlackCli::Channel.list.length).must_equal 3 + end + end + + it "channel list method returns correct name" do + VCR.use_cassette("slack_details") do + expect(SlackCli::Channel.list[1][:name]).must_equal "random" + end + end + + it "user_hash contains name" do + VCR.use_cassette("slack_details") do + expect(SlackCli::Channel.list[1][:topic]).must_be_kind_of String + end + end + + it "user_hash contains name" do + VCR.use_cassette("slack_details") do + expect(SlackCli::Channel.list[1][:id]).must_equal "CN6CW5FBP" + end + end + + it "user_hash contains id" do + VCR.use_cassette("slack_details") do + expect(SlackCli::Channel.list[1][:num_members]).must_equal 2 + expect(SlackCli::Channel.list[1][:num_members]).must_be_kind_of Integer + 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..19a7ff4e --- /dev/null +++ b/test/recipient_test.rb @@ -0,0 +1,20 @@ +require_relative 'test_helper' + +describe "recipent class tests" do + before do + @selected_recipient = SlackCli::User.new( + name: "monick.keo", + real_name: "monick.keo", + id: "UN8JZT96J" + ) + @message = "IT WORKS!" + end + + it "should send a message to selected recipient" do + VCR.use_cassette("slack_details") do + test = SlackCli::Recipient.send_message(recipient:@selected_recipient.id, message:@message) + expect(test.code).must_equal 200 + expect(test.body).must_include "IT WORKS!" + end + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb index 90aeb408..359e8d43 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -11,7 +11,20 @@ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new +require_relative '../lib/channel' +require_relative '../lib/user' +# require_relative '../lib/slack' +require_relative '../lib/recipient' + VCR.configure do |config| - config.cassette_library_dir = "test/cassettes" - config.hook_into :webmock -end + config.cassette_library_dir = "test/cassettes" # folder where casettes will be located + config.hook_into :webmock # tie into this other tool called webmock + config.default_cassette_options = { + :record => :new_episodes, # record new data when we don't have it yet + :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 \ No newline at end of file diff --git a/test/user_test.rb b/test/user_test.rb new file mode 100644 index 00000000..74b84d1b --- /dev/null +++ b/test/user_test.rb @@ -0,0 +1,35 @@ +require_relative 'test_helper' + +describe "user instantiate" do + it "should instanitate as SlackCli::User" do + @user1 = SlackCli::User.new(name:"Sara", real_name:"Monick", id: "6") + expect(@user1).must_be_kind_of SlackCli::User + end +end + +describe "user list method should return correct values" do + it "all_users returns as an array with correct number of parameters" do + VCR.use_cassette("slack_details") do + expect(SlackCli::User.list).must_be_kind_of Array + expect(SlackCli::User.list.length).must_equal 3 + end + end + + it "user_hash contains name" do + VCR.use_cassette("slack_details") do + expect(SlackCli::User.list[1][:user_name]).must_equal "monick.keo" + end + end + + it "user_hash contains real name" do + VCR.use_cassette("slack_details") do + expect(SlackCli::User.list[1][:real_name]).must_equal "monick.keo" + end + end + + it "user_hash contains id" do + VCR.use_cassette("slack_details") do + expect(SlackCli::User.list[1][:id]).must_equal "UN8JZT96J" + end + end +end \ No newline at end of file