From 8c012577fc034c25ee3a6dba36227e951d0843e9 Mon Sep 17 00:00:00 2001 From: Yesenia Date: Sun, 15 Mar 2020 18:17:51 -0700 Subject: [PATCH 01/11] Insert and hide slack token, set up design scaffolding --- .gitignore | 2 +- lib/channel.rb | 5 +++++ lib/recipient.rb | 5 +++++ lib/slack.rb | 12 +++++++++++- lib/user.rb | 5 +++++ lib/workspace.rb | 12 ++++++++++++ test/channel_test.rb | 5 +++++ test/test_helper.rb | 4 +++- test/user_test.rb | 5 +++++ test/workspace_test.rb | 5 +++++ 10 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 lib/channel.rb create mode 100644 lib/recipient.rb create mode 100644 lib/user.rb create mode 100644 lib/workspace.rb create mode 100644 test/channel_test.rb create mode 100644 test/user_test.rb create mode 100644 test/workspace_test.rb 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..e3a1faa0 --- /dev/null +++ b/lib/channel.rb @@ -0,0 +1,5 @@ +require_relative "recipient" + +class Channel < Recipient + +end \ No newline at end of file diff --git a/lib/recipient.rb b/lib/recipient.rb new file mode 100644 index 00000000..4f401bdb --- /dev/null +++ b/lib/recipient.rb @@ -0,0 +1,5 @@ +require "httparty" + +class Recipient + +end \ No newline at end of file diff --git a/lib/slack.rb b/lib/slack.rb index 8a0b659b..c7dfb0b8 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -1,10 +1,20 @@ #!/usr/bin/env ruby +require_relative "workspace" + +require 'httparty' +require 'dotenv' + +BASE_URL = "https://slack.com/api/conversations.list" +SLACK_API_TOKEN = ENV["SLACK_TOKEN"] + +Dotenv.load + def main puts "Welcome to the Ada Slack CLI!" workspace = Workspace.new - # TODO project + response = HTTParty.get(BASE_URL, query: {token: SLACK_API_TOKEN }) puts "Thank you for using the Ada Slack CLI" end diff --git a/lib/user.rb b/lib/user.rb new file mode 100644 index 00000000..96951a65 --- /dev/null +++ b/lib/user.rb @@ -0,0 +1,5 @@ +require_relative "recipient" + +class User < Recipient + +end \ No newline at end of file diff --git a/lib/workspace.rb b/lib/workspace.rb new file mode 100644 index 00000000..cf61c6bb --- /dev/null +++ b/lib/workspace.rb @@ -0,0 +1,12 @@ + +class Workspace + + attr_reader :users, :channels, :selected + + def initialize(users: [], channels: []) + @users = users + @channels = channels + @selected = nil + end + +end \ No newline at end of file diff --git a/test/channel_test.rb b/test/channel_test.rb new file mode 100644 index 00000000..b5487d24 --- /dev/null +++ b/test/channel_test.rb @@ -0,0 +1,5 @@ +require_relative "test_helper" + +describe "Channel" do + +end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index 1fcf2bab..a4c7681d 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -25,5 +25,7 @@ } # Don't leave our token lying around in a cassette file. - + config.filter_sensitive_data("") do + ENV['SLACK_TOKEN'] + end end diff --git a/test/user_test.rb b/test/user_test.rb new file mode 100644 index 00000000..fc17da76 --- /dev/null +++ b/test/user_test.rb @@ -0,0 +1,5 @@ +require_relative "test_helper" + +describe "User" do + +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..14cec3fe --- /dev/null +++ b/test/workspace_test.rb @@ -0,0 +1,5 @@ +require_relative "test_helper" + +describe "Workspace" do + +end \ No newline at end of file From 37eae3b9aee10d3ea7a605dbc29f0ae3f63df2c0 Mon Sep 17 00:00:00 2001 From: Yesenia Date: Sun, 15 Mar 2020 19:46:50 -0700 Subject: [PATCH 02/11] Set up and test list users functionality in User class. --- lib/recipient.rb | 42 ++++++- lib/slack.rb | 9 +- lib/user.rb | 16 +++ test/cassettes/users-list-endpoint.yml | 158 +++++++++++++++++++++++++ test/channel_test.rb | 6 + test/test_helper.rb | 9 +- test/user_test.rb | 22 ++++ test/workspace_test.rb | 4 +- 8 files changed, 253 insertions(+), 13 deletions(-) create mode 100644 test/cassettes/users-list-endpoint.yml diff --git a/lib/recipient.rb b/lib/recipient.rb index 4f401bdb..fe1f0b40 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -1,5 +1,43 @@ require "httparty" -class Recipient +class Recipient # abstract class -end \ No newline at end of file + attr_reader :slack_id, :name + + def initialize(slack_id:, name:) + @slack_id = slack_id + @name = name + end + + + def send_message(msg_text) + + end + + def details + raise NotImplementedError, "Implement me in a child class!" + end + + # ----- CLASS METHODS ----- + + # gets desired data from API + def self.get(url) + requested_data = HTTParty.get(url, query: {token: ENV["BOT_TOKEN"]}) + + if requested_data.code != 200 || requested_data["ok"] == false + raise SlackAPIError, "Encountered error: #{requested_data["error"]}" + end + + return requested_data + end + + + def self.list_all + raise NotImplementedError, "Implement me in a child class!" + end + +end + +# create here so that it is accessible by all other classes in this project +class SlackAPIError < Exception +end \ No newline at end of file diff --git a/lib/slack.rb b/lib/slack.rb index c7dfb0b8..5c9ce405 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -1,12 +1,8 @@ #!/usr/bin/env ruby - -require_relative "workspace" - -require 'httparty' require 'dotenv' +require "table_print" -BASE_URL = "https://slack.com/api/conversations.list" -SLACK_API_TOKEN = ENV["SLACK_TOKEN"] +require_relative "workspace" Dotenv.load @@ -14,7 +10,6 @@ def main puts "Welcome to the Ada Slack CLI!" workspace = Workspace.new - response = HTTParty.get(BASE_URL, query: {token: SLACK_API_TOKEN }) puts "Thank you for using the Ada Slack CLI" end diff --git a/lib/user.rb b/lib/user.rb index 96951a65..f59a583d 100644 --- a/lib/user.rb +++ b/lib/user.rb @@ -1,5 +1,21 @@ require_relative "recipient" class User < Recipient + attr :real_name, :status_text, :status_emoji + def initialize(real_name:, status_text:, status_emoji:, name:, slack_id:) + super(slack_id: slack_id, name: name) + @real_name = real_name + @status_text = status_text + @status_emoji = status_emoji + end + + def details + end + + # ----- CLASS METHODS ----- + + def self.list_all + end + end \ No newline at end of file diff --git a/test/cassettes/users-list-endpoint.yml b/test/cassettes/users-list-endpoint.yml new file mode 100644 index 00000000..82b268cd --- /dev/null +++ b/test/cassettes/users-list-endpoint.yml @@ -0,0 +1,158 @@ +--- +http_interactions: +- request: + method: get + uri: https://slack.com/api/bogus.endpoint?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '80' + Connection: + - keep-alive + Date: + - Mon, 16 Mar 2020 02:33:58 GMT + Server: + - Apache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Referrer-Policy: + - no-referrer + X-Slack-Backend: + - h + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 2e7b30fe6247eb1d52b05a85e1eb1622 + X-Xss-Protection: + - '0' + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-qel1 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 b4085435efbe95a420f374958bd145bf.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - FyqFJEw1_elhJwQmSQtzq9TASIWSan6dLFaxe4ybgT0ftkP2PxFyIQ== + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"unknown_method","req_method":"bogus.endpoint"}' + http_version: null + recorded_at: Mon, 16 Mar 2020 02:33:59 GMT +- request: + method: get + uri: https://slack.com/api/users.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '2096' + Connection: + - keep-alive + Date: + - Mon, 16 Mar 2020 02:33:59 GMT + Server: + - Apache + X-Slack-Req-Id: + - be89b5205c2ba23ec39b9f0e0d148be6 + X-Oauth-Scopes: + - chat:write,channels:read,users:read + X-Accepted-Oauth-Scopes: + - users:read + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Slack-Backend: + - h + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-9s4u + X-Cache: + - Miss from cloudfront + Via: + - 1.1 6a6653dfb47ccc5082f2a5b9d0d168ce.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - z4o1rpp96EJZGgjapV5J-Y4fWmhFCihUGhSeA-Xpd91d0_CJNX1Naw== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TV83W4WBZ","name":"slackbot","deleted":false,"color":"757575","real_name":"Slackbot","tz":null,"tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Slackbot","real_name_normalized":"Slackbot","display_name":"Slackbot","display_name_normalized":"Slackbot","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"sv41d8cd98f0","always_active":true,"first_name":"slackbot","last_name":"","image_24":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_24.png","image_32":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_32.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_72.png","image_192":"https:\/\/a.slack-edge.com\/80588\/marketing\/img\/avatars\/slackbot\/avatar-slackbot.png","image_512":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":0},{"id":"UUTK13WE6","team_id":"TV83W4WBZ","name":"yesentorres","deleted":false,"color":"674b1b","real_name":"Yesenia + Torres","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Yesenia + Torres","real_name_normalized":"Yesenia Torres","display_name":"Yesenia Torres","display_name_normalized":"Yesenia + Torres","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gb1d9884842a","image_24":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1583878026},{"id":"UUW5E7SF3","team_id":"TV83W4WBZ","name":"norshonda.warren","deleted":false,"color":"4bbe2e","real_name":"SW","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"SW","real_name_normalized":"SW","display_name":"SW","display_name_normalized":"SW","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g33a4a608a6a","image_24":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1583872754},{"id":"UUXS7N05P","team_id":"TV83W4WBZ","name":"space_leah_api_projec","deleted":false,"color":"e96699","real_name":"LeahBot","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"LeahBot","real_name_normalized":"LeahBot","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gd1ee90cd32b","api_app_id":"AUUV0AX99","always_active":false,"bot_id":"BUV5H5PAN","image_24":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1583942929},{"id":"UV5UMJ4F6","team_id":"TV83W4WBZ","name":"leahwhughes","deleted":false,"color":"3c989f","real_name":"Leah + Hughes","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Leah + Hughes","real_name_normalized":"Leah Hughes","display_name":"Leah Hughes","display_name_normalized":"Leah + Hughes","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g05e8a60fb2a","image_24":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1583877799},{"id":"UV68ES05B","team_id":"TV83W4WBZ","name":"rebeccaroach12","deleted":false,"color":"9f69e7","real_name":"Becca + Roach","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Becca + Roach","real_name_normalized":"Becca Roach","display_name":"","display_name_normalized":"","status_text":"zenning + out and drinking tea","status_emoji":":tea:","status_expiration":0,"avatar_hash":"g97b58b9efa0","first_name":"Becca","last_name":"Roach","image_24":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":true,"is_owner":true,"is_primary_owner":true,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1584211950},{"id":"UV69NCUQY","team_id":"TV83W4WBZ","name":"space_sw_api_project","deleted":false,"color":"e7392d","real_name":"space_sw_api_project","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"space_sw_api_project","real_name_normalized":"space_sw_api_project","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g2695ae5a0c7","api_app_id":"AV5RMRMKN","always_active":false,"bot_id":"BV85N9WNB","first_name":"space_sw_api_project","last_name":"","image_24":"https:\/\/secure.gravatar.com\/avatar\/2695ae5a0c7c91e77bb05f8a437c5380.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/2695ae5a0c7c91e77bb05f8a437c5380.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/2695ae5a0c7c91e77bb05f8a437c5380.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/2695ae5a0c7c91e77bb05f8a437c5380.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/2695ae5a0c7c91e77bb05f8a437c5380.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/2695ae5a0c7c91e77bb05f8a437c5380.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1583893274},{"id":"UV8J3KKU5","team_id":"TV83W4WBZ","name":"space_becca_api_testi","deleted":false,"color":"684b6c","real_name":"space_becca_api_testi","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"space_becca_api_testi","real_name_normalized":"space_becca_api_testi","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g1572253725f","api_app_id":"AUX3QTQKD","always_active":false,"bot_id":"BVADJSEHM","first_name":"space_becca_api_testi","last_name":"","image_24":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1583962744},{"id":"UVA5KE0H4","team_id":"TV83W4WBZ","name":"yesenia_app","deleted":false,"color":"e0a729","real_name":"yesenia_app","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"yesenia_app","real_name_normalized":"yesenia_app","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gf34360f759b","api_app_id":"AUV59CB7U","always_active":false,"bot_id":"BV7FDL9LL","image_24":"https:\/\/secure.gravatar.com\/avatar\/f34360f759b97596f887a292520ed479.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/f34360f759b97596f887a292520ed479.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/f34360f759b97596f887a292520ed479.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/f34360f759b97596f887a292520ed479.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/f34360f759b97596f887a292520ed479.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/f34360f759b97596f887a292520ed479.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1583943022},{"id":"UVD5RQHB9","team_id":"TV83W4WBZ","name":"yienislackbot","deleted":false,"color":"2b6836","real_name":"yienislackbot","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"yienislackbot","real_name_normalized":"yienislackbot","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g3bf2249fbba","api_app_id":"AVARF5Q20","always_active":false,"bot_id":"BV17DLJ8Z","image_24":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1584049652},{"id":"UVDEMQMV4","team_id":"TV83W4WBZ","name":"yaynee8d","deleted":false,"color":"5b89d5","real_name":"Yieni","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Yieni","real_name_normalized":"Yieni","display_name":"Yieni","display_name_normalized":"Yieni","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g9a1079d7bce","image_24":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1584048223}],"cache_ts":1584326039,"response_metadata":{"next_cursor":""}}' + http_version: null + recorded_at: Mon, 16 Mar 2020 02:33:59 GMT +recorded_with: VCR 5.1.0 diff --git a/test/channel_test.rb b/test/channel_test.rb index b5487d24..3188696a 100644 --- a/test/channel_test.rb +++ b/test/channel_test.rb @@ -1,5 +1,11 @@ require_relative "test_helper" describe "Channel" do + describe "initialize" do + end + + describe "self.get" do # inherited from recipient + + end end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index a4c7681d..40dcf752 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -8,7 +8,9 @@ require 'minitest/reporters' require 'minitest/skip_dsl' require 'vcr' +require 'dotenv' +Dotenv.load Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new VCR.configure do |config| @@ -24,8 +26,9 @@ :match_requests_on => [:method, :uri, :body], # The http method, URI and body of a request all need to match } - # Don't leave our token lying around in a cassette file. - config.filter_sensitive_data("") do - ENV['SLACK_TOKEN'] + # get bot token + config.filter_sensitive_data("") do + ENV['BOT_TOKEN'] end + end diff --git a/test/user_test.rb b/test/user_test.rb index fc17da76..04e96103 100644 --- a/test/user_test.rb +++ b/test/user_test.rb @@ -1,5 +1,27 @@ require_relative "test_helper" +require_relative "../lib/user" describe "User" do + describe "initialize" do + end + + describe "self.get" do # inherited from recipient + it "gets a list of users" do + result = {} + VCR.use_cassette("users-list-endpoint") do + result = User.get("https://slack.com/api/users.list") + end + + expect(result).must_be_kind_of HTTParty::Response + expect(result["ok"]).must_equal true # ensure its not a false positive response + end + + it "raises an error when a call fails" do + VCR.use_cassette("users-list-endpoint") do + expect{ User.get("https://slack.com/api/bogus.endpoint") }.must_raise SlackAPIError + end + end + + end end \ No newline at end of file diff --git a/test/workspace_test.rb b/test/workspace_test.rb index 14cec3fe..929e06e7 100644 --- a/test/workspace_test.rb +++ b/test/workspace_test.rb @@ -1,5 +1,7 @@ require_relative "test_helper" describe "Workspace" do - + describe "initialize" do + end + end \ No newline at end of file From a0c96f75ae4c40a6fbe2d7c3c0e99bfec02cc156 Mon Sep 17 00:00:00 2001 From: Yesenia Date: Mon, 16 Mar 2020 01:55:34 -0700 Subject: [PATCH 03/11] Set up workspace constructor and test. Slack.rb updated and accomplishes Wave1 requirememts --- lib/channel.rb | 33 +++- lib/recipient.rb | 24 +-- lib/slack.rb | 32 +++- lib/user.rb | 18 +++ lib/workspace.rb | 31 +++- test/cassettes/channels-list-endpoint.yml | 148 ++++++++++++++++++ test/cassettes/workspace-test.yml | 175 ++++++++++++++++++++++ test/channel_test.rb | 36 ++++- test/user_test.rb | 16 ++ test/workspace_test.rb | 35 +++++ 10 files changed, 522 insertions(+), 26 deletions(-) create mode 100644 test/cassettes/channels-list-endpoint.yml create mode 100644 test/cassettes/workspace-test.yml diff --git a/lib/channel.rb b/lib/channel.rb index e3a1faa0..c036182d 100644 --- a/lib/channel.rb +++ b/lib/channel.rb @@ -1,5 +1,36 @@ require_relative "recipient" class Channel < Recipient + attr_reader :topic, :member_count -end \ No newline at end of file + def initialize( topic:, member_count:, name:, slack_id:) + super(slack_id: slack_id, name: name) + @topic = topic + @member_count = member_count + end + + # displays channels info to command line + def details + end + + # ----- CLASS METHODS ----- + + # gathers relevant information about channels in this workspace + def self.list_all + data = self.get("https://slack.com/api/conversations.list") + + channel_info = [] + + data["channels"].each do |item| + channel_info << Channel.new( + name: item["name"], + slack_id: item["id"], + topic: item["topic"]["value"], + member_count: item["num_members"] + ) + end + + return channel_info + end + +end diff --git a/lib/recipient.rb b/lib/recipient.rb index fe1f0b40..4bf69e65 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -9,18 +9,9 @@ def initialize(slack_id:, name:) @name = name end + # ----- IMPLEMENTED METHODS ----- - def send_message(msg_text) - - end - - def details - raise NotImplementedError, "Implement me in a child class!" - end - - # ----- CLASS METHODS ----- - - # gets desired data from API + # gets desired data from Slack API def self.get(url) requested_data = HTTParty.get(url, query: {token: ENV["BOT_TOKEN"]}) @@ -31,13 +22,22 @@ def self.get(url) return requested_data end + def send_message(message) + + end + + # ----- ABSTRACT METHODS ----- def self.list_all raise NotImplementedError, "Implement me in a child class!" end + def details + raise NotImplementedError, "Implement me in a child class!" + end + end -# create here so that it is accessible by all other classes in this project +# created here so that it is accessible by all other classes in this project class SlackAPIError < Exception end \ No newline at end of file diff --git a/lib/slack.rb b/lib/slack.rb index 5c9ce405..65896432 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -1,17 +1,43 @@ #!/usr/bin/env ruby require 'dotenv' require "table_print" - require_relative "workspace" Dotenv.load +# prompts user for their input and records it +def prompt_action + puts "Choose an option: list users, list channels, or quit." + return gets.chomp.downcase +end + +# controls command line interactivity def main - puts "Welcome to the Ada Slack CLI!" workspace = Workspace.new + puts "Welcome to the Ada Slack CLI! This Slack workspace currently has #{workspace.users.count} users and #{workspace.channels.count} channels." + + user_input = prompt_action + + until user_input == "quit" + + case user_input + + when "list users" + tp workspace.users, "slack_id", "name", "real_name" + + when "list channels" + tp workspace.channels, "name", "topic", "member_count", "slack_id" + + else + puts "I cannot perform \"#{user_input}\". Please try again.\n" + end + + user_input = prompt_action # call again until valid input is provided + end + + puts "Thank you for using the Ada Slack CLI. Goodbye!" - puts "Thank you for using the Ada Slack CLI" end main if __FILE__ == $PROGRAM_NAME \ No newline at end of file diff --git a/lib/user.rb b/lib/user.rb index f59a583d..3601bc46 100644 --- a/lib/user.rb +++ b/lib/user.rb @@ -1,6 +1,7 @@ require_relative "recipient" class User < Recipient + attr :real_name, :status_text, :status_emoji def initialize(real_name:, status_text:, status_emoji:, name:, slack_id:) @@ -10,12 +11,29 @@ def initialize(real_name:, status_text:, status_emoji:, name:, slack_id:) @status_emoji = status_emoji end + # displays user info to command line def details end # ----- CLASS METHODS ----- + # gathers relevant information about users in this workspace def self.list_all + data = self.get("https://slack.com/api/users.list") + + user_info = [] + + data["members"].each do |user| + user_info << User.new( + name: user["name"], + slack_id: user["id"], + real_name: user["profile"]["real_name"], + status_emoji: user["profile"]["status_emoji"], + status_text: user["profile"]["status_text"] + ) + end + + return user_info end end \ No newline at end of file diff --git a/lib/workspace.rb b/lib/workspace.rb index cf61c6bb..65027ea0 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -1,12 +1,27 @@ +require_relative "user" +require_relative "channel" -class Workspace + class Workspace - attr_reader :users, :channels, :selected + attr_reader :users, :channels, :selected - def initialize(users: [], channels: []) - @users = users - @channels = channels - @selected = nil - end + def initialize(users: [], channels: []) + @users = User.list_all + @channels = Channel.list_all + @selected = nil + end + + def select_channel + end + + def select_user + end -end \ No newline at end of file + # displays workspace info to command line + def show_details + end + + def send_message + end + + end diff --git a/test/cassettes/channels-list-endpoint.yml b/test/cassettes/channels-list-endpoint.yml new file mode 100644 index 00000000..773bb63d --- /dev/null +++ b/test/cassettes/channels-list-endpoint.yml @@ -0,0 +1,148 @@ +--- +http_interactions: +- request: + method: get + uri: https://slack.com/api/conversations.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '622' + Connection: + - keep-alive + Date: + - Mon, 16 Mar 2020 03:22:52 GMT + Server: + - Apache + X-Slack-Req-Id: + - d7f49c1caf2eb218be923f6b59c6ce41 + X-Oauth-Scopes: + - chat:write,channels:read,users:read + X-Accepted-Oauth-Scopes: + - channels:read,groups:read,mpim:read,im:read,read + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Slack-Backend: + - h + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-n3sn + X-Cache: + - Miss from cloudfront + Via: + - 1.1 73bd23077f64204bc8f5efea09d16ebd.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - HIO51-C1 + X-Amz-Cf-Id: + - uMtHnT4m_QKtD8dhxSrC3V3LdRPDDFgxFZ0VFcnXlaj1n5Dr4I9DZw== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CUTE4M96W","name":"general","is_channel":true,"is_group":false,"is_im":false,"created":1583872630,"is_archived":false,"is_general":true,"unlinked":0,"name_normalized":"general","is_shared":false,"parent_conversation":null,"creator":"UV68ES05B","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV83W4WBZ"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UV68ES05B","last_set":1583872630},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UV68ES05B","last_set":1583872630},"previous_names":[],"num_members":6},{"id":"CUTE4MTD0","name":"api-testing","is_channel":true,"is_group":false,"is_im":false,"created":1583872631,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"api-testing","is_shared":false,"parent_conversation":null,"creator":"UV68ES05B","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV83W4WBZ"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"For + covid testing","creator":"UV68ES05B","last_set":1583958329},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":6},{"id":"CV83W5SS3","name":"random","is_channel":true,"is_group":false,"is_im":false,"created":1583872630,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"random","is_shared":false,"parent_conversation":null,"creator":"UV68ES05B","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV83W4WBZ"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UV68ES05B","last_set":1583872630},"purpose":{"value":"A + place for non-work-related flimflam, faffing, hodge-podge or jibber-jabber + you''d prefer to keep out of more focused work-related channels.","creator":"UV68ES05B","last_set":1583872630},"previous_names":[],"num_members":6}],"response_metadata":{"next_cursor":""}}' + http_version: null + recorded_at: Mon, 16 Mar 2020 03:22:52 GMT +- request: + method: get + uri: https://slack.com/api/bogus.endpoint?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '80' + Connection: + - keep-alive + Date: + - Mon, 16 Mar 2020 03:34:25 GMT + Server: + - Apache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Referrer-Policy: + - no-referrer + X-Slack-Backend: + - h + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Slack-Req-Id: + - 5e3c119a4d761c801d6c1e5004dc0110 + X-Xss-Protection: + - '0' + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-lemb + X-Cache: + - Miss from cloudfront + Via: + - 1.1 6faf668782fbb3c2aa466f6fccc76047.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - HIO51-C1 + X-Amz-Cf-Id: + - BF6ljb0_yTCNJXXC1w-LfDFyHbnMc5ylhJLWzofNTtVqMRDo0vmRtw== + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"unknown_method","req_method":"bogus.endpoint"}' + http_version: null + recorded_at: Mon, 16 Mar 2020 03:34:25 GMT +recorded_with: VCR 5.1.0 diff --git a/test/cassettes/workspace-test.yml b/test/cassettes/workspace-test.yml new file mode 100644 index 00000000..b7a4c1b8 --- /dev/null +++ b/test/cassettes/workspace-test.yml @@ -0,0 +1,175 @@ +--- +http_interactions: +- request: + method: get + uri: https://slack.com/api/users.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '2096' + Connection: + - keep-alive + Date: + - Mon, 16 Mar 2020 07:57:29 GMT + Server: + - Apache + X-Slack-Req-Id: + - b8e0a4605b1e3fdf4d9a0f760d7a3423 + X-Oauth-Scopes: + - chat:write,channels:read,users:read + X-Accepted-Oauth-Scopes: + - users:read + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Slack-Backend: + - h + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-4d24 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 e66162aafd55b64ba1478ff7105150fb.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C2 + X-Amz-Cf-Id: + - p-WEzzov2EAygLCT18X3LW6j0B6mnJGhqXGOAxHSQZ3074DXz2OWag== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TV83W4WBZ","name":"slackbot","deleted":false,"color":"757575","real_name":"Slackbot","tz":null,"tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Slackbot","real_name_normalized":"Slackbot","display_name":"Slackbot","display_name_normalized":"Slackbot","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"sv41d8cd98f0","always_active":true,"first_name":"slackbot","last_name":"","image_24":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_24.png","image_32":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_32.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_72.png","image_192":"https:\/\/a.slack-edge.com\/80588\/marketing\/img\/avatars\/slackbot\/avatar-slackbot.png","image_512":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":0},{"id":"UUTK13WE6","team_id":"TV83W4WBZ","name":"yesentorres","deleted":false,"color":"674b1b","real_name":"Yesenia + Torres","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Yesenia + Torres","real_name_normalized":"Yesenia Torres","display_name":"Yesenia Torres","display_name_normalized":"Yesenia + Torres","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gb1d9884842a","image_24":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/b1d9884842a1ca2da9330970e99d57bc.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0020-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1583878026},{"id":"UUW5E7SF3","team_id":"TV83W4WBZ","name":"norshonda.warren","deleted":false,"color":"4bbe2e","real_name":"SW","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"SW","real_name_normalized":"SW","display_name":"SW","display_name_normalized":"SW","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g33a4a608a6a","image_24":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/33a4a608a6a64f3a5773f2081a0a0cfe.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0021-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1583872754},{"id":"UUXS7N05P","team_id":"TV83W4WBZ","name":"space_leah_api_projec","deleted":false,"color":"e96699","real_name":"LeahBot","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"LeahBot","real_name_normalized":"LeahBot","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gd1ee90cd32b","api_app_id":"AUUV0AX99","always_active":false,"bot_id":"BUV5H5PAN","image_24":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/d1ee90cd32bab3714e986e7ea1850584.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0023-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1583942929},{"id":"UV5UMJ4F6","team_id":"TV83W4WBZ","name":"leahwhughes","deleted":false,"color":"3c989f","real_name":"Leah + Hughes","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Leah + Hughes","real_name_normalized":"Leah Hughes","display_name":"Leah Hughes","display_name_normalized":"Leah + Hughes","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g05e8a60fb2a","image_24":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/05e8a60fb2a3347706338b71300d4500.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0025-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1583877799},{"id":"UV68ES05B","team_id":"TV83W4WBZ","name":"rebeccaroach12","deleted":false,"color":"9f69e7","real_name":"Becca + Roach","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Becca + Roach","real_name_normalized":"Becca Roach","display_name":"","display_name_normalized":"","status_text":"zenning + out and drinking tea","status_emoji":":tea:","status_expiration":0,"avatar_hash":"g97b58b9efa0","first_name":"Becca","last_name":"Roach","image_24":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/97b58b9efa03ef40b9258bb7579b3ba1.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0012-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":true,"is_owner":true,"is_primary_owner":true,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1584211950},{"id":"UV69NCUQY","team_id":"TV83W4WBZ","name":"space_sw_api_project","deleted":false,"color":"e7392d","real_name":"space_sw_api_project","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"space_sw_api_project","real_name_normalized":"space_sw_api_project","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g2695ae5a0c7","api_app_id":"AV5RMRMKN","always_active":false,"bot_id":"BV85N9WNB","first_name":"space_sw_api_project","last_name":"","image_24":"https:\/\/secure.gravatar.com\/avatar\/2695ae5a0c7c91e77bb05f8a437c5380.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/2695ae5a0c7c91e77bb05f8a437c5380.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/2695ae5a0c7c91e77bb05f8a437c5380.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/2695ae5a0c7c91e77bb05f8a437c5380.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/2695ae5a0c7c91e77bb05f8a437c5380.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/2695ae5a0c7c91e77bb05f8a437c5380.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1583893274},{"id":"UV8J3KKU5","team_id":"TV83W4WBZ","name":"space_becca_api_testi","deleted":false,"color":"684b6c","real_name":"space_becca_api_testi","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"space_becca_api_testi","real_name_normalized":"space_becca_api_testi","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g1572253725f","api_app_id":"AUX3QTQKD","always_active":false,"bot_id":"BVADJSEHM","first_name":"space_becca_api_testi","last_name":"","image_24":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/1572253725f588f3e07ee78a9c8c3094.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1583962744},{"id":"UVA5KE0H4","team_id":"TV83W4WBZ","name":"yesenia_app","deleted":false,"color":"e0a729","real_name":"yesenia_app","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"yesenia_app","real_name_normalized":"yesenia_app","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gf34360f759b","api_app_id":"AUV59CB7U","always_active":false,"bot_id":"BV7FDL9LL","image_24":"https:\/\/secure.gravatar.com\/avatar\/f34360f759b97596f887a292520ed479.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/f34360f759b97596f887a292520ed479.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/f34360f759b97596f887a292520ed479.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/f34360f759b97596f887a292520ed479.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/f34360f759b97596f887a292520ed479.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/f34360f759b97596f887a292520ed479.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0005-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1583943022},{"id":"UVD5RQHB9","team_id":"TV83W4WBZ","name":"yienislackbot","deleted":false,"color":"2b6836","real_name":"yienislackbot","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"yienislackbot","real_name_normalized":"yienislackbot","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g3bf2249fbba","api_app_id":"AVARF5Q20","always_active":false,"bot_id":"BV17DLJ8Z","image_24":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/3bf2249fbba5a2e6ae1a6c2e4931cfa1.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0001-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1584049652},{"id":"UVDEMQMV4","team_id":"TV83W4WBZ","name":"yaynee8d","deleted":false,"color":"5b89d5","real_name":"Yieni","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Yieni","real_name_normalized":"Yieni","display_name":"Yieni","display_name_normalized":"Yieni","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g9a1079d7bce","image_24":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/9a1079d7bcebb14e450daae2ffb8fb82.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0018-512.png","status_text_canonical":"","team":"TV83W4WBZ"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1584048223}],"cache_ts":1584345449,"response_metadata":{"next_cursor":""}}' + http_version: null + recorded_at: Mon, 16 Mar 2020 07:57:29 GMT +- request: + method: get + uri: https://slack.com/api/conversations.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '622' + Connection: + - keep-alive + Date: + - Mon, 16 Mar 2020 07:57:29 GMT + Server: + - Apache + X-Slack-Req-Id: + - 27f98c18351115a82cef9b96bc1a6c4c + X-Oauth-Scopes: + - chat:write,channels:read,users:read + X-Accepted-Oauth-Scopes: + - channels:read,groups:read,mpim:read,im:read,read + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Slack-Backend: + - h + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-2nvs + X-Cache: + - Miss from cloudfront + Via: + - 1.1 5565a51537c689d1d16f6b4d41f40082.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C2 + X-Amz-Cf-Id: + - yl6GGrtjQfaqecRUEPRwGtCTgxZKztV4eExlQj-i99s58EvZuLIuTQ== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CUTE4M96W","name":"general","is_channel":true,"is_group":false,"is_im":false,"created":1583872630,"is_archived":false,"is_general":true,"unlinked":0,"name_normalized":"general","is_shared":false,"parent_conversation":null,"creator":"UV68ES05B","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV83W4WBZ"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"Company-wide + announcements and work-based matters","creator":"UV68ES05B","last_set":1583872630},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UV68ES05B","last_set":1583872630},"previous_names":[],"num_members":6},{"id":"CUTE4MTD0","name":"api-testing","is_channel":true,"is_group":false,"is_im":false,"created":1583872631,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"api-testing","is_shared":false,"parent_conversation":null,"creator":"UV68ES05B","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV83W4WBZ"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"For + covid testing","creator":"UV68ES05B","last_set":1583958329},"purpose":{"value":"","creator":"","last_set":0},"previous_names":[],"num_members":6},{"id":"CV83W5SS3","name":"random","is_channel":true,"is_group":false,"is_im":false,"created":1583872630,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"random","is_shared":false,"parent_conversation":null,"creator":"UV68ES05B","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV83W4WBZ"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"Non-work + banter and water cooler conversation","creator":"UV68ES05B","last_set":1583872630},"purpose":{"value":"A + place for non-work-related flimflam, faffing, hodge-podge or jibber-jabber + you''d prefer to keep out of more focused work-related channels.","creator":"UV68ES05B","last_set":1583872630},"previous_names":[],"num_members":6}],"response_metadata":{"next_cursor":""}}' + http_version: null + recorded_at: Mon, 16 Mar 2020 07:57:29 GMT +recorded_with: VCR 5.1.0 diff --git a/test/channel_test.rb b/test/channel_test.rb index 3188696a..7019acac 100644 --- a/test/channel_test.rb +++ b/test/channel_test.rb @@ -1,11 +1,43 @@ require_relative "test_helper" +require_relative "../lib/channel" describe "Channel" do describe "initialize" do end describe "self.get" do # inherited from recipient - + it "gets a list of channels" do + result = {} + VCR.use_cassette("channels-list-endpoint") do + result = Channel.get("https://slack.com/api/conversations.list") + end + + expect(result).must_be_kind_of HTTParty::Response + expect(result["ok"]).must_equal true # ensure its not a false positive response + end + + it "raises an error when a call fails" do + VCR.use_cassette("channels-list-endpoint") do + expect{ Channel.get("https://slack.com/api/bogus.endpoint") }.must_raise SlackAPIError + end + end end - + + describe "self.list" do + it "returns a valid list of channels" do + result = [] + + VCR.use_cassette("channels-list-endpoint") do + result = Channel.list_all + end + + expect(result).must_be_kind_of Array + expect(result.length).must_be :>, 0 + result.each do |channel| + expect(channel).must_be_kind_of Channel + end + end + + end + end \ No newline at end of file diff --git a/test/user_test.rb b/test/user_test.rb index 04e96103..79ce7aa3 100644 --- a/test/user_test.rb +++ b/test/user_test.rb @@ -21,6 +21,22 @@ expect{ User.get("https://slack.com/api/bogus.endpoint") }.must_raise SlackAPIError end end + end + + describe "self.list" do + it "returns a valid list of users" do + result = [] + + VCR.use_cassette("users-list-endpoint") do + result = User.list_all + end + + expect(result).must_be_kind_of Array + expect(result.length).must_be :>, 0 + result.each do |user| + expect(user).must_be_kind_of User + end + end end diff --git a/test/workspace_test.rb b/test/workspace_test.rb index 929e06e7..884661e4 100644 --- a/test/workspace_test.rb +++ b/test/workspace_test.rb @@ -1,7 +1,42 @@ require_relative "test_helper" +require_relative "../lib/workspace" describe "Workspace" do + before do + VCR.use_cassette("workspace-test") do + @test_workspace = Workspace.new() + end + end + describe "initialize" do + it "creates an instance of a Workspace object" do + expect(@test_workspace).must_be_kind_of Workspace + end + + it "creates an array of User objects" do + expect(@test_workspace.users).must_be_kind_of Array + expect(@test_workspace.users.length).must_equal 11 # Assumption: This workspace will not have any more users created + + end + + it "creates an array of Channel objects" do + expect(@test_workspace.channels).must_be_kind_of Array + expect(@test_workspace.channels.length).must_equal 3 # Assumption: This workspace will not have any more channels created + end end + + xdescribe "select_channel" do + xit "" do + end + end + + xdescribe "select_user" do + end + + xdescribe "show_details" do + end + + xdescribe "send_message" do + end end \ No newline at end of file From 23bc3fdccb6eed8efad36730d9ca77365f3095f8 Mon Sep 17 00:00:00 2001 From: Yesenia Date: Mon, 16 Mar 2020 02:20:39 -0700 Subject: [PATCH 04/11] Added some newline chars to slack.rb to make CLI more readable --- lib/channel.rb | 5 ++--- lib/recipient.rb | 4 ++-- lib/slack.rb | 17 +++++++++++++---- lib/user.rb | 5 ++--- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/lib/channel.rb b/lib/channel.rb index c036182d..d9408291 100644 --- a/lib/channel.rb +++ b/lib/channel.rb @@ -9,12 +9,11 @@ def initialize( topic:, member_count:, name:, slack_id:) @member_count = member_count end - # displays channels info to command line + # displays channels details to command line def details + tp self, "slack_id", "name", "topic", "member_count" end - # ----- CLASS METHODS ----- - # gathers relevant information about channels in this workspace def self.list_all data = self.get("https://slack.com/api/conversations.list") diff --git a/lib/recipient.rb b/lib/recipient.rb index 4bf69e65..79805750 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -1,6 +1,6 @@ require "httparty" -class Recipient # abstract class +class Recipient attr_reader :slack_id, :name @@ -38,6 +38,6 @@ def details end -# created here so that it is accessible by all other classes in this project +# custom exception created here so that it is accessible by all other classes in this project class SlackAPIError < Exception end \ No newline at end of file diff --git a/lib/slack.rb b/lib/slack.rb index 65896432..c59d87e3 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -7,7 +7,9 @@ # prompts user for their input and records it def prompt_action - puts "Choose an option: list users, list channels, or quit." + puts "You have six options: list users, list channels, select user, select channel, details or quit." + puts "\n" + print "Please enter your choice: " return gets.chomp.downcase end @@ -15,8 +17,10 @@ def prompt_action def main workspace = Workspace.new + puts "\n" puts "Welcome to the Ada Slack CLI! This Slack workspace currently has #{workspace.users.count} users and #{workspace.channels.count} channels." - + puts "\n" + user_input = prompt_action until user_input == "quit" @@ -25,18 +29,23 @@ def main when "list users" tp workspace.users, "slack_id", "name", "real_name" + puts "\n" when "list channels" tp workspace.channels, "name", "topic", "member_count", "slack_id" + puts "\n" else - puts "I cannot perform \"#{user_input}\". Please try again.\n" + puts "\n" + puts "I cannot perform \"#{user_input}\". Please try again ->" + puts "\n" end user_input = prompt_action # call again until valid input is provided end - puts "Thank you for using the Ada Slack CLI. Goodbye!" + puts "\n" + puts "Okay, thank you for using the Ada Slack CLI. Goodbye!" end diff --git a/lib/user.rb b/lib/user.rb index 3601bc46..60bab485 100644 --- a/lib/user.rb +++ b/lib/user.rb @@ -11,12 +11,11 @@ def initialize(real_name:, status_text:, status_emoji:, name:, slack_id:) @status_emoji = status_emoji end - # displays user info to command line + # displays user details to command line def details + tp self, "slack_id", "name", "real_name" end - # ----- CLASS METHODS ----- - # gathers relevant information about users in this workspace def self.list_all data = self.get("https://slack.com/api/users.list") From 961c3436b019d4e54a22dae5c6e111b6eb3f59d0 Mon Sep 17 00:00:00 2001 From: Yesenia Date: Mon, 16 Mar 2020 08:01:02 -0700 Subject: [PATCH 05/11] select channel functionality tested and integrated into project --- lib/slack.rb | 6 ++++++ lib/workspace.rb | 10 +++++++++- test/channel_test.rb | 9 +++++++++ test/user_test.rb | 9 +++++++++ test/workspace_test.rb | 33 +++++++++++++++++++++++++++++---- 5 files changed, 62 insertions(+), 5 deletions(-) diff --git a/lib/slack.rb b/lib/slack.rb index c59d87e3..3880f62d 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -35,6 +35,12 @@ def main tp workspace.channels, "name", "topic", "member_count", "slack_id" puts "\n" + when "select channel" + print "Please enter the channel name or ID: " + requested_channel = gets.chomp + puts workspace.select_channel(requested_channel) + puts "\n" + else puts "\n" puts "I cannot perform \"#{user_input}\". Please try again ->" diff --git a/lib/workspace.rb b/lib/workspace.rb index 65027ea0..c7ed0f03 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -11,7 +11,15 @@ def initialize(users: [], channels: []) @selected = nil end - def select_channel + def select_channel(requested_channel) + channels.each do |channel| + if channel.name == requested_channel || channel.slack_id == requested_channel + @selected = channel + return "Channel titled \"#{selected.name}\" has been selected." + end + end + + return "Sorry, channel \"#{requested_channel}\" does not exist in this workspace." end def select_user diff --git a/test/channel_test.rb b/test/channel_test.rb index 7019acac..0ef60bc9 100644 --- a/test/channel_test.rb +++ b/test/channel_test.rb @@ -3,6 +3,15 @@ describe "Channel" do describe "initialize" do + before do + VCR.use_cassette("channels-list-endpoint") do + @test_channel = Channel.new(topic: "talk about stuffs", member_count: 2, name: "meaningless-chatter", slack_id:"CHAT1234") + end + end + + it "creates an instance of a Channel object with string & int keywords" do + expect(@test_channel).must_be_kind_of Channel + end end describe "self.get" do # inherited from recipient diff --git a/test/user_test.rb b/test/user_test.rb index 79ce7aa3..d8ba21de 100644 --- a/test/user_test.rb +++ b/test/user_test.rb @@ -3,6 +3,15 @@ describe "User" do describe "initialize" do + before do + VCR.use_cassette("users-list-endpoint") do + @test_user = User.new(real_name: "Hugo", status_text: "WFH", status_emoji: "", name: "hugo95", slack_id:"1234HUGO") + end + end + + it "creates an instance of a User object with all string keywords" do + expect(@test_user).must_be_kind_of User + end end describe "self.get" do # inherited from recipient diff --git a/test/workspace_test.rb b/test/workspace_test.rb index 884661e4..7aba5d31 100644 --- a/test/workspace_test.rb +++ b/test/workspace_test.rb @@ -25,14 +25,39 @@ end end - xdescribe "select_channel" do - xit "" do - end + xdescribe "select_user" do end - xdescribe "select_user" do + describe "select_channel(requested_channel)" do + before do + VCR.use_cassette("workspace-test") do + @test_workspace = Workspace.new() + end + end + + it "returns channel name that matches requested channel name" do + requested_channel = "general" + output = @test_workspace.select_channel(requested_channel) + expect(output).must_equal "Channel titled \"#{requested_channel}\" has been selected." + end + + it "returns channel name associated with requested channel slack id" do + requested_channel = "CUTE4M96W" + associated_channel = @test_workspace.channels.find { |channel| channel.slack_id == requested_channel } + output = @test_workspace.select_channel(requested_channel) + expect(output).must_equal "Channel titled \"#{associated_channel.name}\" has been selected." + end + + it "returns a message if no channel name is found" do + requested_channel = "doesnotexist" + output = @test_workspace.select_channel(requested_channel) + expect(output).must_equal "Sorry, channel \"#{requested_channel}\" does not exist in this workspace." + end + end + + xdescribe "show_details" do end From 0801cce7af18afaebbaec66514ff58fe7099b9b9 Mon Sep 17 00:00:00 2001 From: Yesenia Date: Mon, 16 Mar 2020 08:18:31 -0700 Subject: [PATCH 06/11] select user functionality tested and integrated into project --- lib/slack.rb | 8 +++++++- lib/workspace.rb | 16 ++++++++++++---- test/workspace_test.rb | 28 ++++++++++++++++++++++++++-- 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/lib/slack.rb b/lib/slack.rb index 3880f62d..7e4ccee2 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -35,8 +35,14 @@ def main tp workspace.channels, "name", "topic", "member_count", "slack_id" puts "\n" + when "select user" + print "Please enter the user's username or ID: " + requested_user = gets.chomp + puts workspace.select_user(requested_user) + puts "\n" + when "select channel" - print "Please enter the channel name or ID: " + print "Please enter the channel's name or ID: " requested_channel = gets.chomp puts workspace.select_channel(requested_channel) puts "\n" diff --git a/lib/workspace.rb b/lib/workspace.rb index c7ed0f03..9165981c 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -11,6 +11,17 @@ def initialize(users: [], channels: []) @selected = nil end + def select_user(requested_user) + users.each do |user| + if user.name == requested_user || user.slack_id == requested_user + @selected = user + return "User \"#{selected.real_name}\" has been selected." + end + end + + return "Sorry, user \"#{requested_user}\" does not exist in this workspace." + end + def select_channel(requested_channel) channels.each do |channel| if channel.name == requested_channel || channel.slack_id == requested_channel @@ -22,10 +33,7 @@ def select_channel(requested_channel) return "Sorry, channel \"#{requested_channel}\" does not exist in this workspace." end - def select_user - end - - # displays workspace info to command line + # displays workspace info to command line based on selected recipient def show_details end diff --git a/test/workspace_test.rb b/test/workspace_test.rb index 7aba5d31..8507fe50 100644 --- a/test/workspace_test.rb +++ b/test/workspace_test.rb @@ -25,7 +25,32 @@ end end - xdescribe "select_user" do + describe "select_user(requested_user)" do + before do + VCR.use_cassette("workspace-test") do + @test_workspace = Workspace.new() + end + end + + it "returns user's name associated with requested username" do + requested_user = "yesentorres" + associated_user = @test_workspace.users.find { |user| user.name == requested_user } + output = @test_workspace.select_user(requested_user) + expect(output).must_equal "User \"#{associated_user.real_name}\" has been selected." + end + + it "returns user's name associated with requested user slack id" do + requested_user= "UUTK13WE6" + associated_user = @test_workspace.users.find { |user| user.slack_id == requested_user } + output = @test_workspace.select_user(requested_user) + expect(output).must_equal "User \"#{associated_user.real_name}\" has been selected." + end + + it "returns a message if no user is found" do + requested_user = "doesnotexist" + output = @test_workspace.select_user(requested_user) + expect(output).must_equal "Sorry, user \"#{requested_user}\" does not exist in this workspace." + end end describe "select_channel(requested_channel)" do @@ -53,7 +78,6 @@ output = @test_workspace.select_channel(requested_channel) expect(output).must_equal "Sorry, channel \"#{requested_channel}\" does not exist in this workspace." end - end From 5a4f81ce4d1e3d3bf325faf7fe6c71ad41eb5b25 Mon Sep 17 00:00:00 2001 From: Yesenia Date: Mon, 16 Mar 2020 08:34:56 -0700 Subject: [PATCH 07/11] integrated display_details functionality, but did not test --- lib/slack.rb | 12 +++++++++++- lib/workspace.rb | 3 ++- test/channel_test.rb | 2 -- test/test_helper.rb | 1 - test/user_test.rb | 2 -- test/workspace_test.rb | 7 ++++--- 6 files changed, 17 insertions(+), 10 deletions(-) diff --git a/lib/slack.rb b/lib/slack.rb index 7e4ccee2..876960b6 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -7,7 +7,7 @@ # prompts user for their input and records it def prompt_action - puts "You have six options: list users, list channels, select user, select channel, details or quit." + puts "You have six options: list users, list channels, select user, select channel, display details, or quit." puts "\n" print "Please enter your choice: " return gets.chomp.downcase @@ -46,6 +46,16 @@ def main requested_channel = gets.chomp puts workspace.select_channel(requested_channel) puts "\n" + + when "display details" + if workspace.selected == nil + puts "You must \"select user\" or \"select channel\" first." + puts "\n" + else + workspace.display_details + user_input = nil + puts "\n" + end else puts "\n" diff --git a/lib/workspace.rb b/lib/workspace.rb index 9165981c..62fbbe9d 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -34,7 +34,8 @@ def select_channel(requested_channel) end # displays workspace info to command line based on selected recipient - def show_details + def display_details + return @selected.details end def send_message diff --git a/test/channel_test.rb b/test/channel_test.rb index 0ef60bc9..0a3d96a8 100644 --- a/test/channel_test.rb +++ b/test/channel_test.rb @@ -46,7 +46,5 @@ expect(channel).must_be_kind_of Channel end end - end - end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index 40dcf752..32e82ebe 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -30,5 +30,4 @@ config.filter_sensitive_data("") do ENV['BOT_TOKEN'] end - end diff --git a/test/user_test.rb b/test/user_test.rb index d8ba21de..8657cc26 100644 --- a/test/user_test.rb +++ b/test/user_test.rb @@ -46,7 +46,5 @@ 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 index 8507fe50..36c80246 100644 --- a/test/workspace_test.rb +++ b/test/workspace_test.rb @@ -80,9 +80,10 @@ end end - - - xdescribe "show_details" do + + xdescribe "display_details" do + # TODO: write tests for this method + # i was unsure how to verify command line output end xdescribe "send_message" do From 102759d29b2d91ac13d704a6094fb758f770663b Mon Sep 17 00:00:00 2001 From: Yesenia Date: Mon, 16 Mar 2020 08:43:17 -0700 Subject: [PATCH 08/11] left comments where remaining work needs to be done to complete Wave 3 --- lib/recipient.rb | 2 +- lib/slack.rb | 2 ++ lib/workspace.rb | 1 + test/workspace_test.rb | 2 ++ 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/recipient.rb b/lib/recipient.rb index 79805750..63f5ca70 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -23,7 +23,7 @@ def self.get(url) end def send_message(message) - + #TODO: implement send_message end # ----- ABSTRACT METHODS ----- diff --git a/lib/slack.rb b/lib/slack.rb index 876960b6..c532da17 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -57,6 +57,8 @@ def main puts "\n" end + #TODO: integrate send message functionality + else puts "\n" puts "I cannot perform \"#{user_input}\". Please try again ->" diff --git a/lib/workspace.rb b/lib/workspace.rb index 62fbbe9d..85cd3a82 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -39,6 +39,7 @@ def display_details end def send_message + # TODO: implement send_message end end diff --git a/test/workspace_test.rb b/test/workspace_test.rb index 36c80246..b19dd22a 100644 --- a/test/workspace_test.rb +++ b/test/workspace_test.rb @@ -87,6 +87,8 @@ end xdescribe "send_message" do + # TODO: write tests for this method + # i could not get my bot to post messages end end \ No newline at end of file From c999d633b9ff4b8f6f9883a9fe0fedbf21b03e79 Mon Sep 17 00:00:00 2001 From: Yesenia Date: Mon, 23 Mar 2020 22:05:50 -0700 Subject: [PATCH 09/11] incorporated and tested wave 3 functionality --- lib/recipient.rb | 15 +- lib/slack.rb | 16 ++- lib/workspace.rb | 5 +- test/cassettes/post-messages.yml | 229 +++++++++++++++++++++++++++++++ test/workspace_test.rb | 58 ++++++-- 5 files changed, 309 insertions(+), 14 deletions(-) create mode 100644 test/cassettes/post-messages.yml diff --git a/lib/recipient.rb b/lib/recipient.rb index 63f5ca70..1fbf3393 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -22,8 +22,21 @@ def self.get(url) return requested_data end + # post a message to a slack channel def send_message(message) - #TODO: implement send_message + message_reciever = self.slack_id + + sent_message_details = HTTParty.post("https://slack.com/api/chat.postMessage", + query: {token: ENV["BOT_TOKEN"], channel: message_reciever, text: message} ) + + if sent_message_details["ok"] == false + raise SlackAPIError, "Encountered error: #{sent_message_details["error"]}" + else + puts "\n" + puts "Message sent sucessfully." + end + + return sent_message_details end # ----- ABSTRACT METHODS ----- diff --git a/lib/slack.rb b/lib/slack.rb index c532da17..d4e6f619 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -7,7 +7,7 @@ # prompts user for their input and records it def prompt_action - puts "You have six options: list users, list channels, select user, select channel, display details, or quit." + puts "You have six options: list users, list channels, select user, select channel, display details, send message, or quit." puts "\n" print "Please enter your choice: " return gets.chomp.downcase @@ -57,8 +57,18 @@ def main puts "\n" end - #TODO: integrate send message functionality - + when "send message" + if workspace.selected == nil + puts "You must \"select user\" or \"select channel\" first." + puts "\n" + else + print "Enter your message: " + message = gets.chomp + workspace.send_message(message) + user_input = nil + puts "\n" + end + else puts "\n" puts "I cannot perform \"#{user_input}\". Please try again ->" diff --git a/lib/workspace.rb b/lib/workspace.rb index 85cd3a82..b241f63c 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -38,8 +38,9 @@ def display_details return @selected.details end - def send_message - # TODO: implement send_message + # posts a message in the selected channel in workspace + def send_message(message_text) + @selected.send_message(message_text) end end diff --git a/test/cassettes/post-messages.yml b/test/cassettes/post-messages.yml new file mode 100644 index 00000000..9523d56a --- /dev/null +++ b/test/cassettes/post-messages.yml @@ -0,0 +1,229 @@ +--- +http_interactions: +- request: + method: post + uri: https://slack.com/api/chat.postMessage?channel=CUTE4M96W&text=Hey%20I%20can%20post%20messages!&token= + body: + encoding: UTF-8 + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '330' + Connection: + - keep-alive + Date: + - Tue, 24 Mar 2020 03:49:30 GMT + Server: + - Apache + X-Slack-Req-Id: + - 136be28e56e8134b14cf679b0ce71278 + X-Oauth-Scopes: + - chat:write,channels:read,users:read + X-Accepted-Oauth-Scopes: + - chat:write + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Slack-Backend: + - h + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-4pwe + X-Cache: + - Miss from cloudfront + Via: + - 1.1 72b77c557ac4c265c32d99bdef4e9d6a.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - IAD79-C3 + X-Amz-Cf-Id: + - mFF4H1KNEaXgOCsomXykFNsI0ktm1_OGbbQBqOOFYoG4XRIzD-Driw== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channel":"CUTE4M96W","ts":"1585021770.000100","message":{"bot_id":"BV7FDL9LL","type":"message","text":"Hey + I can post messages!","user":"UVA5KE0H4","ts":"1585021770.000100","team":"TV83W4WBZ","bot_profile":{"id":"BV7FDL9LL","deleted":false,"name":"Yesenia + App","updated":1583943022,"app_id":"AUV59CB7U","icons":{"image_36":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/bot_36.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/bot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/service_72.png"},"team_id":"TV83W4WBZ"}}}' + http_version: null + recorded_at: Tue, 24 Mar 2020 03:49:30 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage?channel=CHAT1234&text=Hey%20I%20can%20post%20messages!&token= + body: + encoding: UTF-8 + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '60' + Connection: + - keep-alive + Date: + - Tue, 24 Mar 2020 04:41:14 GMT + Server: + - Apache + X-Slack-Req-Id: + - d101672e7d5ef874fb74ac3e941ced7d + X-Oauth-Scopes: + - chat:write,channels:read,users:read + X-Accepted-Oauth-Scopes: + - chat:write + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Slack-Backend: + - h + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-hnt8 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 1f2a017323162153f3cbc068c08d683d.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - LAX50-C2 + X-Amz-Cf-Id: + - oRqWWAM1OGNtdkNjG0HaA4JevyTdfjup8loxpgLjtJtXAx6_W3f6xw== + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"channel_not_found"}' + http_version: null + recorded_at: Tue, 24 Mar 2020 04:41:14 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage?channel=CUTE4MTD0&text=heeeey%20everyone!%20:)&token= + body: + encoding: UTF-8 + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '328' + Connection: + - keep-alive + Date: + - Tue, 24 Mar 2020 04:50:09 GMT + Server: + - Apache + X-Slack-Req-Id: + - f20ed718473fbf2796e9c20b796344ce + X-Oauth-Scopes: + - chat:write,channels:read,users:read + X-Accepted-Oauth-Scopes: + - chat:write + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Slack-Backend: + - h + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + Vary: + - Accept-Encoding + Pragma: + - no-cache + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Access-Control-Allow-Origin: + - "*" + X-Via: + - haproxy-www-o4r2 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 4c7fd3c8d1d5afb1ce8ed03385580c2e.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - HIO50-C2 + X-Amz-Cf-Id: + - vadnCmLmapqRjqpgU_tH2c-1WKyEoTc-fctGnDCBaBRhpLvOHh50Tw== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channel":"CUTE4MTD0","ts":"1585025409.000500","message":{"bot_id":"BV7FDL9LL","type":"message","text":"heeeey + everyone! :)","user":"UVA5KE0H4","ts":"1585025409.000500","team":"TV83W4WBZ","bot_profile":{"id":"BV7FDL9LL","deleted":false,"name":"Yesenia + App","updated":1583943022,"app_id":"AUV59CB7U","icons":{"image_36":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/bot_36.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/bot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/service_72.png"},"team_id":"TV83W4WBZ"}}}' + http_version: null + recorded_at: Tue, 24 Mar 2020 04:50:09 GMT +recorded_with: VCR 5.1.0 diff --git a/test/workspace_test.rb b/test/workspace_test.rb index b19dd22a..dccd5e73 100644 --- a/test/workspace_test.rb +++ b/test/workspace_test.rb @@ -15,13 +15,11 @@ it "creates an array of User objects" do expect(@test_workspace.users).must_be_kind_of Array - expect(@test_workspace.users.length).must_equal 11 # Assumption: This workspace will not have any more users created - + expect(@test_workspace.users.length).must_equal 11 # Assumption: This workspace will not have any more users created end it "creates an array of Channel objects" do expect(@test_workspace.channels).must_be_kind_of Array - expect(@test_workspace.channels.length).must_equal 3 # Assumption: This workspace will not have any more channels created end end @@ -80,15 +78,59 @@ end end - xdescribe "display_details" do # TODO: write tests for this method # i was unsure how to verify command line output end - xdescribe "send_message" do - # TODO: write tests for this method - # i could not get my bot to post messages + describe "send_message" do + it "can send a valid message" do + # arrange + VCR.use_cassette("workspace-test") do + @test_workspace = Workspace.new() + @test_workspace.select_channel("general") + @selected_channel = @test_workspace.selected + end + result = {} + + # act + VCR.use_cassette("post-messages") do + result = @selected_channel.send_message("Hey I can post messages!") + end + + # assert + expect(result).must_be_kind_of HTTParty::Response + expect(result["ok"]).must_equal true + end + + it "raises an error if no recipient is selected" do + # arrange + @selected_channel = Channel.new(topic: "channel does not exist", member_count: 1, name: "bogus", slack_id:"CHAT1234") + + # act / assert + result = {} + VCR.use_cassette("post-messages") do + expect {@selected_channel.send_message("Hey I can post messages!")}.must_raise SlackAPIError + end + end + + it "sends the correct message to the correct channel" do + # arrange + VCR.use_cassette("workspace-test") do + @test_workspace = Workspace.new() + @test_workspace.select_channel("CUTE4MTD0") # "api-testing" + @selected_channel = @test_workspace.selected + end + result = {} + + # act + VCR.use_cassette("post-messages") do + result = @selected_channel.send_message("heeeey everyone! :)") + end + + # assert + expect(result["channel"]).must_equal "CUTE4MTD0" + expect(result["message"]["text"]).must_equal "heeeey everyone! :)" + end end - end \ No newline at end of file From 9f687d88d1068d5442da674f91662571799b72ad Mon Sep 17 00:00:00 2001 From: Yesenia Date: Tue, 24 Mar 2020 13:15:08 -0700 Subject: [PATCH 10/11] fixed typo --- lib/recipient.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/recipient.rb b/lib/recipient.rb index 1fbf3393..27a889b0 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -33,7 +33,7 @@ def send_message(message) raise SlackAPIError, "Encountered error: #{sent_message_details["error"]}" else puts "\n" - puts "Message sent sucessfully." + puts "Message sent successfully." end return sent_message_details From 4d85fae4707af8cfc286153215ddb25a0e2bb825 Mon Sep 17 00:00:00 2001 From: Yesenia Date: Tue, 24 Mar 2020 13:40:38 -0700 Subject: [PATCH 11/11] little formatting --- lib/channel.rb | 2 +- lib/slack.rb | 1 + lib/workspace.rb | 66 ++++++++++++++++++++++++------------------------ 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/lib/channel.rb b/lib/channel.rb index d9408291..c5621d14 100644 --- a/lib/channel.rb +++ b/lib/channel.rb @@ -31,5 +31,5 @@ def self.list_all return channel_info end - + end diff --git a/lib/slack.rb b/lib/slack.rb index d4e6f619..8a9eafd0 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -15,6 +15,7 @@ def prompt_action # controls command line interactivity def main + workspace = Workspace.new puts "\n" diff --git a/lib/workspace.rb b/lib/workspace.rb index b241f63c..7ca9e698 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -1,46 +1,46 @@ require_relative "user" require_relative "channel" - class Workspace +class Workspace - attr_reader :users, :channels, :selected + attr_reader :users, :channels, :selected - def initialize(users: [], channels: []) - @users = User.list_all - @channels = Channel.list_all - @selected = nil - end - - def select_user(requested_user) - users.each do |user| - if user.name == requested_user || user.slack_id == requested_user - @selected = user - return "User \"#{selected.real_name}\" has been selected." - end - end + def initialize(users: [], channels: []) + @users = User.list_all + @channels = Channel.list_all + @selected = nil + end - return "Sorry, user \"#{requested_user}\" does not exist in this workspace." + def select_user(requested_user) + users.each do |user| + if user.name == requested_user || user.slack_id == requested_user + @selected = user + return "User \"#{selected.real_name}\" has been selected." + end end - def select_channel(requested_channel) - channels.each do |channel| - if channel.name == requested_channel || channel.slack_id == requested_channel - @selected = channel - return "Channel titled \"#{selected.name}\" has been selected." - end - end - - return "Sorry, channel \"#{requested_channel}\" does not exist in this workspace." - end + return "Sorry, user \"#{requested_user}\" does not exist in this workspace." + end - # displays workspace info to command line based on selected recipient - def display_details - return @selected.details + def select_channel(requested_channel) + channels.each do |channel| + if channel.name == requested_channel || channel.slack_id == requested_channel + @selected = channel + return "Channel titled \"#{selected.name}\" has been selected." + end end - # posts a message in the selected channel in workspace - def send_message(message_text) - @selected.send_message(message_text) - end + return "Sorry, channel \"#{requested_channel}\" does not exist in this workspace." + end + + # displays workspace info to command line based on selected recipient + def display_details + return @selected.details + end + # posts a message in the selected channel in workspace + def send_message(message_text) + @selected.send_message(message_text) end + +end