task_helper 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,3 @@
1
+ module TaskHelper
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,15 @@
1
+ require 'httparty'
2
+
3
+ require 'task_helper/version'
4
+ require 'task_helper/api/call'
5
+ require 'task_helper/api/cache'
6
+ require 'task_helper/api'
7
+ require 'task_helper/base'
8
+ require 'task_helper/record'
9
+ require 'task_helper/field'
10
+ require 'task_helper/form'
11
+ require 'task_helper/database'
12
+
13
+ module TaskHelper
14
+ # Your code goes here...
15
+ end
@@ -0,0 +1,41 @@
1
+ namespace :spec do
2
+ task :setup, [:api_key] do |t, args|
3
+ TaskHelper::API.rest_api_key = args[:api_key]
4
+
5
+ File.open('spec/support/fixtures/databases.json', 'w') do |f|
6
+ f.write(JSON.pretty_generate(TaskHelper::API.get(route: 'apps.json')))
7
+ end
8
+
9
+ TaskHelper::API.get(route: 'apps.json')['databases'].each do |db|
10
+ db_dir = "spec/support/fixtures/databases/#{db['id']}"
11
+ db_route = "apps/#{db['id']}"
12
+ forms_route = "#{db_route}/entities"
13
+ FileUtils.mkdir_p(db_dir)
14
+ File.open("#{db_dir}/forms.json", 'w') do |f|
15
+ f.write(JSON.pretty_generate(TaskHelper::API.get(route: "#{forms_route}.json")))
16
+ end
17
+
18
+ TaskHelper::API.get(route: "apps/#{db['id']}/entities.json")['forms'].each do |form|
19
+ form_dir = "#{db_dir}/forms/#{form['id']}"
20
+ fields_route = "#{forms_route}/#{form['id']}/properties"
21
+ FileUtils.mkdir_p(form_dir)
22
+ File.open("#{form_dir}/fields.json", 'w') do |f|
23
+ f.write(JSON.pretty_generate(TaskHelper::API.get(route: "#{fields_route}.json")))
24
+ end
25
+
26
+ if TaskHelper::API.get(route: "#{fields_route}.json")['fields'].any?
27
+ records_route = "#{db_route}/dtypes/entity/#{form['id']}"
28
+ records_dir = "#{form_dir}/records"
29
+ FileUtils.mkdir_p(records_dir)
30
+ page_count = db['dtypes_count'].to_i / form['per_page'].to_i + 1
31
+ (1..page_count).each do |page|
32
+ File.open("#{records_dir}/#{page}.json", 'w') do |f|
33
+ f.write(JSON.pretty_generate(TaskHelper::API
34
+ .get(route: "#{records_route}.json", params: { page: page })))
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,73 @@
1
+ describe TaskHelper::API::Cache do
2
+ before(:all) { TaskHelper::API.rest_api_key = 'foobar' }
3
+ after(:all) { TaskHelper::API.rest_api_key = nil }
4
+
5
+ subject { described_class.new(limit: 2) }
6
+
7
+ describe '#get' do
8
+ context 'call already cached' do
9
+ it 'should query the existing call' do
10
+ call1 = TaskHelper::API::Call.new(route: 'hello')
11
+ call2 = TaskHelper::API::Call.new(route: 'hello')
12
+ expect(TaskHelper::API::Call).to receive(:new).with(route: 'hello')
13
+ .twice.and_return(call1, call2)
14
+ expect(call1).to receive(:run).twice
15
+ subject.get(route: 'hello')
16
+ subject.get(route: 'hello')
17
+ end
18
+ end
19
+
20
+ context 'call not yet cached' do
21
+ it 'should query a new call' do
22
+ call1 = TaskHelper::API::Call.new(route: 'hello')
23
+ call2 = TaskHelper::API::Call.new(route: 'goodbye')
24
+ expect(call1).to receive(:run).once
25
+ expect(call2).to receive(:run).once
26
+ expect(TaskHelper::API::Call).to receive(:new).once.ordered
27
+ .with(route: 'hello').and_return(call1)
28
+ expect(TaskHelper::API::Call).to receive(:new).once.ordered
29
+ .with(route: 'goodbye').and_return(call2)
30
+ subject.get(route: 'hello')
31
+ subject.get(route: 'goodbye')
32
+ end
33
+
34
+ it 'should cache the new call' do
35
+ call1 = TaskHelper::API::Call.new(route: 'hello')
36
+ call2 = TaskHelper::API::Call.new(route: 'goodbye')
37
+ call3 = TaskHelper::API::Call.new(route: 'goodbye')
38
+ expect(call1).to receive(:run).once
39
+ expect(call2).to receive(:run).twice
40
+ expect(TaskHelper::API::Call).to receive(:new).once.ordered
41
+ .with(route: 'hello').and_return(call1)
42
+ expect(TaskHelper::API::Call).to receive(:new).twice.ordered
43
+ .with(route: 'goodbye').and_return(call2, call3)
44
+ subject.get(route: 'hello')
45
+ subject.get(route: 'goodbye')
46
+ subject.get(route: 'goodbye')
47
+ end
48
+
49
+ it 'should remove older calls if the limit is reached' do
50
+ call1 = TaskHelper::API::Call.new(route: 'hello')
51
+ call2 = TaskHelper::API::Call.new(route: 'goodbye')
52
+ call3 = TaskHelper::API::Call.new(route: 'foobar')
53
+ call4 = TaskHelper::API::Call.new(route: 'hello')
54
+ expect(call1).to receive(:run).once
55
+ expect(call2).to receive(:run).once
56
+ expect(call3).to receive(:run).once
57
+ expect(call4).to receive(:run).once
58
+ expect(TaskHelper::API::Call).to receive(:new).once.ordered
59
+ .with(route: 'hello').and_return(call1)
60
+ expect(TaskHelper::API::Call).to receive(:new).once.ordered
61
+ .with(route: 'goodbye').and_return(call2)
62
+ expect(TaskHelper::API::Call).to receive(:new).once.ordered
63
+ .with(route: 'foobar').and_return(call3)
64
+ expect(TaskHelper::API::Call).to receive(:new).once.ordered
65
+ .with(route: 'hello').and_return(call4)
66
+ subject.get(route: 'hello')
67
+ subject.get(route: 'goodbye')
68
+ subject.get(route: 'foobar')
69
+ subject.get(route: 'hello')
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,136 @@
1
+ describe TaskHelper::API::Call do
2
+ let(:key) { { rest_api_key: 'foobar' } }
3
+ let(:response) { double(parsed_response: [{ 'a' => 1 }]) }
4
+
5
+ it 'should define a reader for time' do
6
+ t = Time.now
7
+ args = { route: 'hello', params: key, time: t }
8
+ expect(described_class.new(args).time).to eq(t)
9
+ end
10
+
11
+ describe '.new' do
12
+ context 'given an api key' do
13
+ subject { described_class.new(route: 'hello', params: key) }
14
+
15
+ it 'should not raise a missing key error' do
16
+ expect { subject }.not_to raise_exception
17
+ end
18
+
19
+ it 'should replace the default key' do
20
+ TaskHelper::API.rest_api_key = 'hello'
21
+ expect(HTTParty).to receive(:get)
22
+ .with(anything, query: key).and_return(response)
23
+ subject.run
24
+ TaskHelper::API.rest_api_key = nil
25
+ end
26
+ end
27
+
28
+ context 'without an api key' do
29
+ subject { described_class.new(route: 'hello') }
30
+
31
+ it 'should attempt to use the default' do
32
+ TaskHelper::API.rest_api_key = 'hello'
33
+ expect(HTTParty).to receive(:get)
34
+ .with(anything, query: { rest_api_key: 'hello' }).and_return(response)
35
+ subject.run
36
+ TaskHelper::API.rest_api_key = nil
37
+ end
38
+
39
+ it 'should raise an exception if no default is set' do
40
+ expect { subject }.to raise_exception(TaskHelper::API::Call::MissingAPIKey)
41
+ end
42
+ end
43
+ end
44
+
45
+ describe '#run' do
46
+ before(:all) { TaskHelper::API.rest_api_key = 'foobar' }
47
+ after(:all) { TaskHelper::API.rest_api_key = nil }
48
+
49
+ subject { described_class.new(route: 'hello') }
50
+
51
+ it 'should reset the time' do
52
+ expect { subject.run }.to change { subject.time }
53
+ end
54
+
55
+ it 'should make a request to the given route at mytaskhelper.com' do
56
+ expect(HTTParty).to receive(:get)
57
+ .with('https://mytaskhelper.com/hello', query: { rest_api_key: 'foobar' })
58
+ .and_return(response)
59
+ subject.run
60
+ end
61
+
62
+ context 'call has expired' do
63
+ it 'should resend the request' do
64
+ params = { route: 'hello', timeout: 0 }
65
+ call = described_class.new(params)
66
+ expect(HTTParty).to receive(:get).twice.and_return(response)
67
+ call.run
68
+ call.run
69
+ end
70
+ end
71
+
72
+ context 'call has not expired' do
73
+ context 'request has been cached' do
74
+ it 'should return the cached response' do
75
+ expect(HTTParty).to receive(:get).once.and_return(response)
76
+ result = subject.run
77
+ expect(subject.run).to eq(result)
78
+ end
79
+ end
80
+
81
+ context 'request has not been chached' do
82
+ it 'should retrieve the response' do
83
+ expect(HTTParty).to receive(:get).once.and_return(response)
84
+ expect(subject.run).to eq(response.parsed_response)
85
+ end
86
+ end
87
+ end
88
+ end
89
+
90
+ describe '#expired?' do
91
+ before(:all) { TaskHelper::API.rest_api_key = 'foobar' }
92
+ after(:all) { TaskHelper::API.rest_api_key = nil }
93
+
94
+ context 'request timed out' do
95
+ it 'shoud return false' do
96
+ args = { route: 'hello', timeout: 0, time: Time.now - 5 }
97
+ expect(described_class.new(args).expired?).to be(true)
98
+ end
99
+ end
100
+
101
+ context 'request not timed out' do
102
+ it 'shoud return false' do
103
+ args = { route: 'hello', timeout: 100, time: Time.now - 5 }
104
+ expect(described_class.new(args).expired?).to be(false)
105
+ end
106
+ end
107
+ end
108
+
109
+ describe '#==' do
110
+ before(:all) { TaskHelper::API.rest_api_key = 'foobar' }
111
+ after(:all) { TaskHelper::API.rest_api_key = nil }
112
+
113
+ subject { described_class.new(route: 'hello', params: { a: 1 }) }
114
+
115
+ context 'route does not match' do
116
+ it 'should return false' do
117
+ expect(subject == described_class.new(route: 'hi'))
118
+ .to be(false)
119
+ end
120
+ end
121
+
122
+ context 'args do not match' do
123
+ it 'should return false' do
124
+ expect(subject == described_class.new(route: 'hello', params: { b: 2 }))
125
+ .to be(false)
126
+ end
127
+ end
128
+
129
+ context 'route and args match' do
130
+ it 'should return true' do
131
+ expect(subject == described_class.new(route: 'hello', params: { a: 1 }))
132
+ .to be(true)
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,45 @@
1
+ describe TaskHelper::API do
2
+ subject { TaskHelper::API }
3
+
4
+ it 'should define a singleton accessor for "rest_api_key"' do
5
+ expect(subject.rest_api_key).to eq(nil)
6
+ expect { subject.rest_api_key = 'foobar' }
7
+ .to change { subject.rest_api_key }.from(nil).to('foobar')
8
+ end
9
+
10
+ describe '.get' do
11
+ before(:all) { TaskHelper::API.rest_api_key = 'foobar' }
12
+ after(:all) { TaskHelper::API.rest_api_key = nil }
13
+
14
+ it 'should forward to the cache' do
15
+ expect_any_instance_of(TaskHelper::API::Cache).to receive(:get)
16
+ .with(route: 'hello')
17
+ subject.get(route: 'hello')
18
+ end
19
+ end
20
+
21
+ describe '.set_cache' do
22
+ before(:all) { TaskHelper::API.rest_api_key = 'foobar' }
23
+ after(:all) { TaskHelper::API.rest_api_key = nil }
24
+
25
+ it 'should reset the cache to a new instance with the given arguments' do
26
+ cache = TaskHelper::API::Cache.new(limit: 2)
27
+ expect(TaskHelper::API::Cache).to receive(:new).with(limit: 2)
28
+ .and_return(cache)
29
+ subject.set_cache(limit: 2)
30
+ expect(cache).to receive(:get).with(route: 'hello')
31
+ subject.get(route: 'hello')
32
+ end
33
+ end
34
+
35
+ describe '.extended' do
36
+ before(:all) { TaskHelper::API.rest_api_key = 'foobar' }
37
+ after(:all) { TaskHelper::API.rest_api_key = nil }
38
+
39
+ it 'should set the cache for the class' do
40
+ test = Class.new
41
+ expect(test).to receive(:set_cache)
42
+ test.extend(subject)
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,91 @@
1
+ describe TaskHelper::Database do
2
+ before(:all) { TaskHelper::API.rest_api_key = 'foobar' }
3
+ after(:all) { TaskHelper::API.rest_api_key = nil }
4
+
5
+ describe '.all' do
6
+ it 'should return an array of databases' do
7
+ expect(described_class.all.first).to be_a(described_class)
8
+ end
9
+
10
+ it 'should return databases corresponding to the API response' do
11
+ expect(described_class.all.map(&:to_h).to_json)
12
+ .to eq(FixtureParser.databases.to_json)
13
+ end
14
+ end
15
+
16
+ describe '.find_by' do
17
+ it 'should return the corresponding database if found' do
18
+ db = described_class.all.sample
19
+ expect(described_class.find_by(name: db.name)).to eq(db)
20
+ end
21
+
22
+ it 'should return nil if no database found' do
23
+ expect(described_class.find_by(name: 'odiasoutee')).to be_nil
24
+ end
25
+ end
26
+
27
+ describe '.find_by_name' do
28
+ it 'should return the corresponding database if found' do
29
+ db = described_class.all.sample
30
+ expect(described_class.find_by_name(db.name)).to eq(db)
31
+ end
32
+
33
+ it 'should return nil if no database found' do
34
+ expect(described_class.find_by_name('odiasoutee')).to be_nil
35
+ end
36
+ end
37
+
38
+ describe '.find' do
39
+ it 'should return the corresponding database if found' do
40
+ db = described_class.all.sample
41
+ expect(described_class.find(db.id)).to eq(db)
42
+ end
43
+
44
+ it 'should retrun nil if the database is not found' do
45
+ expect(described_class.find('hasdof')).to be_nil
46
+ end
47
+ end
48
+
49
+ describe 'data members' do
50
+ described_class.data_members.each do |m|
51
+ describe "##{m}" do
52
+ it "should return the value of #{m}" do
53
+ db = described_class.new(FixtureParser.databases.sample)
54
+ data = FixtureParser.pretty(:database, db.id)
55
+ expect(db.public_send(m)).to eq(data.send(m))
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ describe '#created_at' do
62
+ it 'should return the parsed time of created_at' do
63
+ db = described_class.all.sample
64
+ db_hash = FixtureParser.database(db.id)
65
+ expect(db.created_at).to eq(Time.parse(db_hash['created_at']))
66
+ end
67
+ end
68
+
69
+ describe '#updated_at' do
70
+ it 'should return the parsed time of updated_at' do
71
+ db = described_class.all.sample
72
+ db_hash = FixtureParser.database(db.id)
73
+ expect(db.updated_at).to eq(Time.parse(db_hash['updated_at']))
74
+ end
75
+ end
76
+
77
+ describe '#forms' do
78
+ it 'should return all forms associated with the database' do
79
+ db = described_class.all.sample
80
+ forms = FixtureParser.pretty(:forms, db.id)
81
+ expect(db.forms.all? { |f| f.kind_of?(TaskHelper::Form) }).to be(true)
82
+ expect(db.forms).to match_array(forms)
83
+ end
84
+
85
+ it "should pre-load the form's database attribute" do
86
+ db = described_class.all.sample
87
+ expect(described_class).not_to receive(:find)
88
+ db.forms.first.database
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,50 @@
1
+ describe TaskHelper::Field do
2
+ before(:all) { TaskHelper::API.rest_api_key = 'foobar' }
3
+ after(:all) { TaskHelper::API.rest_api_key = nil }
4
+
5
+ describe '.new' do
6
+ it 'should pass all params except form to super' do
7
+ form = TaskHelper::Form.all.first
8
+ field = described_class.new(name: 'foobar', form: form,
9
+ 'entity_id' => form.id)
10
+ expect(field.name).to eq('foobar')
11
+ expect(field.entity_id).to eq(form.id)
12
+ end
13
+
14
+ context 'given an optional form' do
15
+ it 'should store the form' do
16
+ form = TaskHelper::Form.all.first
17
+ expect(TaskHelper::Form).not_to receive(:find)
18
+ field = described_class.new(form: form)
19
+ expect(field.form).to eq(form)
20
+ end
21
+ end
22
+
23
+ context 'without optional form' do
24
+ it 'should fetch the form when needed' do
25
+ expect(TaskHelper::Form).to receive(:find).at_least(1)
26
+ described_class.new.form
27
+ end
28
+ end
29
+ end
30
+
31
+ describe '#form' do
32
+ it 'should return the associated form' do
33
+ field = described_class.new(FixtureParser.fields.sample)
34
+ expect(field.form).to be_a(TaskHelper::Form)
35
+ expect(field.form.id).to eq(field.entity_id)
36
+ end
37
+ end
38
+
39
+ describe 'data members' do
40
+ described_class.data_members.each do |m|
41
+ describe "##{m}" do
42
+ it "should return the value of #{m}" do
43
+ field = described_class.new(FixtureParser.fields.sample)
44
+ data = FixtureParser.pretty(:field, field.id, field.entity_id)
45
+ expect(field.public_send(m)).to eq(data.send(m))
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,141 @@
1
+ describe TaskHelper::Form do
2
+ before(:all) { TaskHelper::API.rest_api_key = 'foobar' }
3
+ after(:all) { TaskHelper::API.rest_api_key = nil }
4
+
5
+ describe '.new' do
6
+ it 'should pass all params except database to super' do
7
+ db = TaskHelper::Database.all.sample
8
+ form = described_class.new(app_id: db.id, database: db,
9
+ 'name' => 'foobar')
10
+ expect(form.app_id).to eq(db.id)
11
+ expect(form.name).to eq('foobar')
12
+ end
13
+
14
+ context 'given an optional database' do
15
+ it 'should store the database' do
16
+ db = TaskHelper::Database.all.sample
17
+ expect(TaskHelper::Database).not_to receive(:find)
18
+ form = described_class.new(database: db)
19
+ expect(form.database).to eq(db)
20
+ end
21
+ end
22
+
23
+ context 'without optional database' do
24
+ it 'should fetch the database when needed' do
25
+ expect(TaskHelper::Database).to receive(:find)
26
+ described_class.new.database
27
+ end
28
+ end
29
+ end
30
+
31
+ describe '.all' do
32
+ it 'should return all forms for all databases' do
33
+ forms = FixtureParser.pretty(:forms)
34
+ expect(described_class.all.all? { |f| f.kind_of?(described_class) })
35
+ .to be(true)
36
+ expect(described_class.all).to match_array(forms)
37
+ end
38
+
39
+ it 'should use a Lazy Enumerator' do
40
+ expect(described_class.all).to be_an(Enumerator::Lazy)
41
+ end
42
+ end
43
+
44
+ describe '.find' do
45
+ it 'should return the corresponding form if found' do
46
+ form = FixtureParser.pretty(:forms).sample
47
+ result = described_class.find(database: form.app_id, form: form.id)
48
+ expect(result).to be_a(described_class)
49
+ expect(result).to eq(form)
50
+ end
51
+
52
+ it 'should retrun nil if the form is not found' do
53
+ expect(described_class.find(database: 'hasdof', form: 'hasdof'))
54
+ .to be_nil
55
+ end
56
+ end
57
+
58
+ describe '.find_by' do
59
+ it 'should return the corresponding form if found' do
60
+ form = FixtureParser.pretty(:forms).sample
61
+ db = FixtureParser.pretty(:database, form.app_id)
62
+ result = described_class.find_by(database_name: db.name,
63
+ form_name: form.name)
64
+ expect(result).to be_a(described_class)
65
+ expect(result).to eq(form)
66
+ end
67
+
68
+ it 'should retrun nil if the form is not found' do
69
+ expect(described_class.find_by(database_name: 'hasdof',
70
+ form_name: 'hasdof')).to be_nil
71
+ end
72
+ end
73
+
74
+ describe '#database' do
75
+ it 'should return the database associated with the form' do
76
+ form = described_class.new(FixtureParser.forms.sample)
77
+ expect(form.database).to be_a(TaskHelper::Database)
78
+ expect(form.database.id).to eq(form.app_id)
79
+ end
80
+ end
81
+
82
+ describe '#fields' do
83
+ it 'should return the associated fields' do
84
+ form = described_class.new(FixtureParser.forms.sample)
85
+ expect(form.fields.all? { |f| f.kind_of?(TaskHelper::Field) }).to be(true)
86
+ expect(form.fields.all? { |f| f.entity_id == form.id }).to be(true)
87
+ end
88
+
89
+ it "should pre-load the fields' form attribute" do
90
+ form = described_class.all.first
91
+ expect(described_class).not_to receive(:find)
92
+ form.fields.first.form
93
+ end
94
+ end
95
+
96
+ describe '#records' do
97
+ context 'form has no fields' do
98
+ it 'should return nil' do
99
+ if form = described_class.all.find { |f| f.fields.none? }
100
+ expect(form.records).to be(nil)
101
+ else
102
+ expect(TaskHelper::Field).to receive(:get).and_return('fields' => [])
103
+ expect(described_class.new.records).to be(nil)
104
+ end
105
+ end
106
+ end
107
+
108
+ context 'form has at least one field' do
109
+ it 'should return a lazy enumerator containing the associated records' do
110
+ if form = described_class.all.find { |f| f.fields.any? }
111
+ expect(form.records).to be_a(Enumerator::Lazy)
112
+ expect(form.records.first).to be_a(TaskHelper::Record)
113
+ expect(form.records.first.entity_id).to eq(form.id)
114
+ else
115
+ raise 'No forms with fields found'.inspect
116
+ end
117
+ end
118
+
119
+ it "should pre-load the records' form attribute" do
120
+ if form = described_class.all.find { |f| f.fields.any? }
121
+ expect(described_class).not_to receive(:find)
122
+ form.records.first.form
123
+ else
124
+ raise 'No forms with fields found'.inspect
125
+ end
126
+ end
127
+ end
128
+ end
129
+
130
+ describe 'data members' do
131
+ described_class.data_members.each do |m|
132
+ describe "##{m}" do
133
+ it "should return the value of #{m}" do
134
+ form = described_class.new(FixtureParser.forms.sample)
135
+ data = FixtureParser.pretty(:form, form.id, form.database.id)
136
+ expect(form.public_send(m)).to eq(data.send(m))
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,73 @@
1
+ describe TaskHelper::Record do
2
+ before(:all) { TaskHelper::API.rest_api_key = 'foobar' }
3
+ after(:all) { TaskHelper::API.rest_api_key = nil }
4
+
5
+ let(:form) { TaskHelper::Form.all.find(:form_with_fields_needed) { |f| f.fields.any? } }
6
+ let(:data) { FixtureParser.pretty(:records, form.id, form.app_id).sample }
7
+ subject { described_class.new(data.to_h) }
8
+
9
+ describe '.new' do
10
+ it 'should pass all params except form to super' do
11
+ form = TaskHelper::Form.all.first
12
+ record = described_class.new(app_id: form.app_id, form: form,
13
+ 'entity_id' => form.id)
14
+ expect(record.app_id).to eq(form.app_id)
15
+ expect(record.entity_id).to eq(form.id)
16
+ end
17
+
18
+ context 'given an optional form' do
19
+ it 'should store the form' do
20
+ form = TaskHelper::Form.all.first
21
+ expect(TaskHelper::Form).not_to receive(:find)
22
+ record = described_class.new(form: form)
23
+ expect(record.form).to eq(form)
24
+ end
25
+ end
26
+
27
+ context 'without optional form' do
28
+ it 'should fetch the form when needed' do
29
+ expect(TaskHelper::Form).to receive(:find).at_least(1)
30
+ described_class.new.form
31
+ end
32
+ end
33
+ end
34
+
35
+ describe '#form' do
36
+ it 'should return the associated form' do
37
+ expect(subject.form).to eq(form)
38
+ end
39
+ end
40
+
41
+ describe '#fields' do
42
+ it 'should return the fields of the associated form' do
43
+ expect(subject.fields).to match_array(form.fields)
44
+ end
45
+ end
46
+
47
+ describe '#[]' do
48
+ it 'should return the value of the field with the given name' do
49
+ field = form.fields.sample
50
+ expect(subject[field.name]).to eq(subject.values[field.id])
51
+ end
52
+ end
53
+
54
+ describe '#pretty_values' do
55
+ it 'should return the values hashed by field name' do
56
+ result = subject.values.each_with_object({}) do |(k, v), r|
57
+ field = form.fields.find { |f| f.id == k }
58
+ r[field.name] = v
59
+ end
60
+ expect(subject.pretty_values).to eq(result)
61
+ end
62
+ end
63
+
64
+ describe 'data members' do
65
+ described_class.data_members.each do |m|
66
+ describe "##{m}" do
67
+ it "should return the value of #{m}" do
68
+ expect(subject.public_send(m)).to eq(data.public_send(m))
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,5 @@
1
+ describe TaskHelper do
2
+ it 'should define its version' do
3
+ expect(TaskHelper::VERSION).not_to be_nil
4
+ end
5
+ end