spec/reviewlette_spec.rb in reviewlette-0.0.6 vs spec/reviewlette_spec.rb in reviewlette-0.0.7
- old
+ new
@@ -1,367 +1,71 @@
require 'spec_helper'
describe Reviewlette do
- # set instance variable from local variable
- def instance_variable!(variable_name)
- Reviewlette.instance_variable_set("@#{variable_name}", send(variable_name.to_sym))
- end
+ subject { Reviewlette }
+ let( :reviewlette ) { subject.new }
- let(:number) { 23 }
- let(:title) { 'title' }
- let(:body) { 'body' }
- let(:githubname) { 'gitty' }
- let(:trelloname) { 'jschmid' }
- let(:github_stub) { github_stub }
- let(:board) { stub_boards_call }
- let(:repo) { 'repo/repo' }
- let(:id) { 23 }
- let(:card) { stub_card_call }
- let(:logger) { double 'logger' }
- let(:repos) { %w[repo/repo, repos/repos] }
- let(:trello_connection) { double 'trello_connection' }
- let(:reviewer) {double 'reviewer'}
- let(:db) {Reviewlette::Database.new}
- let(:github_connection) { double 'github_connection' }
- let(:full_comment) { @full_comment = "@#{trelloname} will review https://github.com/#{repo}/issues/#{number.to_s}" }
- let(:exp) { AlreadyAssignedException }
+ before {
+ allow(GithubConnection).to receive(:new).and_return GithubConnection
+ allow(TrelloConnection).to receive(:new).and_return TrelloConnection
+ }
- describe '.spin' do
- before do
- instance_variable! :github_connection
- instance_variable! :repo
- instance_variable! :trello_connection
- instance_variable! :id
- instance_variable! :repos
- instance_variable! :title
- instance_variable! :body
- instance_variable! :number
- instance_variable! :logger
- instance_variable! :repos
- issue = { number: 1, title: 'Title', body: 'Body' }
- expect(Reviewlette).to receive(:setup)
- expect(Reviewlette).to receive(:get_available_repos).and_return [repo]
- expect(Reviewlette).to receive(:get_unassigned_github_issues).and_return [issue]
- expect(Reviewlette).to receive(:find_card).and_return true
- expect(Reviewlette).to receive(:update_vacations)
- end
- it 'spins until find_id' do
- expect(Reviewlette).to receive(:find_id).and_return false
- expect(Reviewlette).to_not receive(:set_reviewer)
- expect(Reviewlette).to_not receive(:transform_name)
- expect(Reviewlette).to_not receive(:add_reviewer_on_github)
- expect(Reviewlette).to_not receive(:comment_on_github)
- expect(Reviewlette).to_not receive(:add_to_trello_card)
- expect(Reviewlette).to_not receive(:comment_on_trello)
- expect(Reviewlette).to_not receive(:move_to_list)
- expect(Reviewlette).to_not receive(:comment_on_error)
- Reviewlette.spin
+ describe '.new' do
+ it 'sets github and trello connections' do
+ expect(GithubConnection).to receive (:new)
+ expect(TrelloConnection).to receive (:new)
+ subject.new
end
-
- it 'spins until set_reviewer' do
- expect(Reviewlette).to receive(:find_id).and_return true
- expect(Reviewlette).to receive(:set_reviewer)
- expect(Reviewlette).to_not receive(:transform_name)
- expect(Reviewlette).to_not receive(:add_reviewer_on_github)
- expect(Reviewlette).to_not receive(:comment_on_github)
- expect(Reviewlette).to_not receive(:add_to_trello_card)
- expect(Reviewlette).to_not receive(:comment_on_trello)
- expect(Reviewlette).to_not receive(:move_to_list)
- expect(Reviewlette).to receive(:comment_on_error)
- Reviewlette.spin
- end
-
- it 'spins until set_reviewer' do
- expect(Reviewlette).to receive(:find_id).and_return true
- expect(Reviewlette).to receive(:set_reviewer).and_return true
- expect(Reviewlette).to receive(:transform_name)
- expect(Reviewlette).to receive(:add_reviewer_on_github)
- expect(Reviewlette).to receive(:comment_on_github)
- # expect(Reviewlette).to receive(:add_to_trello_card)
- expect(Reviewlette).to receive(:comment_on_trello)
- expect(Reviewlette).to receive(:move_to_list)
- Reviewlette.instance_variable_set(:@reviewer, 'hi')
- Reviewlette.instance_variable_set(:@db, db)
- allow(@reviewer).to receive(:username)
- expect(db).to receive(:add_pr_to_db).with('Title', @reviewer.username)
- expect(Reviewlette.instance_variable_set(:@reviewer, nil))
- expect(Reviewlette).to_not receive(:comment_on_error)
- Reviewlette.spin
- end
end
- describe '.get_available_repos' do
+ describe '.run' do
- it 'pulls in an array on avaialble repos' do
+ it 'iterates over all open pull requests and extracts trello ids from name' do
+ expect(GithubConnection).to receive(:unassigned_pull_requests).and_return([{number: 11, title: 'test_issue_12'}])
+ expect(TrelloConnection).to receive(:find_card_by_id).with(12)
- instance_variable! :repos
- expect(Reviewlette.instance_variable_get(:@repos)).to be_kind_of Array #ok
- Reviewlette.get_available_repos
+ reviewlette.run
end
- end
- describe '#find_card' do
+ it 'adds assignee and reviewer comment on github, adds comment on trello and moves card' do
+ card = Trello::Card.new
+ expect(GithubConnection).to receive(:unassigned_pull_requests).and_return([{number: 11, title: 'test_issue_12'}])
+ expect(TrelloConnection).to receive(:find_card_by_id).with(12).and_return(card)
+ expect(reviewlette).to receive(:select_reviewer).and_return({'suse_username' => 'test', 'github_username' => 'testgit'})
- it 'finds the card by Github title' do
- line = 'Review_1337_name_of_pr_trello_shortid_454'
- pulls = { number: 1 }
- expect(Reviewlette).to receive(:match_pr_id_with_issue_id).and_return [pulls]
- allow(Reviewlette.find_card(line)).to receive(:match_pr_id_with_issue_id).and_return Array
- end
+ expect(GithubConnection).to receive(:add_assignee).with(11, 'testgit')
+ expect(GithubConnection).to receive(:reviewer_comment).with(11, 'testgit', card)
+ expect(GithubConnection).to receive(:repo).and_return('SUSE/test')
- end
+ expect(TrelloConnection).to receive(:comment_on_card).with("@ will review https://github.com/SUSE/test/issues/11", card)
+ expect(TrelloConnection).to receive(:move_card_to_list).with(card, 'In review')
- describe '.fetch_branch' do
-
- it 'gets the branch_name from github' do
- branch_name = 'review_github_branch_name_trello_23'
- subject.instance_variable_set(:@pullreq_ids, {number: 1})
- split_branch_name = branch_name.split('_')
- instance_variable! :github_connection
- expect(Reviewlette.instance_variable_get(:@pullreq_ids)).to receive_message_chain(:values, :index => 0).and_return number
- expect(github_connection).to receive(:get_branch_name).and_return branch_name
- expect(branch_name).to receive(:split).with('_').and_return split_branch_name
- expect(split_branch_name).to receive_message_chain(:last, :to_i)
- Reviewlette.fetch_branch
+ reviewlette.run
end
- end
- describe '.comment_on_error' do
- it 'posts a comment with the arror message on trello' do
- instance_variable! :trello_connection
- expect(trello_connection).to receive(:comment_on_card).with("Skipped Issue 1 because everyone on the team is assigned to the card", nil)
- Reviewlette.comment_on_error
- end
end
- describe '.get_unassigned_github_issues' do
- it 'returns all unassigned issues' do
- instance_variable! :github_connection
- expect(github_connection).to receive_message_chain(:list_issues, :select)
- Reviewlette.get_unassigned_github_issues
- end
- end
+ describe '.select_reviewer' do
- describe '.match_pr_id_with_issue_id' do
+ MEMBERS_CONFIG['members'] = [{'suse_username' => 'test1', 'trello_username' => 'trellotest1'},
+ {'suse_username' => 'test2', 'trello_username' => 'trellotest2'}]
- it 'matches issue id with pr id' do
- instance_variable! :github_connection
- instance_variable! :repo
- pulls = {number: 1}
- allow(github_connection).to receive(:list_pulls).and_return [pulls]
- allow(pulls).to receive(:number).and_return [1]
- Reviewlette.match_pr_id_with_issue_id
+ it 'excludes members on vacation' do
+ card = Trello::Card.new
+ allow(card).to receive(:members).and_return([])
+ expect(Vacations).to receive(:members_on_vacation).and_return(MEMBERS_CONFIG['members'].first['suse_username'])
+ expect(reviewlette.select_reviewer(nil, card)).to eq(MEMBERS_CONFIG['members'].last)
end
- end
-
- describe '.transform_name' do
- it 'transforms trelloname to github name' do
- instance_variable! :trelloname
- Reviewlette.transform_name
- expect(Reviewlette.instance_variable_get("@githubname")).to be_a_kind_of String
+ it 'excludes the owner of the trello card' do
+ card = Trello::Card.new
+ allow(card).to receive_message_chain(:members, :map).and_return(['trellotest1'])
+ expect(Vacations).to receive(:members_on_vacation).and_return([])
+ expect(reviewlette.select_reviewer(nil, card)).to eq(MEMBERS_CONFIG['members'].last)
end
- end
- describe '.find_id' do
- before do
- instance_variable! :id
- instance_variable! :trello_connection
- end
-
- it 'finds the id' do
- expect(trello_connection).to receive(:find_card_by_id).with(id).and_return card
- Reviewlette.find_id
- end
-
- it 'does not find the id' do
- Reviewlette.instance_variable_set("@id", 0)
- Reviewlette.instance_variable_set("@logger", logger)
- expect(logger).to receive(:warn)
- expect(Reviewlette.find_id).to be false
- end
end
- describe '.set_reviewer' do
- before do
- Reviewlette.instance_variable_set("@reviewer", nil)
- end
-
- it 'sets the reviewer' do
- reviewer = double('reviewer')
- instance_variable! :trello_connection
- instance_variable! :card
- expect(trello_connection).to receive(:determine_reviewer).with(card).and_return reviewer
- expect(reviewer).to receive(:username).and_return String
- expect(reviewer).to receive(:username).and_return String
- Reviewlette.set_reviewer
- end
-
- it 'fails to set the reviewer because everyone on the team is assigned to the card' do
- reviewer = double('reviewer')
- instance_variable! :trello_connection
- instance_variable! :card
- Reviewlette.instance_variable_set("@logger", logger)
- expect(trello_connection).to receive(:determine_reviewer).with(card).and_raise(Reviewlette::AlreadyAssignedException)
- allow(card).to receive(:short_id).and_return 3
- expect($stdout).to receive(:puts)
- expect(logger).to receive(:warn)
- expect(Reviewlette.set_reviewer).to eq false
- end
- end
-
- describe '.add_reviewer_on_github' do
- it 'adds the reviewer on github as assignee' do
- instance_variable! :github_connection
- instance_variable! :title
- instance_variable! :body
- instance_variable! :number
- instance_variable! :githubname
- expect(github_connection).to receive(:add_assignee).with('repo/repo', 23, 'title', 'body', 'gitty').and_return true
- Reviewlette.add_reviewer_on_github
- end
- end
-
- describe '.comment_on_github' do
- it 'comments on the issue' do
- instance_variable! :card
- instance_variable! :number
- instance_variable! :githubname
- instance_variable! :github_connection
- expect(card).to receive(:url).and_return 'www.example.url'
- expect(github_connection).to receive(:comment_on_issue).with('repo/repo', 23, 'gitty', 'www.example.url').and_return true
- Reviewlette.comment_on_github
- end
- end
-
- describe '.add_to_trello_card' do
- it 'adds a reviewer to the right trello card' do
- instance_variable! :trello_connection
- instance_variable! :reviewer
- instance_variable! :card
- expect(trello_connection).to receive(:add_reviewer_to_card).with(reviewer, card).and_return true
- Reviewlette.add_to_trello_card
- end
-
- it 'rescues with: already assigned' do
- instance_variable! :trello_connection
- expect{Reviewlette.add_to_trello_card}.to raise_exception
- # Reviewlette.add_to_trello_card
- end
- end
-
- describe '.comment_on_trello' do
- before do
- instance_variable! :repo
- instance_variable! :trelloname
- instance_variable! :number
- instance_variable! :trello_connection
- instance_variable! :full_comment
- instance_variable! :card
- end
-
- it 'puts a comment on the trello card ' do
- expect(full_comment).to eq '@jschmid will review https://github.com/repo/repo/issues/23'
- end
-
- it 'actually posts' do
- expect(trello_connection).to receive(:comment_on_card).with(full_comment, card).and_return true
- Reviewlette.comment_on_trello
- end
- end
-
- describe '.move_to_list' do
- before do
- instance_variable! :github_connection
- instance_variable! :trello_connection
- instance_variable! :card
- instance_variable! :repo
- instance_variable! :id
- end
-
- it 'moves the card to #Done list if the pull is merged' do
- expect(trello_connection).to receive(:find_column).with('Done').and_return 'Done'
- expect(trello_connection).to receive(:move_card_to_list).with(card,'Done').and_return Object
- expect(github_connection).to receive(:pull_merged?).with(repo, id).and_return true
- Reviewlette.move_to_list
- end
-
- it 'moves the card to #in-Review list if the pull is not merged' do
- expect(trello_connection).to receive(:find_column).with('In review').and_return 'In review'
- expect(trello_connection).to receive(:move_card_to_list).with(card,'In review').and_return Object
- expect(github_connection).to receive(:pull_merged?).with(repo, id).and_return false
- Reviewlette.move_to_list
- end
- end
-
- describe '.setup' do
- before do
- instance_variable! :github_connection
- instance_variable! :trello_connection
- instance_variable! :board
- instance_variable! :repo
- end
-
- it 'sets up repo variable' do
- Reviewlette.setup
- expect(Reviewlette.instance_variable_get('@repo')).to be_kind_of String #ok
- end
- it 'sets up the github_connection' do
- Reviewlette.setup
- expect(github_connection).to be_kind_of Object #how to call this kind of structure
- end
-
- it 'sets up the trello_connection' do
- Reviewlette.setup
- expect(Reviewlette.instance_variable_get('@trello_connection')).to be_kind_of Object #same
- end
-
- it 'sets up the board' do
- Reviewlette.setup
- expect(Reviewlette.instance_variable_get('@board')).to be_kind_of Object #same
- end
- end
-
- describe '.update_vacations' do
-
- it 'updates vacationsstatus based on tel vacation output' do
- vacations = ['2015-01-07', '2015-01-25']
- instance_variable_set(:@vacations, vacations)
- instance_variable_set(:@db, db)
- expect(Reviewlette::Vacations).to receive(:find_vacations).at_least(:once)
- expect(Reviewlette).to receive(:evaluate_vacations).at_least(:once)
- Reviewlette.update_vacations
- end
- end
-
- describe '.evaluate_vacations' do
-
- it 'checks if vacation state is true' do
- today = Date.today
- allow(subject).to receive(:parse_vacations).and_return [[today]]
- subject.evaluate_vacations('jschmid')
- end
-
- it 'checks if vacation state is false' do
- allow(subject).to receive(:parse_vacations).and_return [1,2]
- subject.evaluate_vacations('jschmid')
- end
- end
-
-
- describe '.parse_vacations' do
-
- it 'parses Date in proper format' do
- # vacations = ["2014-08-23 - 2014-09-14", "2014-10-03 - 2014-10-05", "2014-12-24 - 2014-12-28"]
- # split = [["2014-08-23", "2014-09-14"], ["2014-10-03", "2014-10-05"], ["2014-12-24", "2014-12-28"]]
- # ret = [['Sat, 23 Aug 2014', 'Sun, 14 Sep 2014'], ['Fri, 03 Oct 2014', 'Sun, 05 Oct 2014'], ['Wed, 24 Dec 2014', 'Sun, 28 Dec 2014']]
- # instance_variable_set(:@vacations, vacations)
- # instance_variable_set(:@split, split)
- # expect(instance_variable_get(:@vacations)).to receive(:map).and_return split
- # expect(instance_variable_get(:@split)).to receive(:map).and_return ret
- # subject.parse_vacations
- end
- end
end