From a75f5c7ab508d3fe1a4399fa44735a72525c3892 Mon Sep 17 00:00:00 2001 From: Yaz Date: Thu, 12 Mar 2020 21:07:09 -0700 Subject: [PATCH 01/27] Added files workspace.rb and workspace_test.rb - updated relavant files to refer to Workspace: test_helper.rb and slack.rb. slack.rb also has some code testing out connection to slack api - no tests written yet. --- lib/slack.rb | 16 +++++++++++++++- lib/workspace.rb | 7 +++++++ test/test_helper.rb | 9 ++++++++- test/workspace_test.rb | 16 ++++++++++++++++ 4 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 lib/workspace.rb create mode 100644 test/workspace_test.rb diff --git a/lib/slack.rb b/lib/slack.rb index 8a0b659b..532ee0cd 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -1,4 +1,18 @@ -#!/usr/bin/env ruby +require_relative 'workspace' +require 'dotenv' +Dotenv.load +API_KEY = ENV['SLACK_TOKEN'] +require 'HTTParty' +base_url = 'https://slack.com/api/channels.list' +query_param = { + token: API_KEY +} +channel_list = HTTParty.get(base_url, query: query_param) +require 'ap' +channel_list.parsed_response["channels"].each do |channel| + ap bananna["name"] +end + def main puts "Welcome to the Ada Slack CLI!" diff --git a/lib/workspace.rb b/lib/workspace.rb new file mode 100644 index 00000000..3c0d8987 --- /dev/null +++ b/lib/workspace.rb @@ -0,0 +1,7 @@ +class Workspace + attr_reader :users, :channels + def initialize + @users = [] + @channels = [] + end +end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index 1fcf2bab..67be6142 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -9,6 +9,11 @@ require 'minitest/skip_dsl' require 'vcr' +require 'dotenv' +Dotenv.load + +require_relative '../lib/workspace' + Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new VCR.configure do |config| @@ -25,5 +30,7 @@ } # Don't leave our token lying around in a cassette file. - + config.filter_sensitive_data("SLACK_TOKEN") do + ENV["SLACK_TOKEN"] + end end diff --git a/test/workspace_test.rb b/test/workspace_test.rb new file mode 100644 index 00000000..3ae48ee1 --- /dev/null +++ b/test/workspace_test.rb @@ -0,0 +1,16 @@ +require_relative 'test_helper' + +describe 'Workspace' do + describe 'constructor' do + before do + @workspace = Workspace.new + end + it 'creates instance of Workspace' do + expect(@workspace).must_be_kind_of Workspace + end + it 'has state @users and @channels' do + expect(@workspace.users).must_be_kind_of Array + expect(@workspace.channels).must_be_kind_of Array + end + end +end \ No newline at end of file From 7ab40d250f725d36f6cce935c4744c1871ef3ea4 Mon Sep 17 00:00:00 2001 From: Yaz Date: Fri, 13 Mar 2020 17:01:41 -0700 Subject: [PATCH 02/27] added files for classes, and their tests --- lib/channel.rb | 0 lib/recipient.rb | 0 lib/user.rb | 0 test/channel_test.rb | 0 test/recipient_test.rb | 0 test/test_helper.rb | 4 ++++ test/user_test.rb | 0 7 files changed, 4 insertions(+) create mode 100644 lib/channel.rb create mode 100644 lib/recipient.rb create mode 100644 lib/user.rb create mode 100644 test/channel_test.rb create mode 100644 test/recipient_test.rb create mode 100644 test/user_test.rb diff --git a/lib/channel.rb b/lib/channel.rb new file mode 100644 index 00000000..e69de29b diff --git a/lib/recipient.rb b/lib/recipient.rb new file mode 100644 index 00000000..e69de29b diff --git a/lib/user.rb b/lib/user.rb new file mode 100644 index 00000000..e69de29b diff --git a/test/channel_test.rb b/test/channel_test.rb new file mode 100644 index 00000000..e69de29b diff --git a/test/recipient_test.rb b/test/recipient_test.rb new file mode 100644 index 00000000..e69de29b diff --git a/test/test_helper.rb b/test/test_helper.rb index 67be6142..15f28849 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -13,6 +13,10 @@ Dotenv.load require_relative '../lib/workspace' +require_relative '../lib/slack' +require_relative '../lib/channel.rb' +require_relative '../lib/recipient.rb' +require_relative '../lib/user.rb' Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new diff --git a/test/user_test.rb b/test/user_test.rb new file mode 100644 index 00000000..e69de29b From ae01a22f7f0780d7c3006e64af7e7198ca2bf3bd Mon Sep 17 00:00:00 2001 From: Yaz Date: Sun, 15 Mar 2020 17:43:22 -0700 Subject: [PATCH 03/27] created and filled library helper --- lib/lib_helper.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 lib/lib_helper.rb diff --git a/lib/lib_helper.rb b/lib/lib_helper.rb new file mode 100644 index 00000000..bbeaad5c --- /dev/null +++ b/lib/lib_helper.rb @@ -0,0 +1,14 @@ +require 'HTTParty' +require 'dotenv' +Dotenv.load + +API_KEY = ENV['SLACK_TOKEN'] +BASE_URL = 'https://slack.com/api' +QUERY_PARAM = { + token: API_KEY +} + +require_relative 'workspace.rb' +require_relative 'channel.rb' +require_relative 'recipient.rb' +require_relative 'user.rb' \ No newline at end of file From 0e274662ff4d4db38fa7ba0823820589348abdc0 Mon Sep 17 00:00:00 2001 From: Yaz Date: Sun, 15 Mar 2020 21:30:30 -0700 Subject: [PATCH 04/27] wrote Recipient#init, Recipient.get_list(recipient_type) and wrote corresponding tests (passing) --- lib/recipient.rb | 23 ++++++++++++++++++ test/recipient_test.rb | 55 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/lib/recipient.rb b/lib/recipient.rb index e69de29b..d123370b 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -0,0 +1,23 @@ +require_relative 'lib_helper' +#template method for Channel and User +class Recipient + attr_reader :name, :slack_id + + def initialize(name, slack_id) + @name = name + @slack_id = slack_id + end + + def self.get_list(recipient_kind) + if recipient_kind != "user" && recipient_kind != "channel" + raise ArgumentError.new("Not a valid recipient") + end + response = HTTParty.get(BASE_URL + "#{recipient_kind}s.list", query: QUERY_PARAM) + if !response["ok"] + raise API_Error.new("#{response["error"]}") + end + return response + end +end +class API_Error < StandardError +end \ No newline at end of file diff --git a/test/recipient_test.rb b/test/recipient_test.rb index e69de29b..29ca2d03 100644 --- a/test/recipient_test.rb +++ b/test/recipient_test.rb @@ -0,0 +1,55 @@ +require_relative "test_helper.rb" +describe "Recipient" do + describe "constructor" do + before do + @recipient = Recipient.new("Test", "T00000001") + end + it "creates Recipient" do + expect(@recipient).must_be_kind_of Recipient + end + it "has state" do + expect(@recipient.name).must_equal "Test" + expect(@recipient.slack_id).must_equal "T00000001" + end + end + + describe "get_list" do + it "raises error for invalid recipient type" do + expect{Recipient.get_list("oogie-woogie")}.must_raise ArgumentError + end + + it "generates needed information for a user list" do + VCR.use_cassette("Recipient#get_list(user)") do + user_list = Recipient.get_list("user") + expect(user_list["ok"]).must_equal true + expect(user_list["members"]).must_be_kind_of Array + end + + end + + it "generates needed information for a channel list" do + VCR.use_cassette("Recipient#get_list(channel)") do + channel_list = Recipient.get_list("channel") + expect(channel_list["ok"]).must_equal true + expect(channel_list["channels"]).must_be_kind_of Array + end + + end + + # how do I write a test for my API_Error? I need an invalid + # token to be passed in a way that won't mess up all the other + # tests....can I force a different value of API_KEY (located + # in lib/lib_helper) in a particular test? + # looked into dotenv - not much luck without using bash + # could write another option into source code to test this - but + # i don't like this option + + # this doesn't work: + # it "throws API_Error when API_KEY is invalid" do + # expect { + # ENV["SLACK_TOKEN"]= "xoxb-98095036Y595-980354253761-FBM9Y9WcbC3S90lUbCYMG0ET" + # Recipient.get_list("user") + # }.must_raise API_Error + # end + end +end \ No newline at end of file From a01bdc21f4dcfe646c13186e093b8c8caa71be96 Mon Sep 17 00:00:00 2001 From: Yaz Date: Sun, 15 Mar 2020 21:55:32 -0700 Subject: [PATCH 05/27] wrote User#init and User.get_list(recipient). Have been unsuccessful for far in creating a version of .getlist with no parameters. Wrote passing tests. --- lib/user.rb | 26 +++++++++++++++++++++++++ test/user_test.rb | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/lib/user.rb b/lib/user.rb index e69de29b..45108112 100644 --- a/lib/user.rb +++ b/lib/user.rb @@ -0,0 +1,26 @@ +require_relative 'recipient.rb' +class User < Recipient + attr_reader :real_name + + def initialize(name, slack_id, real_name) + super(name, slack_id) + @real_name = real_name + end + + def self.get_list(recipient_type) + # why doesn't super.get_list("user") work here??? + response = Recipient.get_list(recipient_type) + # Why doesn't the following line, with the commented-out, instantiated method below, work??? + # I'd like to have user's version of get_list be parameter-less. + #response = self.get_list("user") + list = [] + response.parsed_response["members"].each do |member| + list << User.new(member["name"], member["id"], member["real_name"]) + end + return list + end + + # def self.get_list(recipient_type) + # return super.get_list(recipient_type) + # end +end diff --git a/test/user_test.rb b/test/user_test.rb index e69de29b..ef4e4485 100644 --- a/test/user_test.rb +++ b/test/user_test.rb @@ -0,0 +1,49 @@ +require_relative 'test_helper' + +describe 'User' do + describe 'constructor' do + before do + @user = User.new("Yaz", "W012A3CDE", "Yaz O'Shaughnessy") + end + it 'creates user, child of recipient' do + expect(@user).must_be_kind_of User + expect(@user.class.superclass).must_equal Recipient + end + it "has expected state" do + expect(@user.name).must_equal "Yaz" + expect(@user.slack_id).must_equal "W012A3CDE" + expect(@user.real_name).must_equal "Yaz O'Shaughnessy" + end + + end + + describe ".get_list" do + # TO DO: before block with VCR cassette? + it "returns array" do + VCR.use_cassette("User.get_list") do + user_list = User.get_list("user") + expect(user_list).must_be_kind_of Array + expect(user_list.empty?).must_equal false + expect(user_list.first).must_be_kind_of User + end + end + + it "has user called SlackBot" do + VCR.use_cassette("User.get_list") do + user_list = User.get_list("user") + target_user = user_list.find {|user| user.name == "slackbot"} + expect(target_user).must_be_kind_of User + end + end + + it "user SlackBot has expected state" do + VCR.use_cassette("User.get_list") do + user_list = User.get_list("user") + target_user = user_list.find {|user| user.name == "slackbot"} + expect(target_user.slack_id).must_equal "USLACKBOT" + expect(target_user.real_name).must_equal "Slackbot" + end + end + + end +end \ No newline at end of file From cc3f8bc5b4a1c2376028fcf993340305d138a315 Mon Sep 17 00:00:00 2001 From: Yaz Date: Sun, 15 Mar 2020 22:10:18 -0700 Subject: [PATCH 06/27] wrote Channel#init and Channel.get_list, with passing tests. --- lib/channel.rb | 22 +++++++++++++++++++ test/channel_test.rb | 50 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/lib/channel.rb b/lib/channel.rb index e69de29b..92ef4a9e 100644 --- a/lib/channel.rb +++ b/lib/channel.rb @@ -0,0 +1,22 @@ +require_relative 'recipient.rb' +class Channel < Recipient + attr_reader :topic, :member_count + def initialize(name, slack_id, topic, member_count) + super(name, slack_id) + @topic = topic + @member_count = member_count + end + + def self.get_list(recipient_type) + # whyyyyy doesn't super.get_list work?? + # whhhyyyyy can't I implement a parameter-less version of get_list when i include a get_list matching + # parent's method signature??? + # whyyyyyyy + response = Recipient.get_list(recipient_type) + list = [] + response.parsed_response["channels"].each do |channel| + list << Channel.new(channel["name"], channel["id"], channel["topic"]["value"], channel["num_members"]) + end + return list + end +end \ No newline at end of file diff --git a/test/channel_test.rb b/test/channel_test.rb index e69de29b..a2cbfdb6 100644 --- a/test/channel_test.rb +++ b/test/channel_test.rb @@ -0,0 +1,50 @@ +require_relative 'test_helper.rb' + +describe 'Channel' do + describe 'constructor' do + before do + @channel = Channel.new("general", "W012A3CDE", "gen happenings", 3) + end + it 'creates channel, child of recipient' do + expect(@channel).must_be_kind_of Channel + expect(@channel.class.superclass).must_equal Recipient + end + it "has expected state" do + expect(@channel.name).must_equal "general" + expect(@channel.slack_id).must_equal "W012A3CDE" + expect(@channel.topic).must_equal "gen happenings" + expect(@channel.member_count).must_equal 3 + end + + end + + describe "get_list" do + # TO DO: before block with cassette + it "returns array" do + VCR.use_cassette("Channel.get_list") do + channel_list = Channel.get_list("channel") + expect(channel_list).must_be_kind_of Array + expect(channel_list.empty?).must_equal false + expect(channel_list.first).must_be_kind_of Channel + end + end + + it "has channel called Random" do + VCR.use_cassette("Channel.get_list") do + channel_list = Channel.get_list("channel") + target_channel = channel_list.find {|channel| channel.name == "random"} + expect(target_channel).must_be_kind_of Channel + end + end + + it "channel SlackBot has expected state" do + VCR.use_cassette("Channel.get_list") do + channel_list = Channel.get_list("channel") + target_channel = channel_list.find {|channel| channel.name == "random"} + expect(target_channel.slack_id).must_equal "CVBCU0R37" + expect(target_channel.topic).must_equal "Non-work banter and water cooler conversation" + expect(target_channel.member_count).must_equal 1 + end + end + end +end \ No newline at end of file From b4f52384af7471e203a58422129eece317f18b20 Mon Sep 17 00:00:00 2001 From: Yaz Date: Sun, 15 Mar 2020 22:18:58 -0700 Subject: [PATCH 07/27] cleaned up Recipient, added plan for refactor --- lib/recipient.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/recipient.rb b/lib/recipient.rb index d123370b..19b2a931 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -7,7 +7,7 @@ def initialize(name, slack_id) @name = name @slack_id = slack_id end - + # TO DO: try putting a parameter-less version of get list here, with an uninstantiated error. def self.get_list(recipient_kind) if recipient_kind != "user" && recipient_kind != "channel" raise ArgumentError.new("Not a valid recipient") From b22094efe49ecf52f18a0116d230befc55fd1be5 Mon Sep 17 00:00:00 2001 From: Yaz Date: Sun, 15 Mar 2020 22:19:46 -0700 Subject: [PATCH 08/27] updated helper files --- lib/lib_helper.rb | 9 ++++----- test/test_helper.rb | 14 ++++++++------ 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/lib/lib_helper.rb b/lib/lib_helper.rb index bbeaad5c..eb9fa195 100644 --- a/lib/lib_helper.rb +++ b/lib/lib_helper.rb @@ -1,14 +1,13 @@ require 'HTTParty' require 'dotenv' Dotenv.load +Dotenv.require_keys("SLACK_TOKEN") API_KEY = ENV['SLACK_TOKEN'] -BASE_URL = 'https://slack.com/api' +BASE_URL = 'https://slack.com/api/' QUERY_PARAM = { token: API_KEY } -require_relative 'workspace.rb' -require_relative 'channel.rb' -require_relative 'recipient.rb' -require_relative 'user.rb' \ No newline at end of file +require_relative "channel.rb" +require_relative "user.rb" \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index 15f28849..4cc5d677 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -11,21 +11,23 @@ require 'dotenv' Dotenv.load +Dotenv.require_keys("SLACK_TOKEN") -require_relative '../lib/workspace' -require_relative '../lib/slack' +require_relative '../lib/workspace.rb' +require_relative '../lib/slack.rb' require_relative '../lib/channel.rb' require_relative '../lib/recipient.rb' require_relative '../lib/user.rb' Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new -VCR.configure do |config| - config.cassette_library_dir = "test/cassettes" - config.hook_into :webmock -end +# VCR.configure do |config| +# config.cassette_library_dir = "test/cassettes" +# config.hook_into :webmock +# end VCR.configure do |config| + config.allow_http_connections_when_no_cassette = true config.cassette_library_dir = "test/cassettes" # folder where casettes will be located config.hook_into :webmock # tie into this other tool called webmock config.default_cassette_options = { From af02fe5d9da1437438aef495d7a8bc9cdf416cbf Mon Sep 17 00:00:00 2001 From: Yaz Date: Sun, 15 Mar 2020 22:37:33 -0700 Subject: [PATCH 09/27] Workspace#init with tests for #init and #channels, #users - all passing --- lib/workspace.rb | 8 ++++++-- test/workspace_test.rb | 17 +++++++++++++++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/lib/workspace.rb b/lib/workspace.rb index 3c0d8987..afd04fa3 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -1,7 +1,11 @@ +require_relative "lib_helper.rb" class Workspace + attr_reader :users, :channels def initialize - @users = [] - @channels = [] + @users = User.get_list("user") + @channels = Channel.get_list("channel") end + + end \ No newline at end of file diff --git a/test/workspace_test.rb b/test/workspace_test.rb index 3ae48ee1..8a557cf5 100644 --- a/test/workspace_test.rb +++ b/test/workspace_test.rb @@ -1,9 +1,11 @@ require_relative 'test_helper' -describe 'Workspace' do +xdescribe 'Workspace' do describe 'constructor' do before do - @workspace = Workspace.new + VCR.use_cassette("workspace") do + @workspace = Workspace.new + end end it 'creates instance of Workspace' do expect(@workspace).must_be_kind_of Workspace @@ -12,5 +14,16 @@ expect(@workspace.users).must_be_kind_of Array expect(@workspace.channels).must_be_kind_of Array end + it "users contains users" do + expect(@workspace.users.first).must_be_kind_of User + target_user = @workspace.users.find {|user| user.name == "slackbot"} + expect(target_user).must_be_kind_of User + end + + it "users contains users" do + expect(@workspace.channels.first).must_be_kind_of Channel + target_channel = @workspace.channels.find {|channel| channel.name == "random"} + expect(target_user).must_be_kind_of Channel + end end end \ No newline at end of file From 0d44c8af7cc10e40f3e8da6110f4c60524a587ed Mon Sep 17 00:00:00 2001 From: Yaz Date: Sun, 15 Mar 2020 23:19:19 -0700 Subject: [PATCH 10/27] added print method, using table print --- lib/workspace.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/workspace.rb b/lib/workspace.rb index afd04fa3..7a87326b 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -7,5 +7,16 @@ def initialize @channels = Channel.get_list("channel") end + def print_list(recipient) + case recipient + when "users" + tp users, {:name => {:display_name => "Username"}}, :slack_id, :real_name + when "channels" + tp channels, :name, :slack_id, :topic, :member_count + else + raise ArgumentError.new("Invalid recipient") + end + end + end \ No newline at end of file From ecc8704cbb0b1130e2e81cbc62537fbdbcca003b Mon Sep 17 00:00:00 2001 From: Yaz Date: Sun, 15 Mar 2020 23:19:32 -0700 Subject: [PATCH 11/27] added table print --- lib/lib_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/lib_helper.rb b/lib/lib_helper.rb index eb9fa195..ab5dcb78 100644 --- a/lib/lib_helper.rb +++ b/lib/lib_helper.rb @@ -1,3 +1,4 @@ +require 'table_print' require 'HTTParty' require 'dotenv' Dotenv.load From 739ee76da2f1511d45c4217fbdaa32d95ac6676e Mon Sep 17 00:00:00 2001 From: Yaz Date: Sun, 15 Mar 2020 23:24:14 -0700 Subject: [PATCH 12/27] Wave 1 complete --- lib/slack.rb | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/lib/slack.rb b/lib/slack.rb index 532ee0cd..6a93c21c 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -1,24 +1,26 @@ require_relative 'workspace' -require 'dotenv' -Dotenv.load -API_KEY = ENV['SLACK_TOKEN'] -require 'HTTParty' -base_url = 'https://slack.com/api/channels.list' -query_param = { - token: API_KEY -} -channel_list = HTTParty.get(base_url, query: query_param) -require 'ap' -channel_list.parsed_response["channels"].each do |channel| - ap bananna["name"] -end - def main puts "Welcome to the Ada Slack CLI!" workspace = Workspace.new - - # TODO project + puts "This workspace has #{workspace.users.length} users and #{workspace.channels.length} channels." + input = "" + # TO DO: refactor to meet requirements of typing out options (wave 1) + while input != "quit" + puts "\nWhat would you like to do?" + puts "list users \nlist channels \nquit" + input = gets.chomp.downcase + case input + when "list users" + workspace.print_list("users") + when "list channels" + workspace.print_list("channels") + when "quit" + puts "Goodbye!" + else + puts "Oops, that's not valid input." + end + end puts "Thank you for using the Ada Slack CLI" end From f6760074a1e919a5c125446e1d3f8d009380d254 Mon Sep 17 00:00:00 2001 From: Yaz Date: Mon, 16 Mar 2020 00:51:00 -0700 Subject: [PATCH 13/27] Added Recipient#details, with passing tests --- lib/recipient.rb | 5 +++++ test/recipient_test.rb | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/lib/recipient.rb b/lib/recipient.rb index 19b2a931..398b07ae 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -7,6 +7,11 @@ def initialize(name, slack_id) @name = name @slack_id = slack_id end + + def details + return [name, slack_id] + end + # TO DO: try putting a parameter-less version of get list here, with an uninstantiated error. def self.get_list(recipient_kind) if recipient_kind != "user" && recipient_kind != "channel" diff --git a/test/recipient_test.rb b/test/recipient_test.rb index 29ca2d03..120fc6f1 100644 --- a/test/recipient_test.rb +++ b/test/recipient_test.rb @@ -13,6 +13,14 @@ end end + describe "details" do + it "returns array of name and id" do + recipient = Recipient.new("Test", "T00000001") + target_a = ["Test", "T00000001"] + expect(recipient.details).must_equal target_a + end + end + describe "get_list" do it "raises error for invalid recipient type" do expect{Recipient.get_list("oogie-woogie")}.must_raise ArgumentError From 164206c597bb5eaab2ab91a423a485c300f38aae Mon Sep 17 00:00:00 2001 From: Yaz Date: Mon, 16 Mar 2020 01:00:57 -0700 Subject: [PATCH 14/27] Added Channel#details, overwriting parent method. Passed tests. --- lib/channel.rb | 6 +++++- test/channel_test.rb | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/channel.rb b/lib/channel.rb index 92ef4a9e..ee24d2e6 100644 --- a/lib/channel.rb +++ b/lib/channel.rb @@ -7,8 +7,12 @@ def initialize(name, slack_id, topic, member_count) @member_count = member_count end + def details + return super + [topic, member_count] + end + def self.get_list(recipient_type) - # whyyyyy doesn't super.get_list work?? + # whyyyyy doesn't super.get_list(recipient_type) work?? # whhhyyyyy can't I implement a parameter-less version of get_list when i include a get_list matching # parent's method signature??? # whyyyyyyy diff --git a/test/channel_test.rb b/test/channel_test.rb index a2cbfdb6..387ef6c0 100644 --- a/test/channel_test.rb +++ b/test/channel_test.rb @@ -47,4 +47,13 @@ end end end + + describe "details" do + it "displays correct details" do + channel_list = Channel.get_list("channel") + target_channel = channel_list.find {|channel| channel.name == "random"} + target_a = ["random", "CVBCU0R37", "Non-work banter and water cooler conversation", 1] + expect(target_channel.details).must_equal target_a + end + end end \ No newline at end of file From 135367ad1b9a563349be6c5877bfad894516aef6 Mon Sep 17 00:00:00 2001 From: Yaz Date: Mon, 16 Mar 2020 01:05:07 -0700 Subject: [PATCH 15/27] Added User#details, overwriting parent method. Passed tests. --- lib/user.rb | 10 ++++++++++ test/user_test.rb | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/lib/user.rb b/lib/user.rb index 45108112..7af19854 100644 --- a/lib/user.rb +++ b/lib/user.rb @@ -7,9 +7,19 @@ def initialize(name, slack_id, real_name) @real_name = real_name end + def details + return super + [real_name] + end + def self.get_list(recipient_type) # why doesn't super.get_list("user") work here??? response = Recipient.get_list(recipient_type) + # Two errors with above and below: + # NoMethodError - HTTParty::Response doesn't have a get_list method...WHAT? why does it think + # i'm calling get_list on response?? Because super.get_list returns a HTTParty::Response object? + # ArgumentError (expected 1, given 0) - when using super, i get this error even though I am passing + # an argument. I quintuple checked my code for syntax errors but the error remained. + # Why doesn't the following line, with the commented-out, instantiated method below, work??? # I'd like to have user's version of get_list be parameter-less. #response = self.get_list("user") diff --git a/test/user_test.rb b/test/user_test.rb index ef4e4485..205dddbd 100644 --- a/test/user_test.rb +++ b/test/user_test.rb @@ -17,6 +17,15 @@ end + describe "details" do + it "displays correct details" do + user_list = User.get_list("user") + target_user = user_list.find {|user| user.name == "slackbot"} + target_a = ["slackbot", "USLACKBOT", "Slackbot" ] + expect(target_user.details).must_equal target_a + end + end + describe ".get_list" do # TO DO: before block with VCR cassette? it "returns array" do From d4d4081866ce80674d5a6db9c071284daddc673a Mon Sep 17 00:00:00 2001 From: Yaz Date: Mon, 16 Mar 2020 01:11:36 -0700 Subject: [PATCH 16/27] refactored child implementation of Recipient.get_list in User and Channel - with passing tests. --- lib/channel.rb | 8 ++------ lib/user.rb | 17 ++--------------- test/channel_test.rb | 8 ++++---- test/user_test.rb | 8 ++++---- 4 files changed, 12 insertions(+), 29 deletions(-) diff --git a/lib/channel.rb b/lib/channel.rb index ee24d2e6..81d2e24f 100644 --- a/lib/channel.rb +++ b/lib/channel.rb @@ -11,12 +11,8 @@ def details return super + [topic, member_count] end - def self.get_list(recipient_type) - # whyyyyy doesn't super.get_list(recipient_type) work?? - # whhhyyyyy can't I implement a parameter-less version of get_list when i include a get_list matching - # parent's method signature??? - # whyyyyyyy - response = Recipient.get_list(recipient_type) + def self.get_list + response = super("channel") list = [] response.parsed_response["channels"].each do |channel| list << Channel.new(channel["name"], channel["id"], channel["topic"]["value"], channel["num_members"]) diff --git a/lib/user.rb b/lib/user.rb index 7af19854..8371b369 100644 --- a/lib/user.rb +++ b/lib/user.rb @@ -11,18 +11,8 @@ def details return super + [real_name] end - def self.get_list(recipient_type) - # why doesn't super.get_list("user") work here??? - response = Recipient.get_list(recipient_type) - # Two errors with above and below: - # NoMethodError - HTTParty::Response doesn't have a get_list method...WHAT? why does it think - # i'm calling get_list on response?? Because super.get_list returns a HTTParty::Response object? - # ArgumentError (expected 1, given 0) - when using super, i get this error even though I am passing - # an argument. I quintuple checked my code for syntax errors but the error remained. - - # Why doesn't the following line, with the commented-out, instantiated method below, work??? - # I'd like to have user's version of get_list be parameter-less. - #response = self.get_list("user") + def self.get_list + response = super("user") list = [] response.parsed_response["members"].each do |member| list << User.new(member["name"], member["id"], member["real_name"]) @@ -30,7 +20,4 @@ def self.get_list(recipient_type) return list end - # def self.get_list(recipient_type) - # return super.get_list(recipient_type) - # end end diff --git a/test/channel_test.rb b/test/channel_test.rb index 387ef6c0..6c6f1f72 100644 --- a/test/channel_test.rb +++ b/test/channel_test.rb @@ -22,7 +22,7 @@ # TO DO: before block with cassette it "returns array" do VCR.use_cassette("Channel.get_list") do - channel_list = Channel.get_list("channel") + channel_list = Channel.get_list expect(channel_list).must_be_kind_of Array expect(channel_list.empty?).must_equal false expect(channel_list.first).must_be_kind_of Channel @@ -31,7 +31,7 @@ it "has channel called Random" do VCR.use_cassette("Channel.get_list") do - channel_list = Channel.get_list("channel") + channel_list = Channel.get_list target_channel = channel_list.find {|channel| channel.name == "random"} expect(target_channel).must_be_kind_of Channel end @@ -39,7 +39,7 @@ it "channel SlackBot has expected state" do VCR.use_cassette("Channel.get_list") do - channel_list = Channel.get_list("channel") + channel_list = Channel.get_list target_channel = channel_list.find {|channel| channel.name == "random"} expect(target_channel.slack_id).must_equal "CVBCU0R37" expect(target_channel.topic).must_equal "Non-work banter and water cooler conversation" @@ -50,7 +50,7 @@ describe "details" do it "displays correct details" do - channel_list = Channel.get_list("channel") + channel_list = Channel.get_list target_channel = channel_list.find {|channel| channel.name == "random"} target_a = ["random", "CVBCU0R37", "Non-work banter and water cooler conversation", 1] expect(target_channel.details).must_equal target_a diff --git a/test/user_test.rb b/test/user_test.rb index 205dddbd..1cc475a4 100644 --- a/test/user_test.rb +++ b/test/user_test.rb @@ -19,7 +19,7 @@ describe "details" do it "displays correct details" do - user_list = User.get_list("user") + user_list = User.get_list target_user = user_list.find {|user| user.name == "slackbot"} target_a = ["slackbot", "USLACKBOT", "Slackbot" ] expect(target_user.details).must_equal target_a @@ -30,7 +30,7 @@ # TO DO: before block with VCR cassette? it "returns array" do VCR.use_cassette("User.get_list") do - user_list = User.get_list("user") + user_list = User.get_list expect(user_list).must_be_kind_of Array expect(user_list.empty?).must_equal false expect(user_list.first).must_be_kind_of User @@ -39,7 +39,7 @@ it "has user called SlackBot" do VCR.use_cassette("User.get_list") do - user_list = User.get_list("user") + user_list = User.get_list target_user = user_list.find {|user| user.name == "slackbot"} expect(target_user).must_be_kind_of User end @@ -47,7 +47,7 @@ it "user SlackBot has expected state" do VCR.use_cassette("User.get_list") do - user_list = User.get_list("user") + user_list = User.get_list target_user = user_list.find {|user| user.name == "slackbot"} expect(target_user.slack_id).must_equal "USLACKBOT" expect(target_user.real_name).must_equal "Slackbot" From 66b6f6425fa37d55972d74b1b47a9c2abed05325 Mon Sep 17 00:00:00 2001 From: Yaz Date: Mon, 16 Mar 2020 01:13:20 -0700 Subject: [PATCH 17/27] changed Workspace#init to reflect refactors of User and Channel --- lib/workspace.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/workspace.rb b/lib/workspace.rb index 7a87326b..9433ff39 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -3,8 +3,8 @@ class Workspace attr_reader :users, :channels def initialize - @users = User.get_list("user") - @channels = Channel.get_list("channel") + @users = User.get_list + @channels = Channel.get_list end def print_list(recipient) From e7fd5c2be09b1de319dfd4a8802ea8b1729ebe72 Mon Sep 17 00:00:00 2001 From: Yaz Date: Mon, 16 Mar 2020 01:36:31 -0700 Subject: [PATCH 18/27] Added Workspace#select, added tests for #select and #print_list --- lib/workspace.rb | 11 +++++++++++ test/workspace_test.rb | 39 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/lib/workspace.rb b/lib/workspace.rb index 9433ff39..fc598e7b 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -7,6 +7,17 @@ def initialize @channels = Channel.get_list end + def select(recipient) + case recipient + when "user" + return users + when "channel" + return channels + else + raise ArgumentError.new("Invalid recipient.") + end + end + def print_list(recipient) case recipient when "users" diff --git a/test/workspace_test.rb b/test/workspace_test.rb index 8a557cf5..48480f91 100644 --- a/test/workspace_test.rb +++ b/test/workspace_test.rb @@ -1,6 +1,6 @@ require_relative 'test_helper' -xdescribe 'Workspace' do +describe 'Workspace' do describe 'constructor' do before do VCR.use_cassette("workspace") do @@ -20,10 +20,43 @@ expect(target_user).must_be_kind_of User end - it "users contains users" do + it "channels contains channels" do expect(@workspace.channels.first).must_be_kind_of Channel target_channel = @workspace.channels.find {|channel| channel.name == "random"} - expect(target_user).must_be_kind_of Channel + expect(target_channel).must_be_kind_of Channel + end + end + + describe "print_list" do + before do + VCR.use_cassette("workspace") do + @workspace = Workspace.new + end + end + it "throws ArgError when given invalid recipient" do + expect{@workspace.print_list("blue")}.must_raise ArgumentError + end + + end + + describe "select" do + before do + VCR.use_cassette("workspace") do + @workspace = Workspace.new + end + end + it "throws ArgError when given invalid recipient" do + expect{@workspace.select("oogie")}.must_raise ArgumentError + end + it "returns array of users" do + target_a = @workspace.select("user") + expect(target_a).must_be_kind_of Array + expect(target_a.first).must_be_kind_of User + end + it "returns array of channels" do + target_a = @workspace.select("channel") + expect(target_a).must_be_kind_of Array + expect(target_a.first).must_be_kind_of Channel end end end \ No newline at end of file From b82c476695cadb5ec7e9f963d960ae8424802746 Mon Sep 17 00:00:00 2001 From: Yaz Date: Mon, 16 Mar 2020 02:11:11 -0700 Subject: [PATCH 19/27] Wave 2 complete. slack.rb now has working options for select user, select channel, details. Added ap to lib_helper.rb --- lib/lib_helper.rb | 1 + lib/slack.rb | 29 +++++++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/lib/lib_helper.rb b/lib/lib_helper.rb index ab5dcb78..a9351763 100644 --- a/lib/lib_helper.rb +++ b/lib/lib_helper.rb @@ -1,4 +1,5 @@ require 'table_print' +require 'ap' require 'HTTParty' require 'dotenv' Dotenv.load diff --git a/lib/slack.rb b/lib/slack.rb index 6a93c21c..9061ef36 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -1,20 +1,45 @@ require_relative 'workspace' +def select(input, workspace) + input = input.split(" ")[1] + selected = workspace.select(input) + puts "Enter the Slack ID, channel name, or username of the recipient." + input = gets.chomp + selected = selected.find {|recipient| recipient.name == input || recipient.slack_id == input} + if selected == nil + puts "Recipient not found." + else + puts "#{selected.class} #{selected.name} selected." + end + return selected +end + def main puts "Welcome to the Ada Slack CLI!" workspace = Workspace.new puts "This workspace has #{workspace.users.length} users and #{workspace.channels.length} channels." input = "" - # TO DO: refactor to meet requirements of typing out options (wave 1) + selected = nil while input != "quit" puts "\nWhat would you like to do?" - puts "list users \nlist channels \nquit" + puts "list users \nlist channels \nselect user \nselect channel \ndetails \nquit \n\n" input = gets.chomp.downcase case input when "list users" workspace.print_list("users") when "list channels" workspace.print_list("channels") + when "select user" + selected = select(input, workspace) + when "select channel" + selected = select(input, workspace) + when "details" + if selected == nil + puts "You must select a recipient before asking for details." + else + # TO DO; refactor details so that table print can be used + ap selected.details + end when "quit" puts "Goodbye!" else From e81e7a35bc77334cb9ed6ee10bcbbf43d2d87d0d Mon Sep 17 00:00:00 2001 From: Yaz Date: Mon, 16 Mar 2020 02:13:59 -0700 Subject: [PATCH 20/27] added cassettes to .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3ff4fada..646a3790 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ /coverage/ - +/test/cassettes .DS_Store # Ignore environemnt variables From b4e017041439125f39083561536363c57420119f Mon Sep 17 00:00:00 2001 From: Yaz Date: Mon, 16 Mar 2020 21:14:14 -0700 Subject: [PATCH 21/27] changed Recipient.get_list and its child methods in User + Channel to have one responsibilty - cleaning up use of 'super' to be more understandable and remove a complicated bug. Created .make_query in parent and children to do this. --- lib/channel.rb | 6 +++++- lib/recipient.rb | 29 ++++++++++++++++++++++------ lib/user.rb | 6 +++++- test/channel_test.rb | 40 ++++++++++++++++++++------------------ test/recipient_test.rb | 23 +++++++++++++++------- test/user_test.rb | 44 ++++++++++++++++++++++-------------------- 6 files changed, 93 insertions(+), 55 deletions(-) diff --git a/lib/channel.rb b/lib/channel.rb index 81d2e24f..3739b722 100644 --- a/lib/channel.rb +++ b/lib/channel.rb @@ -11,8 +11,12 @@ def details return super + [topic, member_count] end + def self.make_query + return super("channel") + end + def self.get_list - response = super("channel") + response = self.make_query list = [] response.parsed_response["channels"].each do |channel| list << Channel.new(channel["name"], channel["id"], channel["topic"]["value"], channel["num_members"]) diff --git a/lib/recipient.rb b/lib/recipient.rb index 398b07ae..f5d4434f 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -1,5 +1,7 @@ require_relative 'lib_helper' -#template method for Channel and User +#parent class for Channel and User +class API_Error < StandardError +end class Recipient attr_reader :name, :slack_id @@ -12,17 +14,32 @@ def details return [name, slack_id] end - # TO DO: try putting a parameter-less version of get list here, with an uninstantiated error. - def self.get_list(recipient_kind) + # def compose(message, to_recipient) + # if message.class != String + # raise ArgumentError.new("Message must be string") + # end + # post_param = { + # token: API_KEY, + # text: message, + # channel: slack_id, + # } + # response = HTTParty.post(BASE_URL + 'chat.postMessage', body: post_param) + # if !response["ok"] + # raise API_Error.new("#{response["error"]}") + # end + # return response + # end + + def self.make_query(recipient_kind) if recipient_kind != "user" && recipient_kind != "channel" raise ArgumentError.new("Not a valid recipient") end - response = HTTParty.get(BASE_URL + "#{recipient_kind}s.list", query: QUERY_PARAM) + query_param = {token: API_KEY} + response = HTTParty.get(BASE_URL + "#{recipient_kind}s.list", query: query_param) if !response["ok"] raise API_Error.new("#{response["error"]}") end return response end + end -class API_Error < StandardError -end \ No newline at end of file diff --git a/lib/user.rb b/lib/user.rb index 8371b369..b80dfbf3 100644 --- a/lib/user.rb +++ b/lib/user.rb @@ -11,8 +11,12 @@ def details return super + [real_name] end + def self.make_query + return super("user") + end + def self.get_list - response = super("user") + response = self.make_query list = [] response.parsed_response["members"].each do |member| list << User.new(member["name"], member["id"], member["real_name"]) diff --git a/test/channel_test.rb b/test/channel_test.rb index 6c6f1f72..da808b41 100644 --- a/test/channel_test.rb +++ b/test/channel_test.rb @@ -19,31 +19,33 @@ end describe "get_list" do - # TO DO: before block with cassette - it "returns array" do + before do VCR.use_cassette("Channel.get_list") do - channel_list = Channel.get_list - expect(channel_list).must_be_kind_of Array - expect(channel_list.empty?).must_equal false - expect(channel_list.first).must_be_kind_of Channel + @channel_list = Channel.get_list + @target_channel = @channel_list.find {|channel| channel.name == "random"} end end + it "returns array" do + expect(@channel_list).must_be_kind_of Array + expect(@channel_list.empty?).must_equal false + expect(@channel_list.first).must_be_kind_of Channel + end it "has channel called Random" do - VCR.use_cassette("Channel.get_list") do - channel_list = Channel.get_list - target_channel = channel_list.find {|channel| channel.name == "random"} - expect(target_channel).must_be_kind_of Channel - end + expect(@target_channel).must_be_kind_of Channel end - it "channel SlackBot has expected state" do - VCR.use_cassette("Channel.get_list") do - channel_list = Channel.get_list - target_channel = channel_list.find {|channel| channel.name == "random"} - expect(target_channel.slack_id).must_equal "CVBCU0R37" - expect(target_channel.topic).must_equal "Non-work banter and water cooler conversation" - expect(target_channel.member_count).must_equal 1 + it "channel random has expected state" do + expect(@target_channel.slack_id).must_equal "CVBCU0R37" + expect(@target_channel.topic).must_equal "Non-work banter and water cooler conversation" + expect(@target_channel.member_count).must_equal 1 + end + + xit "sends message" do + VCR.use_cassette("channel-post-success") do + #test for failing POST is in recipient + response = @target_channel.send("hello, from bot") + expect(response["message"]["text"]).must_equal "hello, from bot" end end end @@ -52,7 +54,7 @@ it "displays correct details" do channel_list = Channel.get_list target_channel = channel_list.find {|channel| channel.name == "random"} - target_a = ["random", "CVBCU0R37", "Non-work banter and water cooler conversation", 1] + target_a = ["random", "CVBCU0R37", "Non-work banter and water cooler conversation", 2] expect(target_channel.details).must_equal target_a end end diff --git a/test/recipient_test.rb b/test/recipient_test.rb index 120fc6f1..6b12689b 100644 --- a/test/recipient_test.rb +++ b/test/recipient_test.rb @@ -21,14 +21,23 @@ end end - describe "get_list" do + xdescribe "send" do + it "raises API error" do + VCR.use_cassette("post-fail") do + bunk_rec = Recipient.new("Test", "T00000001") + expect{bunk_rec.send("hi")}.must_raise API_Error + end + end + end + + describe "make_query" do it "raises error for invalid recipient type" do - expect{Recipient.get_list("oogie-woogie")}.must_raise ArgumentError + expect{Recipient.make_query("oogie-woogie")}.must_raise ArgumentError end it "generates needed information for a user list" do - VCR.use_cassette("Recipient#get_list(user)") do - user_list = Recipient.get_list("user") + VCR.use_cassette("Recipient#make_query(user)") do + user_list = Recipient.make_query("user") expect(user_list["ok"]).must_equal true expect(user_list["members"]).must_be_kind_of Array end @@ -36,8 +45,8 @@ end it "generates needed information for a channel list" do - VCR.use_cassette("Recipient#get_list(channel)") do - channel_list = Recipient.get_list("channel") + VCR.use_cassette("Recipient#make_query(channel)") do + channel_list = Recipient.make_query("channel") expect(channel_list["ok"]).must_equal true expect(channel_list["channels"]).must_be_kind_of Array end @@ -56,7 +65,7 @@ # it "throws API_Error when API_KEY is invalid" do # expect { # ENV["SLACK_TOKEN"]= "xoxb-98095036Y595-980354253761-FBM9Y9WcbC3S90lUbCYMG0ET" - # Recipient.get_list("user") + # Recipient.make_query("user") # }.must_raise API_Error # end end diff --git a/test/user_test.rb b/test/user_test.rb index 1cc475a4..19282e52 100644 --- a/test/user_test.rb +++ b/test/user_test.rb @@ -19,38 +19,40 @@ describe "details" do it "displays correct details" do - user_list = User.get_list - target_user = user_list.find {|user| user.name == "slackbot"} - target_a = ["slackbot", "USLACKBOT", "Slackbot" ] - expect(target_user.details).must_equal target_a + VCR.use_cassette("User.get_list") do + user_list = User.get_list + target_user = user_list.find {|user| user.name == "slackbot"} + target_a = ["slackbot", "USLACKBOT", "Slackbot" ] + expect(target_user.details).must_equal target_a + end end end - describe ".get_list" do - # TO DO: before block with VCR cassette? - it "returns array" do + describe ".get_list + send" do + before do VCR.use_cassette("User.get_list") do - user_list = User.get_list - expect(user_list).must_be_kind_of Array - expect(user_list.empty?).must_equal false - expect(user_list.first).must_be_kind_of User + @user_list = User.get_list + @target_user = selected = @user_list.find {|recipient| recipient.name == "slackbot"} end end + it "returns array" do + expect(@user_list).must_be_kind_of Array + expect(@user_list.empty?).must_equal false + expect(@user_list.first).must_be_kind_of User + end it "has user called SlackBot" do - VCR.use_cassette("User.get_list") do - user_list = User.get_list - target_user = user_list.find {|user| user.name == "slackbot"} - expect(target_user).must_be_kind_of User - end + expect(@target_user).must_be_kind_of User end it "user SlackBot has expected state" do - VCR.use_cassette("User.get_list") do - user_list = User.get_list - target_user = user_list.find {|user| user.name == "slackbot"} - expect(target_user.slack_id).must_equal "USLACKBOT" - expect(target_user.real_name).must_equal "Slackbot" + expect(@target_user.slack_id).must_equal "USLACKBOT" + expect(@target_user.real_name).must_equal "Slackbot" + end + + it "sends message" do + VCR.use_cassette("post-success") do + #test for failing POST is in recipient end end From 55b14fc9de25539757eeefd3d299292df776f624 Mon Sep 17 00:00:00 2001 From: Yaz Date: Mon, 16 Mar 2020 22:03:24 -0700 Subject: [PATCH 22/27] changed implementation of state in parent Recipient and children User + CHannel. This affects #details- which now returns a hash instead of an array. --- lib/channel.rb | 14 +++++++++----- lib/recipient.rb | 38 +++++++++++++------------------------- lib/user.rb | 8 +++----- test/channel_test.rb | 4 ++-- test/recipient_test.rb | 6 +++--- test/user_test.rb | 3 +-- 6 files changed, 31 insertions(+), 42 deletions(-) diff --git a/lib/channel.rb b/lib/channel.rb index 3739b722..9eb867f1 100644 --- a/lib/channel.rb +++ b/lib/channel.rb @@ -1,16 +1,20 @@ require_relative 'recipient.rb' class Channel < Recipient - attr_reader :topic, :member_count + def initialize(name, slack_id, topic, member_count) super(name, slack_id) - @topic = topic - @member_count = member_count + @details["topic"] = topic + @details["num_members"] = member_count end - def details - return super + [topic, member_count] + def topic + return details["topic"] end + def member_count + return details["num_members"] + end + def self.make_query return super("channel") end diff --git a/lib/recipient.rb b/lib/recipient.rb index f5d4434f..40d70100 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -1,45 +1,33 @@ require_relative 'lib_helper' -#parent class for Channel and User +#template method for Channel and User class API_Error < StandardError end class Recipient - attr_reader :name, :slack_id - + attr_reader :details def initialize(name, slack_id) - @name = name - @slack_id = slack_id + @details = { + "name" => name, + "id" => slack_id + } end - def details - return [name, slack_id] + + def name + return @details["name"] end - # def compose(message, to_recipient) - # if message.class != String - # raise ArgumentError.new("Message must be string") - # end - # post_param = { - # token: API_KEY, - # text: message, - # channel: slack_id, - # } - # response = HTTParty.post(BASE_URL + 'chat.postMessage', body: post_param) - # if !response["ok"] - # raise API_Error.new("#{response["error"]}") - # end - # return response - # end + def slack_id + return @details["id"] + end def self.make_query(recipient_kind) if recipient_kind != "user" && recipient_kind != "channel" raise ArgumentError.new("Not a valid recipient") end - query_param = {token: API_KEY} - response = HTTParty.get(BASE_URL + "#{recipient_kind}s.list", query: query_param) + response = HTTParty.get(BASE_URL + "#{recipient_kind}s.list", query: QUERY_PARAM) if !response["ok"] raise API_Error.new("#{response["error"]}") end return response end - end diff --git a/lib/user.rb b/lib/user.rb index b80dfbf3..7778ddd8 100644 --- a/lib/user.rb +++ b/lib/user.rb @@ -1,14 +1,13 @@ require_relative 'recipient.rb' class User < Recipient - attr_reader :real_name def initialize(name, slack_id, real_name) super(name, slack_id) - @real_name = real_name + @details["real_name"] = real_name end - def details - return super + [real_name] + def real_name + return details["real_name"] end def self.make_query @@ -23,5 +22,4 @@ def self.get_list end return list end - end diff --git a/test/channel_test.rb b/test/channel_test.rb index da808b41..c72f2e7c 100644 --- a/test/channel_test.rb +++ b/test/channel_test.rb @@ -54,8 +54,8 @@ it "displays correct details" do channel_list = Channel.get_list target_channel = channel_list.find {|channel| channel.name == "random"} - target_a = ["random", "CVBCU0R37", "Non-work banter and water cooler conversation", 2] - expect(target_channel.details).must_equal target_a + expect(target_channel.details["topic"]).must_equal "Non-work banter and water cooler conversation" + expect(target_channel.details["num_members"]).must_equal 2 end end end \ No newline at end of file diff --git a/test/recipient_test.rb b/test/recipient_test.rb index 6b12689b..4cad6c73 100644 --- a/test/recipient_test.rb +++ b/test/recipient_test.rb @@ -13,11 +13,11 @@ end end - describe "details" do + describe "self.details" do it "returns array of name and id" do recipient = Recipient.new("Test", "T00000001") - target_a = ["Test", "T00000001"] - expect(recipient.details).must_equal target_a + expect(recipient.details["id"]).must_equal "T00000001" + expect(recipient.details["name"]).must_equal "Test" end end diff --git a/test/user_test.rb b/test/user_test.rb index 19282e52..df4b17e0 100644 --- a/test/user_test.rb +++ b/test/user_test.rb @@ -22,8 +22,7 @@ VCR.use_cassette("User.get_list") do user_list = User.get_list target_user = user_list.find {|user| user.name == "slackbot"} - target_a = ["slackbot", "USLACKBOT", "Slackbot" ] - expect(target_user.details).must_equal target_a + expect(target_user.details["real_name"]).must_equal "Slackbot" end end end From f7f541f61ddc485237ee795d3b7653674f225e8c Mon Sep 17 00:00:00 2001 From: Yaz Date: Mon, 16 Mar 2020 22:06:23 -0700 Subject: [PATCH 23/27] fixed bug created by using String.downcase --- lib/slack.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/slack.rb b/lib/slack.rb index 9061ef36..4949fb6d 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -23,7 +23,7 @@ def main while input != "quit" puts "\nWhat would you like to do?" puts "list users \nlist channels \nselect user \nselect channel \ndetails \nquit \n\n" - input = gets.chomp.downcase + input = gets.chomp case input when "list users" workspace.print_list("users") From 3d56012602ac5732086be1dfeb6843e33ce22a81 Mon Sep 17 00:00:00 2001 From: Yaz Date: Tue, 17 Mar 2020 01:39:21 -0700 Subject: [PATCH 24/27] Wave 3 complete. Finally. --- lib/channel.rb | 2 +- lib/recipient.rb | 2 +- lib/slack.rb | 19 +++++++++++++------ lib/workspace.rb | 33 +++++++++++++++++++++++++++++---- test/recipient_test.rb | 34 +++++++++------------------------- test/workspace_test.rb | 23 +++++++++++++++-------- 6 files changed, 68 insertions(+), 45 deletions(-) diff --git a/lib/channel.rb b/lib/channel.rb index 9eb867f1..407cb918 100644 --- a/lib/channel.rb +++ b/lib/channel.rb @@ -14,7 +14,7 @@ def topic def member_count return details["num_members"] end - + def self.make_query return super("channel") end diff --git a/lib/recipient.rb b/lib/recipient.rb index 40d70100..6c1d5143 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -11,7 +11,6 @@ def initialize(name, slack_id) } end - def name return @details["name"] end @@ -30,4 +29,5 @@ def self.make_query(recipient_kind) end return response end + end diff --git a/lib/slack.rb b/lib/slack.rb index 4949fb6d..fdce4458 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -1,11 +1,10 @@ require_relative 'workspace' def select(input, workspace) - input = input.split(" ")[1] - selected = workspace.select(input) + recipient_kind = input.split(" ")[1] puts "Enter the Slack ID, channel name, or username of the recipient." - input = gets.chomp - selected = selected.find {|recipient| recipient.name == input || recipient.slack_id == input} + recipient_id = gets.chomp + selected = workspace.select(recipient_kind, recipient_id) if selected == nil puts "Recipient not found." else @@ -22,7 +21,7 @@ def main selected = nil while input != "quit" puts "\nWhat would you like to do?" - puts "list users \nlist channels \nselect user \nselect channel \ndetails \nquit \n\n" + puts "list users \nlist channels \nselect user \nselect channel \ndetails \nsend message \nquit \n\n" input = gets.chomp case input when "list users" @@ -37,9 +36,17 @@ def main if selected == nil puts "You must select a recipient before asking for details." else - # TO DO; refactor details so that table print can be used ap selected.details end + when "send message" + if selected == nil + puts "You must select a recipient before asking for details." + else + puts "What is your message to #{selected.name}?" + text = gets.chomp + workspace.post(text, selected) + puts "Your message to #{selected.name} was successfully sent." + end when "quit" puts "Goodbye!" else diff --git a/lib/workspace.rb b/lib/workspace.rb index fc598e7b..8a6664b7 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -7,12 +7,12 @@ def initialize @channels = Channel.get_list end - def select(recipient) - case recipient + def select(recipient_kind, recipient_id) + case recipient_kind when "user" - return users + return find(users, recipient_id) when "channel" - return channels + return find(channels, recipient_id) else raise ArgumentError.new("Invalid recipient.") end @@ -29,5 +29,30 @@ def print_list(recipient) end end + def post(text, destination) + compose_message(text, destination) + response = HTTParty.post(BASE_URL + 'chat.postMessage', body: compose_message(text, destination)) + if !response["ok"] + raise API_Error.new("#{response["error"]}") + end + return response + end + + private + def compose_message(text, destination) + if !(destination.is_a? Recipient) + raise ArgumentError.new("Not a valid recipient") + end + return post_param = { + token: API_KEY, + channel: destination.slack_id, + text: text + } + end + + def find(recipient_kind, recipient_id) + selected = recipient_kind.find {|recipient| recipient.name == recipient_id || recipient.slack_id == recipient_id} + return selected + end end \ No newline at end of file diff --git a/test/recipient_test.rb b/test/recipient_test.rb index 4cad6c73..ae195bbc 100644 --- a/test/recipient_test.rb +++ b/test/recipient_test.rb @@ -21,15 +21,6 @@ end end - xdescribe "send" do - it "raises API error" do - VCR.use_cassette("post-fail") do - bunk_rec = Recipient.new("Test", "T00000001") - expect{bunk_rec.send("hi")}.must_raise API_Error - end - end - end - describe "make_query" do it "raises error for invalid recipient type" do expect{Recipient.make_query("oogie-woogie")}.must_raise ArgumentError @@ -52,21 +43,14 @@ end end - - # how do I write a test for my API_Error? I need an invalid - # token to be passed in a way that won't mess up all the other - # tests....can I force a different value of API_KEY (located - # in lib/lib_helper) in a particular test? - # looked into dotenv - not much luck without using bash - # could write another option into source code to test this - but - # i don't like this option - - # this doesn't work: - # it "throws API_Error when API_KEY is invalid" do - # expect { - # ENV["SLACK_TOKEN"]= "xoxb-98095036Y595-980354253761-FBM9Y9WcbC3S90lUbCYMG0ET" - # Recipient.make_query("user") - # }.must_raise API_Error - # end + #how do I test for a bad API key??? + xit "throws API_Error when API_KEY is invalid" do + VCR.use_cassette("query fail") do + + expect { + + }.must_raise API_Error + end + end end end \ No newline at end of file diff --git a/test/workspace_test.rb b/test/workspace_test.rb index 48480f91..4084fd6e 100644 --- a/test/workspace_test.rb +++ b/test/workspace_test.rb @@ -46,17 +46,24 @@ end end it "throws ArgError when given invalid recipient" do - expect{@workspace.select("oogie")}.must_raise ArgumentError + expect{@workspace.select("oogie", "boogie")}.must_raise ArgumentError end - it "returns array of users" do - target_a = @workspace.select("user") - expect(target_a).must_be_kind_of Array - expect(target_a.first).must_be_kind_of User + it "returns a user" do + target_user = @workspace.select("user", "slackbot") + expect(target_user).must_be_kind_of User end it "returns array of channels" do - target_a = @workspace.select("channel") - expect(target_a).must_be_kind_of Array - expect(target_a.first).must_be_kind_of Channel + target_channel = @workspace.select("channel", "random") + expect(target_channel).must_be_kind_of Channel + end + end + + describe "post" do + it "raises API error" do + VCR.use_cassette("post-fail") do + bunk_rec = Recipient.new("Test", "T00000001") + expect{bunk_rec.post("hi", bunk_rec)}.must_raise API_Error + end end end end \ No newline at end of file From 5b35106329eb08d4b33aaef1ed27fcf4312d0e83 Mon Sep 17 00:00:00 2001 From: Yaz Date: Tue, 17 Mar 2020 02:39:50 -0700 Subject: [PATCH 25/27] Added message history functionality --- lib/recipient.rb | 2 ++ lib/slack.rb | 9 ++++++++- lib/workspace.rb | 7 +++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/recipient.rb b/lib/recipient.rb index 6c1d5143..54686261 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -4,11 +4,13 @@ class API_Error < StandardError end class Recipient attr_reader :details + attr_accessor :messages def initialize(name, slack_id) @details = { "name" => name, "id" => slack_id } + @messages = {} end def name diff --git a/lib/slack.rb b/lib/slack.rb index fdce4458..ca4d62f1 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -21,7 +21,7 @@ def main selected = nil while input != "quit" puts "\nWhat would you like to do?" - puts "list users \nlist channels \nselect user \nselect channel \ndetails \nsend message \nquit \n\n" + puts "list users \nlist channels \nselect user \nselect channel \ndetails \nsend message \nmessage history \nquit \n\n" input = gets.chomp case input when "list users" @@ -47,6 +47,13 @@ def main workspace.post(text, selected) puts "Your message to #{selected.name} was successfully sent." end + when "message history" + if selected == nil + puts "You must select a recipient before asking for details." + else + puts "Messages sent to #{selected.name}:" + ap selected.messages.values + end when "quit" puts "Goodbye!" else diff --git a/lib/workspace.rb b/lib/workspace.rb index 8a6664b7..bc89a970 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -35,6 +35,7 @@ def post(text, destination) if !response["ok"] raise API_Error.new("#{response["error"]}") end + record_message(destination, response) return response end @@ -54,5 +55,11 @@ def find(recipient_kind, recipient_id) selected = recipient_kind.find {|recipient| recipient.name == recipient_id || recipient.slack_id == recipient_id} return selected end + + def record_message(recipient, response) + time_stamp = response["ts"] + text = response["message"]["text"] + recipient.messages[time_stamp] = text + end end \ No newline at end of file From 150e84d02d2b08371252a069b777dd4973954d04 Mon Sep 17 00:00:00 2001 From: Yaz O'Shaughnessy <54053695+saintmedusa@users.noreply.github.com> Date: Mon, 23 Mar 2020 21:08:49 -0700 Subject: [PATCH 26/27] made record_message private better encapsulation --- lib/workspace.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/workspace.rb b/lib/workspace.rb index bc89a970..6ad16053 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -55,11 +55,12 @@ def find(recipient_kind, recipient_id) selected = recipient_kind.find {|recipient| recipient.name == recipient_id || recipient.slack_id == recipient_id} return selected end - + + private def record_message(recipient, response) time_stamp = response["ts"] text = response["message"]["text"] recipient.messages[time_stamp] = text end -end \ No newline at end of file +end From eb0021bd03979e469d7dbe84d0feae3fa23b1a87 Mon Sep 17 00:00:00 2001 From: Yaz O'Shaughnessy <54053695+saintmedusa@users.noreply.github.com> Date: Mon, 23 Mar 2020 21:11:48 -0700 Subject: [PATCH 27/27] silly me, #record_message was already private --- lib/workspace.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/workspace.rb b/lib/workspace.rb index 6ad16053..4385c96b 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -56,7 +56,6 @@ def find(recipient_kind, recipient_id) return selected end - private def record_message(recipient, response) time_stamp = response["ts"] text = response["message"]["text"]