spbtv_pickle 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +10 -0
  5. data/Gemfile +3 -0
  6. data/Gemfile.lock.development +158 -0
  7. data/History.txt +499 -0
  8. data/License.txt +20 -0
  9. data/README.md +566 -0
  10. data/Rakefile +20 -0
  11. data/Rakefile.d/cucumber.rake +27 -0
  12. data/Rakefile.d/release.rake +44 -0
  13. data/Rakefile.d/rspec.rake +3 -0
  14. data/Rakefile.d/yard.rake +5 -0
  15. data/Todo.txt +3 -0
  16. data/autotest/discover.rb +9 -0
  17. data/features/app/app.rb +128 -0
  18. data/features/app/blueprints.rb +6 -0
  19. data/features/app/fabricators.rb +6 -0
  20. data/features/app/factories.rb +25 -0
  21. data/features/app/views/notifier/email.erb +1 -0
  22. data/features/app/views/notifier/user_email.erb +6 -0
  23. data/features/email/email.feature +64 -0
  24. data/features/generator/generators.feature +59 -0
  25. data/features/path/models_page.feature +44 -0
  26. data/features/path/named_route_page.feature +10 -0
  27. data/features/pickle/create_from_active_record.feature +83 -0
  28. data/features/pickle/create_from_fabrication.feature +46 -0
  29. data/features/pickle/create_from_factory_girl.feature +66 -0
  30. data/features/pickle/create_from_machinist.feature +46 -0
  31. data/features/step_definitions/email_steps.rb +1 -0
  32. data/features/step_definitions/extra_email_steps.rb +12 -0
  33. data/features/step_definitions/fork_steps.rb +4 -0
  34. data/features/step_definitions/generator_steps.rb +52 -0
  35. data/features/step_definitions/path_steps.rb +14 -0
  36. data/features/step_definitions/pickle_steps.rb +1 -0
  37. data/features/step_definitions/raise_error_steps.rb +7 -0
  38. data/features/support/email.rb +1 -0
  39. data/features/support/env.rb +14 -0
  40. data/features/support/paths.rb +47 -0
  41. data/features/support/pickle.rb +27 -0
  42. data/features/support/pickle_app.rb +4 -0
  43. data/init.rb +0 -0
  44. data/lib/generators/pickle_generator.rb +44 -0
  45. data/lib/pickle.rb +26 -0
  46. data/lib/pickle/adapter.rb +183 -0
  47. data/lib/pickle/adapters/active_record.rb +67 -0
  48. data/lib/pickle/adapters/data_mapper.rb +42 -0
  49. data/lib/pickle/adapters/mongoid.rb +54 -0
  50. data/lib/pickle/config.rb +49 -0
  51. data/lib/pickle/email.rb +87 -0
  52. data/lib/pickle/email/parser.rb +18 -0
  53. data/lib/pickle/email/world.rb +13 -0
  54. data/lib/pickle/parser.rb +65 -0
  55. data/lib/pickle/parser/matchers.rb +87 -0
  56. data/lib/pickle/path.rb +45 -0
  57. data/lib/pickle/path/world.rb +5 -0
  58. data/lib/pickle/session.rb +244 -0
  59. data/lib/pickle/session/parser.rb +34 -0
  60. data/lib/pickle/version.rb +3 -0
  61. data/lib/pickle/world.rb +14 -0
  62. data/lib/spbtv_pickle.rb +1 -0
  63. data/rails_generators/pickle/pickle_generator.rb +31 -0
  64. data/rails_generators/pickle/templates/email.rb +21 -0
  65. data/rails_generators/pickle/templates/email_steps.rb +65 -0
  66. data/rails_generators/pickle/templates/paths.rb +47 -0
  67. data/rails_generators/pickle/templates/pickle.rb +29 -0
  68. data/rails_generators/pickle/templates/pickle_steps.rb +105 -0
  69. data/spbtv_pickle.gemspec +38 -0
  70. data/spec/pickle/adapter_spec.rb +203 -0
  71. data/spec/pickle/config_spec.rb +112 -0
  72. data/spec/pickle/email/parser_spec.rb +51 -0
  73. data/spec/pickle/email_spec.rb +187 -0
  74. data/spec/pickle/parser/matchers_spec.rb +70 -0
  75. data/spec/pickle/parser_spec.rb +165 -0
  76. data/spec/pickle/path_spec.rb +120 -0
  77. data/spec/pickle/session_spec.rb +448 -0
  78. data/spec/pickle_spec.rb +24 -0
  79. data/spec/spec_helper.rb +78 -0
  80. metadata +370 -0
@@ -0,0 +1,112 @@
1
+ require 'spec_helper'
2
+
3
+ describe Pickle::Config do
4
+ before do
5
+ @config = Pickle::Config.new
6
+ end
7
+
8
+ it "#adapters should default to :machinist, :factory_girl, :orm" do
9
+ expect(@config.adapters).to eq([:machinist, :factory_girl, :fabrication, :orm])
10
+ end
11
+
12
+ it "#adapter_classes should default to Adapter::Machinist, Adapter::FactoryGirl, Adapter::Orm" do
13
+ expect(@config.adapter_classes).to eq([Pickle::Adapter::Machinist, Pickle::Adapter::FactoryGirl, Pickle::Adapter::Fabrication, Pickle::Adapter::Orm])
14
+ end
15
+
16
+ describe "setting adapters to [:machinist, SomeAdapter]" do
17
+ class SomeAdapter; end
18
+
19
+ before do
20
+ @config.adapters = [:machinist, SomeAdapter]
21
+ end
22
+
23
+ it "#adapter_classes should be Adapter::Machinist, SomeAdapter" do
24
+ expect(@config.adapter_classes).to eq([Pickle::Adapter::Machinist, SomeAdapter])
25
+ end
26
+ end
27
+
28
+ describe "#factories" do
29
+ it "should call adaptor.factories for each adaptor" do
30
+ expect(Pickle::Adapter::Machinist).to receive(:factories).and_return([])
31
+ expect(Pickle::Adapter::FactoryGirl).to receive(:factories).and_return([])
32
+ expect(Pickle::Adapter::Fabrication).to receive(:factories).and_return([])
33
+ expect(Pickle::Adapter::Orm).to receive(:factories).and_return([])
34
+ @config.factories
35
+ end
36
+
37
+ it "should aggregate factories into a hash using factory name as key" do
38
+ expect(Pickle::Adapter::Machinist).to receive(:factories).and_return([@machinist = double('machinist', :name => 'machinist')])
39
+ expect(Pickle::Adapter::FactoryGirl).to receive(:factories).and_return([@factory_girl = double('factory_girl', :name => 'factory_girl')])
40
+ expect(Pickle::Adapter::Fabrication).to receive(:factories).and_return([@fabrication = double('fabrication', :name => 'fabrication')])
41
+ expect(Pickle::Adapter::Orm).to receive(:factories).and_return([@orm = double('orm', :name => 'orm')])
42
+ expect(@config.factories).to eq({'machinist' => @machinist, 'factory_girl' => @factory_girl, 'fabrication' => @fabrication, 'orm' => @orm})
43
+ end
44
+
45
+ it "should give preference to adaptors first in the list" do
46
+ expect(Pickle::Adapter::Machinist).to receive(:factories).and_return([@machinist_one = double('one', :name => 'one')])
47
+ expect(Pickle::Adapter::FactoryGirl).to receive(:factories).and_return([@factory_girl_one = double('one', :name => 'one'), @factory_girl_two = double('two', :name => 'two')])
48
+ expect(Pickle::Adapter::Fabrication).to receive(:factories).and_return([@fabrication_one = double('one', :name => 'one'), @fabrication_three = double('three', :name => 'three')])
49
+ expect(Pickle::Adapter::Orm).to receive(:factories).and_return([@orm_two = double('two', :name => 'two'), @orm_four = double('four', :name => 'four')])
50
+ expect(@config.factories).to eq({'one' => @machinist_one, 'two' => @factory_girl_two, 'three' => @fabrication_three, 'four' => @orm_four})
51
+ end
52
+ end
53
+
54
+ it "#mappings should default to []" do
55
+ expect(@config.mappings).to eq([])
56
+ end
57
+
58
+ describe '#predicates' do
59
+ it "should be list of all non object ? public instance methods + columns methods of Adapter.model_classes" do
60
+ class1 = double('Class1',
61
+ :public_instance_methods => ['nope', 'foo?', 'bar?'],
62
+ :column_names => ['one', 'two'],
63
+ :const_get => ::ActiveRecord::Base::PickleAdapter
64
+ )
65
+ class2 = double('Class2',
66
+ :public_instance_methods => ['not', 'foo?', 'faz?'],
67
+ :column_names => ['two', 'three'],
68
+ :const_get => ::ActiveRecord::Base::PickleAdapter
69
+ )
70
+ allow(Pickle::Adapter).to receive(:model_classes).and_return([class1, class2])
71
+
72
+ expect(@config.predicates.to_set).to eq(['foo?', 'faz?', 'bar?', 'one', 'two', 'three'].to_set)
73
+ end
74
+
75
+ it "should be overridable" do
76
+ @config.predicates = %w(lame?)
77
+ expect(@config.predicates).to eq(%w(lame?))
78
+ end
79
+ end
80
+
81
+ describe "#map 'foo', :to => 'faz'" do
82
+ before do
83
+ @config.map 'foo', :to => 'faz'
84
+ end
85
+
86
+ it "should create Mapping('foo', 'faz') mapping" do
87
+ @config.mappings.first.tap do |mapping|
88
+ expect(mapping).to be_kind_of Pickle::Config::Mapping
89
+ expect(mapping.search).to eq('foo')
90
+ expect(mapping.replacement).to eq('faz')
91
+ end
92
+ end
93
+ end
94
+
95
+ describe "#map 'foo', 'bar' :to => 'faz'" do
96
+ before do
97
+ @config.map 'foo', 'bar', :to => 'faz'
98
+ end
99
+
100
+ it "should create 2 mappings" do
101
+ expect(@config.mappings.first).to eq(Pickle::Config::Mapping.new('foo', 'faz'))
102
+ expect(@config.mappings.last).to eq(Pickle::Config::Mapping.new('bar', 'faz'))
103
+ end
104
+ end
105
+
106
+ it "#configure(&block) should execiute on self" do
107
+ expect(@config).to receive(:foo).with(:bar)
108
+ @config.configure do |c|
109
+ c.foo :bar
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ require 'pickle/email/parser'
4
+
5
+ describe Pickle::Email::Parser do
6
+ include Pickle::Parser::Matchers
7
+ include Pickle::Email::Parser
8
+
9
+ describe "#match_email" do
10
+ it "should match 'the email'" do
11
+ expect('the email').to match(/^#{match_email}$/)
12
+ end
13
+
14
+ it "should match 'the first email'" do
15
+ expect('the first email').to match(/^#{match_email}$/)
16
+ end
17
+
18
+ it "should match 'the last email'" do
19
+ expect('the last email').to match(/^#{match_email}$/)
20
+ end
21
+
22
+ it "should match 'the 3rd email'" do
23
+ expect('the 3rd email').to match(/^#{match_email}$/)
24
+ end
25
+
26
+ it "should match 'an email'" do
27
+ expect('an email').to match(/^#{match_email}$/)
28
+ end
29
+ end
30
+
31
+ it "#capture_email should just capture match_email" do
32
+ expect(capture_email).to eq("(#{match_email})")
33
+ end
34
+
35
+ describe "#capture_index_in_email" do
36
+ it "should extract the '2nd' from 'the 2nd email'" do
37
+ match = 'the 2nd email'.match(/^#{capture_index_in_email}$/)
38
+ expect(match[1]).to eq('2nd')
39
+ end
40
+
41
+ it "should extract nil from 'the email'" do
42
+ match = 'the email'.match(/^#{capture_index_in_email}$/)
43
+ expect(match[1]).to eq(nil)
44
+ end
45
+
46
+ it "should extract the 'last' from 'the last email'" do
47
+ match = 'the last email'.match(/^#{capture_index_in_email}$/)
48
+ expect(match[1]).to eq('last')
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,187 @@
1
+ require 'spec_helper'
2
+
3
+ require 'pickle/email'
4
+ require 'pickle/email/parser'
5
+ require 'action_mailer'
6
+
7
+ describe Pickle::Email do
8
+ include Pickle::Session
9
+ include Pickle::Email
10
+ include Pickle::Email::Parser
11
+
12
+ before do
13
+ @email1 = double("Email 1")
14
+ @email2 = double("Email 2")
15
+ allow(ActionMailer::Base).to receive(:deliveries).and_return([@email1, @email2])
16
+ if defined?(ActiveRecord::Base)
17
+ allow(ActiveRecord::Base::PickleAdapter).to receive(:model_classes).and_return([])
18
+ end
19
+ end
20
+
21
+ describe "#emails" do
22
+ it "should return ordered deliveries" do
23
+ expect(emails).to eq([@email1, @email2])
24
+ end
25
+
26
+ describe "(after)" do
27
+ before do
28
+ emails
29
+ end
30
+
31
+ it "#email('the email') should return the last delivery" do
32
+ expect(email('the email')).to eq(@email2)
33
+ end
34
+
35
+ it "#email('the 1st email') should return the first delivery" do
36
+ expect(email('the 1st email')).to eq(@email1)
37
+ end
38
+
39
+ it "#email('the first email') should return the first delivery" do
40
+ expect(email('the first email')).to eq(@email1)
41
+ end
42
+
43
+ it "#email('the 2nd email') should return the second delivery" do
44
+ expect(email('the 2nd email')).to eq(@email2)
45
+ end
46
+
47
+ it "#email('the last email') should return the second delivery" do
48
+ expect(email('the last email')).to eq(@email2)
49
+ end
50
+
51
+ it "#email2('the 3rd email') should be nil" do
52
+ expect(email('the 3rd email')).to eq(nil)
53
+ end
54
+ end
55
+
56
+ describe "when email1 is to fred & joe, and email2 is to joe" do
57
+ before do
58
+ allow(@email1).to receive(:to).and_return(['fred@gmail.com', 'joe@gmail.com'])
59
+ allow(@email2).to receive(:to).and_return('joe@gmail.com')
60
+ end
61
+
62
+ it "#emails('to: \"fred@gmail.com\"') should just return email1" do
63
+ expect(emails('to: "fred@gmail.com"')).to eq([@email1])
64
+ end
65
+
66
+ describe "after #emails('to: \"fred@gmail.com\"')" do
67
+ before do
68
+ emails('to: "fred@gmail.com"')
69
+ end
70
+
71
+ it "#email('first') should be #email('last')" do
72
+ expect(email('first email')).to eq(email('last email'))
73
+ expect(email('first email')).to eq(@email1)
74
+ end
75
+
76
+ it "#email('the email', 'to: \"blah\") should be nil" do
77
+ expect(email('the email', 'to: "blah"')).to eq(nil)
78
+ end
79
+
80
+ it "#email('the email', 'to: \"fred@gmail.com\") should be email1" do
81
+ expect(email('the email', 'to: "fred@gmail.com"')).to eq(@email1)
82
+ end
83
+ end
84
+
85
+ it "#emails('to: \"joe@gmail.com\"') should return both emails" do
86
+ expect(emails('to: "joe@gmail.com"')).to eq([@email1, @email2])
87
+ end
88
+
89
+ describe "and emails have subjects 'email1', 'email2'" do
90
+ before do
91
+ allow(@email1).to receive(:subject).and_return('email1')
92
+ allow(@email2).to receive(:subject).and_return('email2')
93
+ end
94
+
95
+ it "#emails('to: \"joe@gmail.com\", subject: \"email1\"') should return email1" do
96
+ expect(emails('to: "joe@gmail.com", subject: "email1"')).to eq([@email1])
97
+ end
98
+
99
+ it "#emails('to: \"fred@gmail.com\", subject: \"email2\"') should return empty array" do
100
+ expect(emails('to: "fred@gmail.com", subject: "email2"')).to eq([])
101
+ end
102
+ end
103
+ end
104
+ end
105
+
106
+ describe "#save_and_open_emails" do
107
+ before do
108
+ allow(self).to receive(:open_in_browser)
109
+ allow(self).to receive(:emails).and_return(["Contents of Email 1"])
110
+ @now = "2008-01-01".to_time
111
+ allow(Time).to receive(:now).and_return(@now)
112
+ end
113
+
114
+ it "should call #emails to get emails" do
115
+ expect(self).to receive(:emails).and_return([])
116
+ save_and_open_emails
117
+ end
118
+
119
+ describe "when emails have been already been found" do
120
+ before { @emails = [] }
121
+
122
+ it "should not call #emails" do
123
+ expect(self).not_to receive(:emails)
124
+ save_and_open_emails
125
+ end
126
+ end
127
+
128
+ it "should create a file in Rails/tmp with the emails in it" do
129
+ save_and_open_emails
130
+ expect(File.read("pickle-email-#{@now.to_i}.html")).to eq("<h1>Email 1</h1><pre>Contents of Email 1</pre><hr />")
131
+ end
132
+
133
+ it "should call open_in_browser on created tmp file" do
134
+ expect(self).to receive(:open_in_browser).with("pickle-email-#{@now.to_i}.html")
135
+ save_and_open_emails
136
+ end
137
+ end
138
+
139
+ describe "following links in emails" do
140
+ let(:body) { 'some text <a href="http://example.com/page">example page</a> more text' }
141
+
142
+ before do
143
+ allow(self).to receive(:open_in_browser)
144
+ end
145
+
146
+ shared_examples_for 'an email with links' do
147
+ it "should find a link for http://example.com/page" do
148
+ expect(self).to receive(:visit).with('http://example.com/page')
149
+ visit_in_email(@email1, 'http://example.com/page')
150
+ end
151
+
152
+ it "should find a link for \"example page\"" do
153
+ expect(self).to receive(:visit).with('http://example.com/page')
154
+ visit_in_email(@email1, 'example page')
155
+ end
156
+
157
+ it "should follow the first link in an email" do
158
+ expect(self).to receive(:visit).with('http://example.com/page')
159
+ click_first_link_in_email(@email1)
160
+ end
161
+
162
+ it "should not raise an error when the email body is not a string, but needs to_s [#26]" do
163
+ allow(self).to receive(:visit)
164
+ allow(@email1).to receive(:body).and_return(:a_string_body)
165
+ expect { click_first_link_in_email(@email1) }.not_to raise_error
166
+ end
167
+ end
168
+
169
+ describe "non multi-part emails" do
170
+ before do
171
+ allow(@email1).to receive(:multipart?).and_return(false)
172
+ allow(@email1).to receive(:body).and_return(body)
173
+ end
174
+
175
+ it_behaves_like 'an email with links'
176
+ end
177
+
178
+ context "multi-part emails" do
179
+ before do
180
+ allow(@email1).to receive(:multipart?).and_return(true)
181
+ allow(@email1).to receive_message_chain(:html_part, :body).and_return(body)
182
+ end
183
+
184
+ it_behaves_like 'an email with links'
185
+ end
186
+ end
187
+ end
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+
3
+ describe Pickle::Parser::Matchers do
4
+ include Pickle::Parser::Matchers
5
+
6
+ describe "(config: [factories: user, car, fast_car] [predicates: name, status, fancy?, super_fancy?, has_style?, has_super_style?]" do
7
+ def config
8
+ @config ||= Pickle::Config.new do |c|
9
+ c.factories = {
10
+ 'user' => double('factory'),
11
+ 'car' => double('factory'),
12
+ 'fast_car' => double('factory')
13
+ }
14
+ c.predicates = %w(name status fancy? super_fancy? has_style? has_super_style?)
15
+ end
16
+ end
17
+
18
+ describe "Match atoms" do
19
+ def self.atom_should_match(atom, strings)
20
+ Array(strings).each do |string|
21
+ it "#{atom} should match '#{string}'" do
22
+ expect(string).to match(/^#{send atom}$/)
23
+ end
24
+ end
25
+ end
26
+
27
+ def self.atom_should_not_match(atom, strings)
28
+ Array(strings).each do |string|
29
+ it "#{atom} should NOT match '#{string}'" do
30
+ expect(string).not_to match(/^#{send atom}$/)
31
+ end
32
+ end
33
+ end
34
+
35
+ atom_should_match :match_ordinal, ['1st', '2nd', '23rd', '104th']
36
+ atom_should_not_match :match_ordinal, ['1', '2']
37
+
38
+ atom_should_match :match_index, ['first', 'last', '23rd', '104th']
39
+ atom_should_not_match :match_index, ['1', '2', 'foo']
40
+
41
+ atom_should_match :match_label, [': "gday"', ': "gday mate"']
42
+ atom_should_not_match :match_label, [': "gday""', ': gday']
43
+
44
+ atom_should_match :match_field, ['foo: "this is the life"', 'bar_man: "and so is this"', 'quoted_baz: "words \"in quotes\""', 'boolean: false', 'boolean: true', 'numeric: 10', 'numeric: 12.5', 'numeric: +10', 'numeric: +12.5', 'numeric: -10', 'numeric: -12.5', 'nil_field: nil']
45
+ atom_should_not_match :match_field, ['foo bar: "this aint workin"', 'not_numeric: --10', 'not_numeric: -ten']
46
+
47
+ atom_should_match :match_fields, ['foo: "bar"', 'foo: "bar", baz: "bah"']
48
+ atom_should_not_match :match_fields, ['foo bar: "baz"', 'email: "a", password: "b", and password_confirmation: "c"']
49
+
50
+ atom_should_match :match_model, ['a user', '1st fast car', 'the 23rd fast_car', 'the user: "fred flinstone"']
51
+ atom_should_not_match :match_model, ['a giraffe', 'a 1st faster car: "jim"', 'an event created']
52
+
53
+ atom_should_match :match_predicate, ['name', 'status', 'fancy', 'super fancy', 'super_fancy', 'style', 'super style', 'super_style']
54
+ atom_should_not_match :match_predicate, ['nameo', 'increment', 'not a predicate', 'has style']
55
+
56
+ atom_should_match :match_factory, ['user', 'fast car', 'fast_car', 'car']
57
+ atom_should_not_match :match_factory, ['users', 'faster car', 'event created']
58
+
59
+ atom_should_match :match_plural_factory, ['users', 'fast cars']
60
+ atom_should_not_match :match_plural_factory, ['usereres', 'fasts cars']
61
+ end
62
+ end
63
+
64
+ describe "capture methods" do
65
+ it "capture_field should == '(' + match_field + ')'" do
66
+ expect(self).to receive(:match_field).and_return('MATCH_FIELD')
67
+ expect(capture_field).to eq('(MATCH_FIELD)')
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,165 @@
1
+ require 'spec_helper'
2
+
3
+ describe Pickle::Parser do
4
+ before do
5
+ @parser = Pickle::Parser.new(:config => Pickle::Config.new)
6
+ end
7
+
8
+ it "should raise error when created with no config" do
9
+ expect{ Pickle::Parser.new }.to raise_error(ArgumentError)
10
+ end
11
+
12
+ describe "when a 'user' factory exists in config" do
13
+ before do
14
+ allow(@parser.config).to receive(:factories).and_return('user' => double('User'))
15
+ end
16
+
17
+ describe 'misc regexps' do
18
+ describe '/^#{capture_model} exists/' do
19
+ before do
20
+ @regexp = /^(#{@parser.capture_model}) exists$/
21
+ end
22
+
23
+ it "should match 'a user exists'" do
24
+ expect('a user exists').to match(@regexp)
25
+ end
26
+
27
+ it "should caputure 'a user' from 'a user exists'" do
28
+ expect('a user exists'.match(@regexp)[1]).to eq('a user')
29
+ end
30
+ end
31
+ end
32
+
33
+ describe '#parse_field' do
34
+ it "should return {'a' => 'b'} for 'a: \"b\"'" do
35
+ expect(@parser.parse_field('a: "b"')).to eq({'a' => 'b'})
36
+ end
37
+
38
+ it "should raise error for invalid field 'a : b'" do
39
+ expect { @parser.parse_field('a : b') }.to raise_error(ArgumentError)
40
+ end
41
+ end
42
+
43
+ describe '#parse_fields' do
44
+ it 'should return {} for blank argument' do
45
+ expect(@parser.parse_fields(nil)).to eq({})
46
+ expect(@parser.parse_fields('')).to eq({})
47
+ end
48
+
49
+ it 'should raise error for invalid argument' do
50
+ expect { @parser.parse_fields('foo foo') }.to raise_error(ArgumentError)
51
+ end
52
+
53
+ it '(\'foo: "bar"\') should == { "foo" => "bar"}' do
54
+ expect(@parser.parse_fields('foo: "bar"')).to eq({ "foo" => "bar"})
55
+ end
56
+
57
+ it '(\'foo: "something \"quoted\""\') should == { "foo" => "bar"}' do
58
+ expect(@parser.parse_fields('foo: "something \"quoted\""')).to eq({ "foo" => 'something "quoted"' })
59
+ end
60
+
61
+ it '("bool: true") should == { "bool" => true}' do
62
+ expect(@parser.parse_fields('bool: true')).to eq({"bool" => true})
63
+ end
64
+
65
+ it '("bool: false") should == { "bool" => false}' do
66
+ expect(@parser.parse_fields('bool: false')).to eq({"bool" => false})
67
+ end
68
+
69
+ it '("int: 10") should == { "int" => 10 }' do
70
+ expect(@parser.parse_fields('int: 10')).to eq({"int" => 10})
71
+ end
72
+
73
+ it '("float: 10.1") should == { "float" => 10.1 }' do
74
+ expect(@parser.parse_fields('float: 10.1')).to eq({"float" => 10.1})
75
+ end
76
+
77
+ it '(\'foo: "bar", bar_man: "wonga wonga", baz_woman: "one \"two\" three", gump: 123\') should == {"foo" => "bar", "bar_man" => "wonga wonga", "gump" => 123}' do
78
+ expect(@parser.parse_fields('foo: "bar", bar_man: "wonga wonga", baz_woman: "one \"two\" three", gump: 123')).to eq({"foo" => "bar", "bar_man" => "wonga wonga", "baz_woman" => "one \"two\" three", "gump" => 123})
79
+ end
80
+ end
81
+
82
+ describe '#parse_model' do
83
+ it '("a user") should == ["user", ""]' do
84
+ expect(@parser.parse_model("a user")).to eq(["user", ""])
85
+ end
86
+
87
+ it '("the user") should == ["user", ""]' do
88
+ expect(@parser.parse_model("the user")).to eq(["user", ""])
89
+ end
90
+
91
+ it '("1 user") should == ["user", ""]' do
92
+ expect(@parser.parse_model("1 user")).to eq(["user", ""])
93
+ end
94
+
95
+ it '(\'an user: "jim jones"\') should == ["user", "jim_jones"]' do
96
+ expect(@parser.parse_model('an user: "jim jones"')).to eq(["user", "jim_jones"])
97
+ end
98
+
99
+ it '(\'that user: "herbie"\') should == ["user", "herbie"]' do
100
+ expect(@parser.parse_model('that user: "herbie"')).to eq(["user", "herbie"])
101
+ end
102
+
103
+ it '(\'the 12th user\') should == ["user", 11]' do
104
+ expect(@parser.parse_model('the 12th user')).to eq(["user", 11])
105
+ end
106
+
107
+ it '(\'the last user\') should == ["user", -1]' do
108
+ expect(@parser.parse_model('the last user')).to eq(["user", -1])
109
+ end
110
+
111
+ it '("the first user") should == ["user", 0]' do
112
+ expect(@parser.parse_model('the first user')).to eq(["user", 0])
113
+ end
114
+
115
+ it '("the 1st user") should == ["user", 0]' do
116
+ expect(@parser.parse_model('the 1st user')).to eq(["user", 0])
117
+ end
118
+ end
119
+
120
+ describe "#parse_index" do
121
+ it '("1st") should == 0' do
122
+ expect(@parser.parse_index("1st")).to eq(0)
123
+ end
124
+
125
+ it '("24th") should == 23' do
126
+ expect(@parser.parse_index("24th")).to eq(23)
127
+ end
128
+ it '("first") should == 0' do
129
+ expect(@parser.parse_index("first")).to eq(0)
130
+ end
131
+
132
+ it '("last") should == -1' do
133
+ expect(@parser.parse_index("last")).to eq(-1)
134
+ end
135
+ end
136
+ end
137
+
138
+ describe "customised mappings" do
139
+ describe "config maps 'I|myself' to 'user: \"me\"'" do
140
+ before do
141
+ @config = Pickle::Config.new do |c|
142
+ c.map 'I', 'myself', :to => 'user: "me"'
143
+ end
144
+ @parser = Pickle::Parser.new(:config => @config)
145
+ allow(@parser.config).to receive(:factories).and_return('user' => double('User'))
146
+ end
147
+
148
+ it "'I' should match /\#{match_model}/" do
149
+ expect('I').to match(/#{@parser.match_model}/)
150
+ end
151
+
152
+ it "'myself' should match /\#{match_model}/" do
153
+ expect('myself').to match(/#{@parser.match_model}/)
154
+ end
155
+
156
+ it "parse_model('I') should == ['user', 'me']" do
157
+ expect(@parser.parse_model('I')).to eq(["user", "me"])
158
+ end
159
+
160
+ it "parse_model('myself') should == ['user', 'me']" do
161
+ expect(@parser.parse_model('myself')).to eq(["user", "me"])
162
+ end
163
+ end
164
+ end
165
+ end