blob: c06c424b9479364ffa4a1e96d7800f9f01dc1562 [file] [log] [blame]
#
# This specifies server actions which generally are performed in response
# to a form action.
#
require_relative 'spec_helper'
require_relative '../models/pending'
require 'shellwords'
feature 'server actions' do
before :each do
@test_data = IO.read('test/work/data/test.yml')
@test_mins = IO.read('test/work/data/board_minutes_2015_02_18.yml')
@cleanup = []
end
#
# Index - split in two so that cleanup occurs after each step
#
describe 'index' do
it "should post new special orders" do
@agenda = 'board_agenda_2015_02_18.txt'
@attach = '7?'
@title = 'Establish Test Project'
@report = 'WHEREAS, RESOLVED, and other official words'
eval(File.read('views/actions/post.json.rb'))
resolution = @agenda.find {|item| item[:attach] == '7G'}
expect(resolution['title']).to eq('Establish Test')
expect(resolution['text']).
to eq('WHEREAS, RESOLVED, and other official words')
end
end
#
# Roll Call
#
describe 'roll call' do
it "should support adding a guest" do
@agenda = 'board_agenda_2015_01_21.txt'
@action = 'attend'
@name = 'N. E. Member'
eval(File.read('views/actions/attend.json.rb'))
rollcall = @agenda.find {|item| item['title'] == 'Roll Call'}
expect(rollcall['text']).to match %r{Guests.*N\. E\. Member}m
end
it "should support a director's regrets" do
@agenda = 'board_agenda_2015_01_21.txt'
@action = 'regrets'
@name = 'Sam Ruby'
eval(File.read('views/actions/attend.json.rb'))
rollcall = @agenda.find {|item| item['title'] == 'Roll Call'}
expect(rollcall['text']).to match %r{Directors .* Absent:\s+Sam Ruby}
end
it "should support moving a director back to attending" do
@agenda = 'board_agenda_2015_02_18.txt'
@action = 'attend'
@name = 'Greg Stein'
eval(File.read('views/actions/attend.json.rb'))
rollcall = @agenda.find {|item| item['title'] == 'Roll Call'}
expect(rollcall['text']).to match %r{Greg Stein\s+Directors .* Absent:}
end
it "should support a officer's regrets" do
@agenda = 'board_agenda_2015_01_21.txt'
@action = 'regrets'
@name = 'Craig L Russell'
eval(File.read('views/actions/attend.json.rb'))
rollcall = @agenda.find {|item| item['title'] == 'Roll Call'}
expect(rollcall['text']).to match %r{Officers .* Absent:\s+Craig L Russell}
end
end
#
# PMC Report
#
describe 'pmc report' do
it "should post a comment" do
@initials = 'xx'
@agenda = 'board_agenda_2015_01_21.txt'
@attach = 'Z'
@comment = 'testing'
eval(File.read('views/actions/comment.json.rb'))
expect(Pending.get('test')['comments']['Z']).to eq('testing')
expect(Pending.get('test')['initials']).to eq('xx')
end
it "should remove a comment" do
expect(Pending.get('test')['comments']['I']).to eq('Nice report!')
@initials = 'xx'
@agenda = 'board_agenda_2015_01_21.txt'
@attach = 'I'
@comment = nil
eval(File.read('views/actions/comment.json.rb'))
expect(Pending.get('test')['comments']).not_to include('I')
end
it "should reset comments when the agenda changes" do
expect(Pending.get('test')['comments']['I']).to eq('Nice report!')
@initials = 'xx'
@agenda = 'board_agenda_2015_02_18.txt'
@attach = 'Z'
@comment = nil
eval(File.read('views/actions/comment.json.rb'))
expect(Pending.get('test')['comments']).not_to include('I')
end
it "should approve a report" do
@agenda = 'board_agenda_2015_01_21.txt'
@initials = 'jt'
@attach = 'C'
@request = 'approve'
eval(File.read('views/actions/approve.json.rb'))
expect(Pending.get('test')['approved']).to include('C')
end
it "should unapprove a report which is pending approval" do
expect(Pending.get('test')['approved']).to include('7')
@agenda = 'board_agenda_2015_01_21.txt'
@initials = 'jt'
@attach = '7'
@request = 'unapprove'
eval(File.read('views/actions/approve.json.rb'))
expect(Pending.get('test')['approved']).not_to include('7')
end
it "should unapprove a previously approved report" do
expect(Pending.get('test')['unapproved']).not_to include('BM')
@agenda = 'board_agenda_2015_01_21.txt'
@initials = 'jt'
@attach = 'BM'
@request = 'unapprove'
eval(File.read('views/actions/approve.json.rb'))
expect(Pending.get('test')['unapproved']).to include('BM')
end
it "should flag a report" do
expect(Pending.get('test')['flagged']).not_to include('J')
@agenda = 'board_agenda_2015_01_21.txt'
@initials = 'jt'
@attach = 'J'
@request = 'flag'
eval(File.read('views/actions/approve.json.rb'))
expect(Pending.get('test')['flagged']).to include('J')
end
it "should unflag a report" do
expect(Pending.get('test')['unflagged']).not_to include('AS')
@agenda = 'board_agenda_2015_02_18.txt'
@initials = 'jt'
@attach = 'AS'
@request = 'unflag'
eval(File.read('views/actions/approve.json.rb'))
expect(Pending.get('test')['unflagged']).to include('AS')
end
it "should unflag a report which is pending being flagged" do
expect(Pending.get('test')['flagged']).to include('H')
@agenda = 'board_agenda_2015_01_21.txt'
@initials = 'jt'
@attach = 'H'
@request = 'unflag'
eval(File.read('views/actions/approve.json.rb'))
expect(Pending.get('test')['flagged']).not_to include('H')
end
it "should post/edit a report" do
@agenda = 'board_agenda_2015_02_18.txt'
@parsed = Agenda.parse @agenda, :quick
poi = @parsed.find {|item| item['title'] == 'POI'}
@attach = poi[:attach]
@digest = poi['digest']
@message = 'Dummy report for POI'
@report = 'Nothing to see here. Move along.'
eval(File.read('views/actions/post.json.rb'))
poi = @agenda.find {|item| item['title'] == 'POI'}
expect(poi['report']).to eq('Nothing to see here. Move along.')
end
end
#
# Queue / Pending
#
describe 'pending queue' do
it "should commit pending comments and approvals" do
@pending = Pending.get('test')
@parsed = Agenda.parse 'board_agenda_2015_01_21.txt', :quick
expect(@pending['approved']).to include('7')
expect(@pending['comments']['I']).to eq('Nice report!')
security = @parsed.find {|item| item[:attach] == '9'}
expect(security['approved']).to include('jt')
w3c = @parsed.find {|item| item[:attach] == '7'}
expect(w3c['approved']).not_to include('jt')
avro = @parsed.find {|item| item[:attach] == 'I'}
expect(avro['comments']).not_to include('jt: Nice report!')
actions = @parsed.find {|item| item['title'] == 'Action Items'}
expect(actions['text']).not_to \
include("Clarification provided in this month's report.")
@message = "Approve W3C Relations\nComment on BookKeeper\nUpdate 1 AI"
@initials = 'jt'
eval(File.read('views/actions/commit.json.rb'))
expect(@pending['approved']).not_to include('7')
expect(@pending['comments']).not_to include('I')
security = @agenda.find {|item| item[:attach] == '9'}
expect(security['approved']).not_to include('jt')
w3c = @agenda.find {|item| item[:attach] == '7'}
expect(w3c['approved']).to include('jt')
avro = @agenda.find {|item| item[:attach] == 'I'}
expect(avro['comments']).to include('jt: Nice report!')
actions = @agenda.find {|item| item['title'] == 'Action Items'}
expect(actions['text']).to \
include("Clarification provided in this month's report.")
end
end
#
# Post minutes
#
describe 'minutes' do
it 'should update roll call' do
@agenda = 'board_agenda_2015_02_18.txt'
@action = 'attendance'
@id = 'gstein'
@name = 'Greg Stein'
@present = true
minutes = YAML.load_file('test/work/data/board_minutes_2015_02_18.yml')
expect(minutes['Roll Call']).to match(/Directors Absent:.*Greg Stein/m)
eval(File.read('views/actions/minute.json.rb'))
minutes = YAML.load_file('test/work/data/board_minutes_2015_02_18.yml')
expect(minutes['Roll Call']).to match(/Greg Stein\s+Directors Absent/)
end
it 'should post minutes' do
@agenda = 'board_agenda_2015_02_18.txt'
@title = 'Incubator'
@text = 'Another month without comments!'
eval(File.read('views/actions/minute.json.rb'))
minutes = YAML.load_file('test/work/data/board_minutes_2015_02_18.yml')
expect(minutes['Incubator']).to eq(@text)
end
it 'should post timestamp' do
@agenda = 'board_agenda_2015_02_18.txt'
@title = 'Adjournment'
@action = 'timestamp'
eval(File.read('views/actions/minute.json.rb'))
minutes = YAML.load_file('test/work/data/board_minutes_2015_02_18.yml')
expect(minutes['Adjournment']).to match(/^\d\d?:\d\d$/)
end
end
describe "action items" do
it "should combine existing and captured actions" do
eval(File.read('views/actions/potential-actions.json.rb'))
bval = @actions.find {|action| action[:pmc] == 'BVal'}
expect(bval[:owner]).to eq('Chris')
expect(bval[:text]).
to eq('does the project have enough committers to make releases?')
expect(bval[:status]).to eq('COMPLETE')
wink = @actions.find {|action| action[:pmc] == 'Wink'}
expect(wink[:owner]).to eq('Doug')
expect(wink[:text]).to eq('Is the project ready to retire?')
expect(wink[:date]).to eq('2015-01-21')
end
it "should post action items" do
eval(File.read('views/actions/potential-actions.json.rb'))
rave = @actions.find {|action| action[:pmc] == 'Rave'}
expect(rave[:text]).to match(/require a\n reflow/)
@agenda = 'board_agenda_2015_02_18.txt'
@message = 'Post Action Items'
@actions.map! do |action|
Hash[action.map {|key, value| [key.to_s, value]}]
end
eval(File.read('views/actions/post-actions.json.rb'))
actions = @agenda.find {|item| item['title'] == 'Action Items'}['actions']
rave = actions.find {|action| action[:pmc] == 'Rave'}
expect(rave[:text]).to match(/require\n a reflow/)
end
end
describe "reminders" do
skip "should draft initial reminders" do
@reminder = 'reminder1'
response = eval(File.read('views/actions/reminder-text.json.rb'))
expect(response[:subject]).to \
match(/\[project\] Board Report due for \w+ \d+ - Initial Reminder/)
expect(response[:body]).to match(/It is an initial reminder/)
expect(response[:body]).to \
match(/the deadline for\ssubmitting your report is 1 full week/)
expect(response[:body]).to match(/Wed Feb 11th/)
end
skip "should draft final reminders" do
@reminder = 'reminder2'
response = eval(File.read('views/actions/reminder-text.json.rb'))
expect(response[:subject]).to \
match(/\[project\] Board Report due for \w+ \d+ - is now due!/)
expect(response[:body]).to match(/These reports are\snow due/)
expect(response[:body]).to \
match(/The meeting is scheduled for Wed, 18 Feb 2015 at 10:30 PST\./)
end
end
##########################################################################
#
# cleanup
#
after :each do
if IO.read('test/work/data/test.yml') != @test_data
IO.write('test/work/data/test.yml', @test_data)
end
if IO.read('test/work/data/board_minutes_2015_02_18.yml') != @test_mins
IO.write('test/work/data/board_minutes_2015_02_18.yml', @test_mins)
end
if File.exist? 'test/work/data/test.bak'
File.unlink 'test/work/data/test.bak'
end
if @commits
@commits.each do |name, _contents|
Agenda[name].replace :mtime=>0
File.unlink "#{AGENDA_WORK}/#{name}"
end
end
end
end