diff --git a/lib/bad_response_error.rb b/lib/bad_response_error.rb new file mode 100644 index 00000000..c5d91cd7 --- /dev/null +++ b/lib/bad_response_error.rb @@ -0,0 +1,7 @@ +module Slack + class BadResponseError < StandardError + def initialize(msg="Slack API endpoint is NOT OK.") + super + end + end +end \ No newline at end of file diff --git a/lib/channel.rb b/lib/channel.rb new file mode 100644 index 00000000..a4a35009 --- /dev/null +++ b/lib/channel.rb @@ -0,0 +1,37 @@ +require_relative "conversation.rb" + +module Slack + class Channel < Conversation + attr_reader :name, :topic, :member_count + + def initialize(channel) + raise ArgumentError, "Trying to create Channel object with bad data: #{channel}." if channel["id"] == nil || !(channel["is_channel"]) + super(channel) + @name = channel["name"] + @topic = channel["topic"]["value"] + @member_count = channel["num_members"] + end + + def details + return "Details for this channel... \n name: #{name} \n topic: #{topic} \n number of members: #{member_count}" + end + + + # Method takes raw Channel data and converts it into an array of Channel objects. + def self.list_all + channels = get_all.map { |channel| Channel.new(channel)} + end + + private + + # Method uses http get to retrieve all Channel "objects" + # returns an array of Channels + def self.get_all + query = { + token: SLACK_TOKEN, + } + return super(query)["channels"] + end + + end +end \ No newline at end of file diff --git a/lib/conversation.rb b/lib/conversation.rb new file mode 100644 index 00000000..7d00776c --- /dev/null +++ b/lib/conversation.rb @@ -0,0 +1,43 @@ +require_relative "bad_response_error" + +module Slack + class Conversation + attr_reader :id + + def initialize(data) + @id = data["id"] #template + end + + # Super method to send messages to selected conversation. + def post_message(message) + # API ENDPOINT: https://slack.com/api/chat.postMessage + # query: @id + results = HTTParty.post("https://slack.com/api/chat.postMessage", query: { token: SLACK_TOKEN, channel: id, text: message}) + raise BadResponseError, "chat.postMessage endpoint response IS NOT OK." unless results["ok"] + end + + # Placeholder method to be defined in child classes. + # Method will return a bunch of details about specified conversation + # Should probably implement in child classes so we can control the description to be user-friendly + # but if we're ok with a generic details printout, we can do it at parent Conversation level too + def details + raise NotImplementedError, "Define DETAILS method in child class." + end + + + # CLASS METHODS + + def self.list_all + # Extend this method in child classes. + end + + private + + def self.get_all(query) + data = HTTParty.get("https://slack.com/api/conversations.list?", query: query) + raise BadResponseError, "Conversations.list endpoint response IS NOT OK." unless data["ok"] + return data + end + + end +end \ No newline at end of file diff --git a/lib/direct_message.rb b/lib/direct_message.rb new file mode 100644 index 00000000..df8ffdb8 --- /dev/null +++ b/lib/direct_message.rb @@ -0,0 +1,31 @@ +require_relative "conversation" + +module Slack + class DirectMessage < Conversation + attr_reader :user + + def initialize(data) + super(data) + @user = data["user"] + end + + + # CLASS METHODS + # Method takes raw Channel data and converts it into an array of Channel objects. + def self.list_all + direct_messages = get_all.map { |data| DirectMessage.new(data)} + end + + private + + # Method uses http get to retrieve all Channel "objects" + # returns an array of Channels + def self.get_all + query = { + token: SLACK_TOKEN, + types: "im", + } + return super(query)["channels"] #Slack considers direct messages to also be "channels" + end + end +end \ No newline at end of file diff --git a/lib/slack.rb b/lib/slack.rb index 8a0b659b..3d726069 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -1,12 +1,123 @@ #!/usr/bin/env ruby +require_relative 'workspace' +require "table_print" +OPTIONS = [ + ["1", "list users"], + ["2", "list channels"], + ["3", "select user"], + ["4", "select a channel"], + ["5", "show details"], + ["6", "post a message"], + ["7", "quit"], +] + +# main loop of the CLI program def main puts "Welcome to the Ada Slack CLI!" - workspace = Workspace.new + @workspace = Slack::Workspace.new + + choice = get_user_input + until (OPTIONS[-1].include? choice) #checks for quit command from user + perform_action(choice) + choice = get_user_input + end + puts "\n>>>>>> Thank you for using the Slack CLI! Goodbye." +end + +# prompts for valid commands from user, then executes the command +def perform_action(choice) + + until OPTIONS.any? { |option| option.include? choice } #validates user input + print "'#{choice}' is an invalid option, try again. > " + choice = gets.strip.downcase + end + + case choice + when *OPTIONS[0] + puts "\n\n>>>>>>> LIST OF USERS" + count = 0 + my_proc = Proc.new{count = count + 1} + tp @workspace.users, {user: lambda{ |u| my_proc.call }}, :id, :user_name, :real_name => {:display_method => :name} + + when *OPTIONS[1] + puts "\n\n>>>>>>> LIST OF CHANNELS" + # tp @workspace.channels, :include => :id + count = 0 + my_proc = Proc.new{count = count + 1} + tp @workspace.channels, {channel: lambda{ |u| my_proc.call }}, :id, :name, :topic, :member_count + + when *OPTIONS[2] + make_selection("user", @workspace.users) + + when *OPTIONS[3] + make_selection("channel", @workspace.channels) + + when *OPTIONS[4] #details + if @workspace.selected.nil? + puts "ERROR: Oops, you haven't made a selection yet. Make a selection first." + else + puts @workspace.selected.details + end + + when *OPTIONS[5] #post message + if @workspace.selected.nil? + puts "ERROR: Who ya trying to send a message to? Pick someone first, silly." + else + print "Enter the message that you want to send to #{@workspace.selected.name} > " + message = gets + @workspace.selected.post_message(message) + end + end + +end + +# presents the main menu and grabs user input +def get_user_input + puts "\n\nMAIN MENU - please select from the following" + + OPTIONS.each do |option| + puts option.join(" ") + end + + print "\nWhat would you like to do? > " + choice = gets.strip.downcase + return choice +end + +# gets user input when they're selecting a user or channel +def make_selection(type, list) + puts "\n\n>>>>>>> SELECTING A #{type.upcase}" + print "Please enter the #{type} number or the ID as listed > " + input = gets.strip - # TODO project + if input != 0 && input.to_i == 0 #gave us an ID + puts "checking id #{input}..." + begin + @workspace.select_by_id(type, input) + rescue ArgumentError + puts "No #{type} with that ID exists." + else + puts "Selected #{type}: #{@workspace.selected.name}" + end + else #gave us an integer + puts "checking for user ##{input}..." + while input == 0 || input.to_i > list.length + input = validate_selection(input) + end + @workspace.select_by_index(type, input.to_i-1) + puts "Selected #{type}: #{@workspace.selected.name}" + end +end - puts "Thank you for using the Ada Slack CLI" +# helper method to validate +def validate_selection(input) + print "#{input} is not a valid choice, re-enter the number or ID > " + return gets.strip end -main if __FILE__ == $PROGRAM_NAME \ No newline at end of file + +main if __FILE__ == $PROGRAM_NAME + + + diff --git a/lib/user.rb b/lib/user.rb new file mode 100644 index 00000000..a2f255f9 --- /dev/null +++ b/lib/user.rb @@ -0,0 +1,50 @@ +require "dotenv" +require "httparty" + +Dotenv.load + +SLACK_TOKEN = ENV["SLACK_TOKEN"] + +module Slack + class User + attr_reader :id, :user_name, :name + + def initialize(member) + raise ArgumentError, "Trying to create User object with bad data: #{member}." if member["id"] == nil || member["name"] == nil || member["real_name"] == nil + @id = member["id"] + @user_name = member["name"] + @name = member["real_name"] + end + + def details + return "Details for this user: \n id: #{id} \n user name: #{user_name} \n real name: #{name}" + end + + def post_message(message) + # API ENDPOINT: https://slack.com/api/chat.postMessage + # query: @id + results = HTTParty.post("https://slack.com/api/chat.postMessage", query: { token: SLACK_TOKEN, channel: id, text: message}) + raise BadResponseError, "chat.postMessage endpoint response IS NOT OK." unless results["ok"] + end + + # CLASS METHODS + + # Parameter users: collection representing Users + # Returns an array of User objects + def self.list_all + members_including_deleted = get_all + members = members_including_deleted.reject { |member| member["deleted"] } #cover a wonky case + members.map { |member| User.new(member) } + end + + private + + # Method uses http get to retrieve all User "objects" + # returns an httparty Response object + def self.get_all + data = HTTParty.get("https://slack.com/api/users.list?", query: { token: SLACK_TOKEN, }) + raise BadResponseError, "Users.list endpoint response IS NOT OK." unless data["ok"] + return data["members"] + end + end +end \ No newline at end of file diff --git a/lib/workspace.rb b/lib/workspace.rb new file mode 100644 index 00000000..4da0b64a --- /dev/null +++ b/lib/workspace.rb @@ -0,0 +1,70 @@ +require "dotenv" +require "httparty" +require_relative "direct_message" +require_relative "channel" +require_relative "user" +require_relative "bad_response_error" + +module Slack + class Workspace + # attr_reader :users, :conversations, :selected + attr_reader :users, :channels, :selected + + def initialize + @users = User.list_all + @channels = Channel.list_all + @direct_messages = DirectMessage.list_all + @selected = nil + end + + # Method selects a user or channel using the name or slack ID. + def select_by_id(type, id) + result = nil + + case type + when "channel" + result = @channels.index { |channel| channel.id == id } + raise ArgumentError, "no channel with id: #{id}" if result.nil? + @selected = @channels[result] + when "user" + result = @users.index { |user| user.id == id } + raise ArgumentError, "no user with id: #{id}" if result.nil? + @selected = @users[result] + end + end + + def select_by_index(type, index) + case type + when "channel" + @selected = @channels[index] + when "user" + @selected = @users[index] + end + end + + # Method shows details of the currently selected conversation. + def show_details + raise InvalidRecipientError, "No selection made yet. User must have a selected conversation." + end + + # Method posts a message to the currently selected conversation. + def post_message + raise InvalidRecipientError, "No target conversation specified. Cannot send message." + end + + private + + def find_id + return + + # check users and conversations for valid target + end + + end + + class InvalidRecipientError < StandardError + def initialize(msg="No valid user or conversation.") + super + end + end +end \ No newline at end of file diff --git a/test/cassettes/conversations_list_direct_messages_endpoint.yml b/test/cassettes/conversations_list_direct_messages_endpoint.yml new file mode 100644 index 00000000..6e9a6aae --- /dev/null +++ b/test/cassettes/conversations_list_direct_messages_endpoint.yml @@ -0,0 +1,159 @@ +--- +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: + - '718' + Connection: + - keep-alive + Date: + - Tue, 24 Mar 2020 10:18:35 GMT + Server: + - Apache + X-Slack-Req-Id: + - 644f918e3e8e1975548a12582c670f14 + X-Oauth-Scopes: + - chat:write.public,chat:write,channels:read,users:read,im: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-nmqw + X-Cache: + - Miss from cloudfront + Via: + - 1.1 be082a2326b7d49643607b097f1e7181.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C2 + X-Amz-Cf-Id: + - MiDgA1kf_O-prL7ZqOQggHPmqEE3fR8hlnO_XEkcvxtULuynHjDoDg== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CUT7CLL1Y","name":"general","is_channel":true,"is_group":false,"is_im":false,"created":1583866138,"is_archived":false,"is_general":true,"unlinked":0,"name_normalized":"general","is_shared":false,"parent_conversation":null,"creator":"UV614256C","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV5H57Z7E"],"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":"UV614256C","last_set":1583866138},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UV614256C","last_set":1583866138},"previous_names":[],"num_members":9},{"id":"CUT7CM7M0","name":"ada-projects","is_channel":true,"is_group":false,"is_im":false,"created":1583866139,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"ada-projects","is_shared":false,"parent_conversation":null,"creator":"UV614256C","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV5H57Z7E"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"This + channel is for ada-projects collaboration and communication.","creator":"UV828MW79","last_set":1584052023},"previous_names":[],"num_members":9},{"id":"CV5H594KE","name":"random","is_channel":true,"is_group":false,"is_im":false,"created":1583866138,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"random","is_shared":false,"parent_conversation":null,"creator":"UV614256C","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV5H57Z7E"],"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":"UV614256C","last_set":1583866138},"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":"UV614256C","last_set":1583866138},"previous_names":[],"num_members":10},{"id":"C01046CUVD5","name":"spam","is_channel":true,"is_group":false,"is_im":false,"created":1584353722,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"spam","is_shared":false,"parent_conversation":null,"creator":"UV614256C","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV5H57Z7E"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"Spam + messages for testing purposes. Recommended mute this channel.","creator":"UV614256C","last_set":1584353723},"previous_names":[],"num_members":1}],"response_metadata":{"next_cursor":""}}' + http_version: null + recorded_at: Tue, 24 Mar 2020 10:18:35 GMT +- request: + method: get + uri: https://slack.com/api/conversations.list?token=&types=im + 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: + - '292' + Connection: + - keep-alive + Date: + - Tue, 24 Mar 2020 10:35:37 GMT + Server: + - Apache + X-Slack-Req-Id: + - fa895566b4c1ef0183982e9692732388 + X-Oauth-Scopes: + - chat:write.public,chat:write,channels:read,users:read,im: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-jfpz + X-Cache: + - Miss from cloudfront + Via: + - 1.1 caf6806821bc479b28a6f1ce3043b8a6.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C2 + X-Amz-Cf-Id: + - _FkDI98PKYis-2DtL5HBPPgOwu8Hd3tEf5ykOmi2zcgwoDWDL21y1g== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"DVDS2KLPQ","created":1584065406,"is_archived":false,"is_im":true,"is_org_shared":false,"user":"UV89SRSAJ","is_user_deleted":false,"priority":0},{"id":"DVBLESY4D","created":1584065406,"is_archived":false,"is_im":true,"is_org_shared":false,"user":"UUUTBJARH","is_user_deleted":false,"priority":0},{"id":"DVBLESX6Z","created":1584065406,"is_archived":false,"is_im":true,"is_org_shared":false,"user":"UV5RV3UDA","is_user_deleted":false,"priority":0},{"id":"DVBKWG80G","created":1584065407,"is_archived":false,"is_im":true,"is_org_shared":false,"user":"UV5RH7XE0","is_user_deleted":false,"priority":0},{"id":"DV1HJDEDP","created":1584065406,"is_archived":false,"is_im":true,"is_org_shared":false,"user":"UV828MW79","is_user_deleted":false,"priority":0},{"id":"DV065488K","created":1584065406,"is_archived":false,"is_im":true,"is_org_shared":false,"user":"UV614256C","is_user_deleted":false,"priority":0},{"id":"DUYS4LFM0","created":1584065406,"is_archived":false,"is_im":true,"is_org_shared":false,"user":"USLACKBOT","is_user_deleted":false,"priority":0}],"response_metadata":{"next_cursor":""}}' + http_version: null + recorded_at: Tue, 24 Mar 2020 10:35:37 GMT +recorded_with: VCR 5.1.0 diff --git a/test/cassettes/conversations_list_endpoint.yml b/test/cassettes/conversations_list_endpoint.yml new file mode 100644 index 00000000..433959af --- /dev/null +++ b/test/cassettes/conversations_list_endpoint.yml @@ -0,0 +1,85 @@ +--- +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: + - '718' + Connection: + - keep-alive + Date: + - Tue, 24 Mar 2020 10:04:41 GMT + Server: + - Apache + X-Slack-Req-Id: + - '0083a8e2965c47816b289968ce499f3f' + X-Oauth-Scopes: + - chat:write.public,chat:write,channels:read,users:read,im: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-stwn + X-Cache: + - Miss from cloudfront + Via: + - 1.1 570075675953459325e00b7bcd171df3.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C2 + X-Amz-Cf-Id: + - Z1VL1UuFDXo8AYTFwpPMD-zrdYcqsUgczo5o3bEKoz8IMg5W3Cy2rQ== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CUT7CLL1Y","name":"general","is_channel":true,"is_group":false,"is_im":false,"created":1583866138,"is_archived":false,"is_general":true,"unlinked":0,"name_normalized":"general","is_shared":false,"parent_conversation":null,"creator":"UV614256C","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV5H57Z7E"],"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":"UV614256C","last_set":1583866138},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UV614256C","last_set":1583866138},"previous_names":[],"num_members":9},{"id":"CUT7CM7M0","name":"ada-projects","is_channel":true,"is_group":false,"is_im":false,"created":1583866139,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"ada-projects","is_shared":false,"parent_conversation":null,"creator":"UV614256C","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV5H57Z7E"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"This + channel is for ada-projects collaboration and communication.","creator":"UV828MW79","last_set":1584052023},"previous_names":[],"num_members":9},{"id":"CV5H594KE","name":"random","is_channel":true,"is_group":false,"is_im":false,"created":1583866138,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"random","is_shared":false,"parent_conversation":null,"creator":"UV614256C","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV5H57Z7E"],"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":"UV614256C","last_set":1583866138},"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":"UV614256C","last_set":1583866138},"previous_names":[],"num_members":10},{"id":"C01046CUVD5","name":"spam","is_channel":true,"is_group":false,"is_im":false,"created":1584353722,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"spam","is_shared":false,"parent_conversation":null,"creator":"UV614256C","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV5H57Z7E"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"Spam + messages for testing purposes. Recommended mute this channel.","creator":"UV614256C","last_set":1584353723},"previous_names":[],"num_members":1}],"response_metadata":{"next_cursor":""}}' + http_version: null + recorded_at: Tue, 24 Mar 2020 10:04:41 GMT +recorded_with: VCR 5.1.0 diff --git a/test/cassettes/users_list_endpoint.yml b/test/cassettes/users_list_endpoint.yml new file mode 100644 index 00000000..cfb31302 --- /dev/null +++ b/test/cassettes/users_list_endpoint.yml @@ -0,0 +1,254 @@ +--- +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: + - '2458' + Connection: + - keep-alive + Date: + - Tue, 24 Mar 2020 10:04:41 GMT + Server: + - Apache + X-Slack-Req-Id: + - 5657f3712a274c687ef4e808df07a6b3 + X-Oauth-Scopes: + - chat:write.public,chat:write,channels:read,users:read,im: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-vmz3 + X-Cache: + - Miss from cloudfront + Via: + - 1.1 0732be5515ffeda639cfe5f22fb04df6.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C2 + X-Amz-Cf-Id: + - 4cDNrrW6Rwc260N4q0dTyTJ7BNjkZJI6Y1ahzvgTbbUDSLUUJ_sAUg== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"TV5H57Z7E","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":"TV5H57Z7E"},"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":"UUTGP3482","team_id":"TV5H57Z7E","name":"time_nataliya_api_pro","deleted":false,"color":"e96699","real_name":"time_nataliya_api_pro","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"time_nataliya_api_pro","real_name_normalized":"time_nataliya_api_pro","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gc03334fdbae","api_app_id":"AV8G3Q5N2","always_active":false,"bot_id":"BUW7Y2VED","image_24":"https:\/\/secure.gravatar.com\/avatar\/c03334fdbae1eeba8e7aad628b582e7d.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\/c03334fdbae1eeba8e7aad628b582e7d.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\/c03334fdbae1eeba8e7aad628b582e7d.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\/c03334fdbae1eeba8e7aad628b582e7d.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\/c03334fdbae1eeba8e7aad628b582e7d.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\/c03334fdbae1eeba8e7aad628b582e7d.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0002-512.png","status_text_canonical":"","team":"TV5H57Z7E"},"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":1583875216},{"id":"UUUTBJARH","team_id":"TV5H57Z7E","name":"stephaniejmars","deleted":false,"color":"e0a729","real_name":"Stephanie + Marshall","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Stephanie + Marshall","real_name_normalized":"Stephanie Marshall","display_name":"Stephanie + Marshall","display_name_normalized":"Stephanie Marshall","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g8e318281d2d","image_24":"https:\/\/secure.gravatar.com\/avatar\/8e318281d2d27bfd2bd51e9c614dfcef.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0004-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/8e318281d2d27bfd2bd51e9c614dfcef.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0004-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/8e318281d2d27bfd2bd51e9c614dfcef.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0004-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/8e318281d2d27bfd2bd51e9c614dfcef.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0004-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/8e318281d2d27bfd2bd51e9c614dfcef.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0004-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/8e318281d2d27bfd2bd51e9c614dfcef.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0004-512.png","status_text_canonical":"","team":"TV5H57Z7E"},"is_admin":true,"is_owner":true,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1583876740},{"id":"UUY6H3H41","team_id":"TV5H57Z7E","name":"timeangelabot-x","deleted":true,"profile":{"title":"","phone":"","skype":"","real_name":"Angela + Bot","real_name_normalized":"Angela Bot","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g60b25941fca","api_app_id":"AV87VAS85","always_active":true,"bot_id":"BVAF48YSJ","first_name":"Angela","last_name":"Bot","image_24":"https:\/\/secure.gravatar.com\/avatar\/60b25941fca5a453afaba8f047d20372.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/60b25941fca5a453afaba8f047d20372.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/60b25941fca5a453afaba8f047d20372.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/60b25941fca5a453afaba8f047d20372.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/60b25941fca5a453afaba8f047d20372.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/60b25941fca5a453afaba8f047d20372.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-512.png","status_text_canonical":"","team":"TV5H57Z7E"},"is_bot":true,"is_app_user":false,"updated":1584065406},{"id":"UV5RH7XE0","team_id":"TV5H57Z7E","name":"n.pogodina","deleted":false,"color":"3c989f","real_name":"Nataliya + Pogodina","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Nataliya + Pogodina","real_name_normalized":"Nataliya Pogodina","display_name":"Nataliya + Pogodina","display_name_normalized":"Nataliya Pogodina","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g650ea74f69b","image_24":"https:\/\/secure.gravatar.com\/avatar\/650ea74f69bd715a7dfbc63fc793a46a.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0016-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/650ea74f69bd715a7dfbc63fc793a46a.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0016-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/650ea74f69bd715a7dfbc63fc793a46a.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0016-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/650ea74f69bd715a7dfbc63fc793a46a.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0016-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/650ea74f69bd715a7dfbc63fc793a46a.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0016-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/650ea74f69bd715a7dfbc63fc793a46a.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0016-512.png","status_text_canonical":"","team":"TV5H57Z7E"},"is_admin":true,"is_owner":true,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1583875488},{"id":"UV5RV3UDA","team_id":"TV5H57Z7E","name":"msdenisseanaya","deleted":false,"color":"674b1b","real_name":"Denisse","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Denisse","real_name_normalized":"Denisse","display_name":"Denisse","display_name_normalized":"Denisse","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g20f3289080a","image_24":"https:\/\/secure.gravatar.com\/avatar\/20f3289080a51750693a488117df494d.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\/20f3289080a51750693a488117df494d.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\/20f3289080a51750693a488117df494d.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\/20f3289080a51750693a488117df494d.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\/20f3289080a51750693a488117df494d.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\/20f3289080a51750693a488117df494d.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-512.png","status_text_canonical":"","team":"TV5H57Z7E"},"is_admin":true,"is_owner":true,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1583875484},{"id":"UV614256C","team_id":"TV5H57Z7E","name":"angethuy","deleted":false,"color":"9f69e7","real_name":"Angela","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Angela","real_name_normalized":"Angela","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"ge7f4423d079","first_name":"Angela","last_name":"","image_24":"https:\/\/secure.gravatar.com\/avatar\/e7f4423d079ccf2a1b2ec822f976322f.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0019-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/e7f4423d079ccf2a1b2ec822f976322f.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0019-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/e7f4423d079ccf2a1b2ec822f976322f.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0019-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/e7f4423d079ccf2a1b2ec822f976322f.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0019-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/e7f4423d079ccf2a1b2ec822f976322f.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0019-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/e7f4423d079ccf2a1b2ec822f976322f.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0019-512.png","status_text_canonical":"","team":"TV5H57Z7E"},"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":1583868483},{"id":"UV6G4J1FS","team_id":"TV5H57Z7E","name":"time_denisse_api_proj","deleted":false,"color":"684b6c","real_name":"time_denisse_api_proj","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"time_denisse_api_proj","real_name_normalized":"time_denisse_api_proj","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g9b327b43bd3","api_app_id":"AUWAQJ4D7","always_active":false,"bot_id":"BV62RN1JQ","image_24":"https:\/\/secure.gravatar.com\/avatar\/9b327b43bd3ae11aa671605268f00cdf.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\/9b327b43bd3ae11aa671605268f00cdf.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\/9b327b43bd3ae11aa671605268f00cdf.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\/9b327b43bd3ae11aa671605268f00cdf.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\/9b327b43bd3ae11aa671605268f00cdf.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\/9b327b43bd3ae11aa671605268f00cdf.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-512.png","status_text_canonical":"","team":"TV5H57Z7E"},"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":1583883073},{"id":"UV6HC1BU5","team_id":"TV5H57Z7E","name":"space_stephanie_api_p","deleted":false,"color":"5b89d5","real_name":"space_stephanie_api_p","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"space_stephanie_api_p","real_name_normalized":"space_stephanie_api_p","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g334e580430b","api_app_id":"AV885T71V","always_active":false,"bot_id":"BV63EEWCC","image_24":"https:\/\/secure.gravatar.com\/avatar\/334e580430b69b1aa8d821898112ad47.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0003-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/334e580430b69b1aa8d821898112ad47.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0003-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/334e580430b69b1aa8d821898112ad47.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0003-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/334e580430b69b1aa8d821898112ad47.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0003-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/334e580430b69b1aa8d821898112ad47.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0003-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/334e580430b69b1aa8d821898112ad47.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0003-512.png","status_text_canonical":"","team":"TV5H57Z7E"},"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":1583884239},{"id":"UV828MW79","team_id":"TV5H57Z7E","name":"olgapatrakova","deleted":false,"color":"e7392d","real_name":"Olga","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Olga","real_name_normalized":"Olga","display_name":"Olga","display_name_normalized":"Olga","status_text":"Vacationing","status_emoji":":palm_tree:","status_expiration":0,"avatar_hash":"gf556705f93c","image_24":"https:\/\/secure.gravatar.com\/avatar\/f556705f93c8a46fa9935354e010bc2d.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0019-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/f556705f93c8a46fa9935354e010bc2d.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0019-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/f556705f93c8a46fa9935354e010bc2d.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0019-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/f556705f93c8a46fa9935354e010bc2d.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0019-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/f556705f93c8a46fa9935354e010bc2d.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0019-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/f556705f93c8a46fa9935354e010bc2d.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0019-512.png","status_text_canonical":"Vacationing","team":"TV5H57Z7E"},"is_admin":true,"is_owner":true,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1584163284},{"id":"UV89SRSAJ","team_id":"TV5H57Z7E","name":"alicia.combs.92","deleted":false,"color":"4bbe2e","real_name":"Alicia + Combs","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Alicia + Combs","real_name_normalized":"Alicia Combs","display_name":"Alicia Combs","display_name_normalized":"Alicia + Combs","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g5076c49384a","image_24":"https:\/\/secure.gravatar.com\/avatar\/5076c49384ae19beaa5f247513f5c3e4.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0019-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/5076c49384ae19beaa5f247513f5c3e4.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0019-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/5076c49384ae19beaa5f247513f5c3e4.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0019-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/5076c49384ae19beaa5f247513f5c3e4.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0019-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/5076c49384ae19beaa5f247513f5c3e4.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0019-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/5076c49384ae19beaa5f247513f5c3e4.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0019-512.png","status_text_canonical":"","team":"TV5H57Z7E"},"is_admin":true,"is_owner":true,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1583875478},{"id":"UV8JVKASC","team_id":"TV5H57Z7E","name":"time_olga_api_project","deleted":false,"color":"99a949","real_name":"time_olga_api_project","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"time_olga_api_project","real_name_normalized":"time_olga_api_project","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g5ba7db70afe","api_app_id":"AV8D7GT6Z","always_active":false,"bot_id":"BUVR3TZDG","first_name":"time_olga_api_project","last_name":"","image_24":"https:\/\/secure.gravatar.com\/avatar\/5ba7db70afefc9108816dd11f963cfca.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/5ba7db70afefc9108816dd11f963cfca.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/5ba7db70afefc9108816dd11f963cfca.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/5ba7db70afefc9108816dd11f963cfca.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/5ba7db70afefc9108816dd11f963cfca.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/5ba7db70afefc9108816dd11f963cfca.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0013-512.png","status_text_canonical":"","team":"TV5H57Z7E"},"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":1583965617},{"id":"UVDS2KFGE","team_id":"TV5H57Z7E","name":"timeangelabot","deleted":false,"color":"df3dc0","real_name":"Angela + Bot","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Angela + Bot","real_name_normalized":"Angela Bot","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g7b4a8116903","api_app_id":"AVDFSRG6T","always_active":true,"bot_id":"BV1HJD71P","first_name":"Angela","last_name":"Bot","image_24":"https:\/\/secure.gravatar.com\/avatar\/7b4a8116903e45ce0d21096f13411053.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0004-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/7b4a8116903e45ce0d21096f13411053.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0004-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/7b4a8116903e45ce0d21096f13411053.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0004-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/7b4a8116903e45ce0d21096f13411053.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0004-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/7b4a8116903e45ce0d21096f13411053.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0004-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/7b4a8116903e45ce0d21096f13411053.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0004-512.png","status_text_canonical":"","team":"TV5H57Z7E"},"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":1584065546},{"id":"UVDUTN3J9","team_id":"TV5H57Z7E","name":"time_alicia_slack_cli","deleted":false,"color":"4cc091","real_name":"time_alicia_slack_cli","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"time_alicia_slack_cli","real_name_normalized":"time_alicia_slack_cli","display_name":"","display_name_normalized":"","status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g618e805dff0","api_app_id":"AUV3WL99Q","always_active":false,"bot_id":"BV153BDS6","first_name":"time_alicia_slack_cli","last_name":"","image_24":"https:\/\/secure.gravatar.com\/avatar\/618e805dff021547f7dd38096f8be5b6.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/618e805dff021547f7dd38096f8be5b6.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/618e805dff021547f7dd38096f8be5b6.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/618e805dff021547f7dd38096f8be5b6.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/618e805dff021547f7dd38096f8be5b6.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/618e805dff021547f7dd38096f8be5b6.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-512.png","status_text_canonical":"","team":"TV5H57Z7E"},"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":1584308139}],"cache_ts":1585044281,"response_metadata":{"next_cursor":""}}' + http_version: null + recorded_at: Tue, 24 Mar 2020 10:04:41 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: + - '718' + Connection: + - keep-alive + Date: + - Tue, 24 Mar 2020 10:04:42 GMT + Server: + - Apache + X-Slack-Req-Id: + - d3f4891281a41c3e156e58710bf2d9c2 + X-Oauth-Scopes: + - chat:write.public,chat:write,channels:read,users:read,im: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 e36ab1b8726f47aa5adc8e19e66d1bbe.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C2 + X-Amz-Cf-Id: + - mk3RLoTB5eOLfsSL3SE-vggi_jDkTWd289RtRWW-MUGwsZ2Ru6xwbA== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"CUT7CLL1Y","name":"general","is_channel":true,"is_group":false,"is_im":false,"created":1583866138,"is_archived":false,"is_general":true,"unlinked":0,"name_normalized":"general","is_shared":false,"parent_conversation":null,"creator":"UV614256C","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV5H57Z7E"],"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":"UV614256C","last_set":1583866138},"purpose":{"value":"This + channel is for workspace-wide communication and announcements. All members + are in this channel.","creator":"UV614256C","last_set":1583866138},"previous_names":[],"num_members":9},{"id":"CUT7CM7M0","name":"ada-projects","is_channel":true,"is_group":false,"is_im":false,"created":1583866139,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"ada-projects","is_shared":false,"parent_conversation":null,"creator":"UV614256C","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV5H57Z7E"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"This + channel is for ada-projects collaboration and communication.","creator":"UV828MW79","last_set":1584052023},"previous_names":[],"num_members":9},{"id":"CV5H594KE","name":"random","is_channel":true,"is_group":false,"is_im":false,"created":1583866138,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"random","is_shared":false,"parent_conversation":null,"creator":"UV614256C","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV5H57Z7E"],"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":"UV614256C","last_set":1583866138},"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":"UV614256C","last_set":1583866138},"previous_names":[],"num_members":10},{"id":"C01046CUVD5","name":"spam","is_channel":true,"is_group":false,"is_im":false,"created":1584353722,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"spam","is_shared":false,"parent_conversation":null,"creator":"UV614256C","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["TV5H57Z7E"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"Spam + messages for testing purposes. Recommended mute this channel.","creator":"UV614256C","last_set":1584353723},"previous_names":[],"num_members":1}],"response_metadata":{"next_cursor":""}}' + http_version: null + recorded_at: Tue, 24 Mar 2020 10:04:42 GMT +- request: + method: get + uri: https://slack.com/api/conversations.list?token=&types=im + 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: + - '292' + Connection: + - keep-alive + Date: + - Tue, 24 Mar 2020 10:37:05 GMT + Server: + - Apache + X-Slack-Req-Id: + - dc5c81c0e103eb9389147920a9c9c38b + X-Oauth-Scopes: + - chat:write.public,chat:write,channels:read,users:read,im: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-9e4s + X-Cache: + - Miss from cloudfront + Via: + - 1.1 68eedbdfabd017beabf28d04341fec21.cloudfront.net (CloudFront) + X-Amz-Cf-Pop: + - SEA19-C1 + X-Amz-Cf-Id: + - cgjGaI0lA28IQjLRGZAgNXYq2gZ3barcEsFVbguEEjEH10bhk5_SWg== + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"DVDS2KLPQ","created":1584065406,"is_archived":false,"is_im":true,"is_org_shared":false,"user":"UV89SRSAJ","is_user_deleted":false,"priority":0},{"id":"DVBLESY4D","created":1584065406,"is_archived":false,"is_im":true,"is_org_shared":false,"user":"UUUTBJARH","is_user_deleted":false,"priority":0},{"id":"DVBLESX6Z","created":1584065406,"is_archived":false,"is_im":true,"is_org_shared":false,"user":"UV5RV3UDA","is_user_deleted":false,"priority":0},{"id":"DVBKWG80G","created":1584065407,"is_archived":false,"is_im":true,"is_org_shared":false,"user":"UV5RH7XE0","is_user_deleted":false,"priority":0},{"id":"DV1HJDEDP","created":1584065406,"is_archived":false,"is_im":true,"is_org_shared":false,"user":"UV828MW79","is_user_deleted":false,"priority":0},{"id":"DV065488K","created":1584065406,"is_archived":false,"is_im":true,"is_org_shared":false,"user":"UV614256C","is_user_deleted":false,"priority":0},{"id":"DUYS4LFM0","created":1584065406,"is_archived":false,"is_im":true,"is_org_shared":false,"user":"USLACKBOT","is_user_deleted":false,"priority":0}],"response_metadata":{"next_cursor":""}}' + http_version: null + recorded_at: Tue, 24 Mar 2020 10:37:05 GMT +recorded_with: VCR 5.1.0 diff --git a/test/channel_test.rb b/test/channel_test.rb new file mode 100644 index 00000000..9515b251 --- /dev/null +++ b/test/channel_test.rb @@ -0,0 +1,101 @@ +require_relative "test_helper" +require_relative "../lib/channel" + +describe "channel" do + before do + channel_data = { + "id" => "CUT7CLL1Y", + "name" => "general", + "is_channel" => true, + "is_group" => false, + "is_im" => false, + "created" => 1583866138, + "is_archived" => false, + "is_general" => true, + "unlinked" => 0, + "name_normalized" => "general", + "is_shared" => false, + "creator" => "UV614256C", + "is_ext_shared" => false, + "is_org_shared" => false, + "shared_team_ids" => [ + "TV5H57Z7E" + ], + "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" => "UV614256C", + "last_set" => 1583866138 + }, + "purpose" => { + "value" => "This channel is for workspace-wide communication and announcements. All members are in this channel.", + "creator" => "UV614256C", + "last_set" => 1583866138 + }, + "previous_names" => [], + "num_members" => 9 + } + @channel = Slack::Channel.new(channel_data) + end + + describe "initialize" do + it "raises an exception when trying to create a User with bad parameters" do + expect{(Slack::Channel.new({"id"=>"USLACKBOT", "team_id"=>"TV5H57Z7E", "name"=>"slackbot"}))}.must_raise ArgumentError + end + + it "creates a new Channel instance" do + expect(@channel).must_be_kind_of Slack::Channel + end + + it "saves id to the Channel instance" do + expect(@channel.id).must_equal "CUT7CLL1Y" + end + + it "saves name to the Channel instance" do + expect(@channel.name).must_equal "general" + end + + it "saves topic to the Channel instance" do + expect(@channel.topic).must_equal "Company-wide announcements and work-based matters" + end + + it "has an accurate count of members" do + expect(@channel.member_count).must_equal 9 + end + end + + describe "get_all" do + # returns a non-empty array of channels + it "returns an array of channel data" do + VCR.use_cassette("conversations_list_endpoint") do + data = Slack::Channel.get_all + expect(data).must_be_kind_of Array + expect(data.length > 0).must_equal true + end + end + end + + describe "list_all" do + # one of the channels must be the General channel + it "returns an array of Channel objects" do + VCR.use_cassette("conversations_list_endpoint") do + results = Slack::Channel.list_all + expect(results).must_be_kind_of Array + expect(results.all? { |result| result.class == Slack::Channel } ).must_equal true + end + end + + it "has a General channel" do + VCR.use_cassette("conversations_list_endpoint") do + results = Slack::Channel.list_all + expect(results.any? { |result| result.name == "general" } ).must_equal true + end + end + end + +end \ No newline at end of file diff --git a/test/conversation_test.rb b/test/conversation_test.rb new file mode 100644 index 00000000..3e5b1bef --- /dev/null +++ b/test/conversation_test.rb @@ -0,0 +1,38 @@ +require_relative "test_helper" +require_relative "../lib/conversation" + +describe "conversation" do + before do + fake_convo = { + "id" => "fake_convo" + } + @conversation = Slack::Conversation.new(fake_convo) + + end + + describe "initialize" do + it "creates a Conversation object" do + expect(@conversation).must_be_kind_of Slack::Conversation + end + + it "sets the conversation id" do + expect(@conversation.id).must_equal "fake_convo" + end + end + + describe "post_message" do + # ok must equal true + # raises InvalidRecipientError, no valid conversation with specified ID + end + + describe "details" do + # raises NotImplementedError + end + + describe "self.get_all" do + it "gets all conversations" do + + end + end + +end \ No newline at end of file diff --git a/test/direct_message_test.rb b/test/direct_message_test.rb new file mode 100644 index 00000000..8a12f62b --- /dev/null +++ b/test/direct_message_test.rb @@ -0,0 +1,68 @@ +require_relative "test_helper" +require_relative "../lib/direct_message" + +describe "direct message" do + before do + dm = { + "id" => "DUYS4LFM0", + "created" => 1584065406, + "is_archived" => false, + "is_im" => true, + "is_org_shared" => false, + "user" => "USLACKBOT", + "is_user_deleted" => false, + "priority" => 0, + } + @direct_message = Slack::DirectMessage.new(dm) + + end + + describe "initialize" do + + it "creates a direct message object" do + expect(@direct_message).must_be_kind_of Slack::DirectMessage + end + + it "stores the direct message's ID" do + expect(@direct_message.id).must_equal "DUYS4LFM0" + end + + it "stores the direct message's receiving user" do + expect(@direct_message.user).must_equal "USLACKBOT" + end + + end + + describe "list_all" do + it "returns an array of DirectMessage objects" do + VCR.use_cassette("conversations_list_direct_messages_endpoint") do + results = Slack::DirectMessage.list_all + expect(results).must_be_kind_of Array + expect(results.all? { |result| result.class == Slack::DirectMessage } ).must_equal true + end + end + + end + + describe "get_all" do + + it "returns an array of Channel objects" do + VCR.use_cassette("conversations_list_direct_messages_endpoint") do + results = Slack::DirectMessage.list_all + expect(results).must_be_kind_of Array + expect(results.all? { |result| result.class == Slack::DirectMessage } ).must_equal true + end + end + + # one of the Direct Messages must be with Slackbot + it "has a DirectMessage with the user USLACKBOT" do + VCR.use_cassette("conversations_list_direct_messages_endpoint") do + direct_messages = Slack::DirectMessage.list_all + expect(direct_messages.any? { |direct_message| direct_message.user == "USLACKBOT" } ).must_equal true + end + end + + end + + +end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index 1fcf2bab..26b2fac5 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -9,6 +9,12 @@ require 'minitest/skip_dsl' require 'vcr' +require_relative '../lib/workspace' +require_relative '../lib/user' +require_relative '../lib/conversation' +require_relative '../lib/channel' +require_relative '../lib/direct_message' + Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new VCR.configure do |config| @@ -25,5 +31,8 @@ } # 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..0366e628 --- /dev/null +++ b/test/user_test.rb @@ -0,0 +1,66 @@ +require_relative "test_helper" +require_relative "../lib/user" + +xdescribe "user" do + + before do + member = {"id"=>"USLACKBOT", "team_id"=>"TV5H57Z7E", "name"=>"slackbot", "deleted"=>false, "color"=>"757575", "real_name"=>"Slackbot",} + @user = Slack::User.new(member) + end + + describe "initialize" do + it "raises an exception when trying to create a User with bad parameters" do + expect{(Slack::User.new({"pie": "pumpkin"}))}.must_raise ArgumentError + end + + it "creates a User object" do + expect(@user).must_be_kind_of Slack::User + end + + it "returns a slack id" do + expect(@user.id).must_equal "USLACKBOT" + end + + it "returns a username" do + expect(@user.user_name).must_equal "slackbot" + end + + it "returns a real name" do + expect(@user.real_name).must_equal "Slackbot" + end + end + + describe "self.get_all" do + it "successfully receives a response from the users.list endpoint" do + VCR.use_cassette("users_list_endpoint") do + users = Slack::User.get_all + expect(users).must_be_kind_of Array + expect(users.length > 0).must_equal true + end + end + + it "raises an argument when users.list endpoint struggles" do + # VCR.use_cassette("users_list_endpoint_failure") do + # expect{(Slack::User.get_all)}.must_raise Slack::BadResponseError + # end + end + + end + + describe "self.list_all" do + it "raises an argument when users.list endpoint struggles" do + # VCR.use_cassette("users_list_endpoint_failure") do + # expect{(Slack::User.get_all)}.must_raise Slack::BadResponseError + # end + end + it "successfully converts data in User objects" do + + VCR.use_cassette("users_list_endpoint") do + results = Slack::User.list_all + expect(results).must_be_kind_of Array + expect(results.all? { |result| result.class == Slack::User } ).must_equal true + end + + end + end +end \ No newline at end of file diff --git a/test/workspace_test.rb b/test/workspace_test.rb new file mode 100644 index 00000000..d8ff0cb9 --- /dev/null +++ b/test/workspace_test.rb @@ -0,0 +1,50 @@ +require_relative "test_helper" +require_relative "../lib/workspace" + +describe "workspace" do + before do + VCR.use_cassette("users_list_endpoint") do + @test_workspace = Slack::Workspace.new + end + end + + describe "initialize" do + + it "creates a workspace object" do + expect(@test_workspace).must_be_kind_of Slack::Workspace + end + + it "initializes @selected to nil" do + expect(@test_workspace.selected).must_equal nil + end + + end + + xdescribe "select_by_id" do + it "raises an error when given invalid ID" do + expect{(@test_workspace.select_by_id("bogus_user_id", :USER))}.must_raise ArgumentError + expect{(@test_workspace.select_by_id("bogus_channel_id", :CHANNEL))}.must_raise ArgumentError + end + + it "sets @selected to the specified object" do + @test_workspace.select_by_id(SLACKBOT ID HERE, :USER) + expect(@test_workspace.selected).must_be_kind_of Slack::User + + @test_workspace.select_by_id(GENERAL CHANNEL ID, :CHANNEL) + expect(@test_workspace.selected).must_be_kind_of Slack::Channel + end + end + + xdescribe "show details" do + it "raises an error when invalid @selected is present" do + expect{(@test_workspace.show_details)}.must_raise ArgumentError + end + end + + xdescribe "post message" do + it "raises an error when invalid @selected is present" do + expect{(@test_workspace.post_message)}.must_raise ArgumentError + end + end + +end \ No newline at end of file