wright 0.4.4 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +10 -3
  3. data/NEWS.md +8 -0
  4. data/README.md +9 -16
  5. data/lib/wright/cli.rb +25 -24
  6. data/lib/wright/config.rb +5 -3
  7. data/lib/wright/dsl.rb +52 -9
  8. data/lib/wright/logger.rb +1 -1
  9. data/lib/wright/provider.rb +8 -5
  10. data/lib/wright/provider/directory.rb +2 -2
  11. data/lib/wright/provider/file.rb +4 -4
  12. data/lib/wright/provider/group.rb +4 -4
  13. data/lib/wright/provider/package.rb +3 -3
  14. data/lib/wright/provider/package/apt.rb +1 -1
  15. data/lib/wright/provider/package/yum.rb +1 -1
  16. data/lib/wright/provider/symlink.rb +2 -2
  17. data/lib/wright/provider/user.rb +8 -8
  18. data/lib/wright/resource.rb +21 -19
  19. data/lib/wright/resource/directory.rb +21 -10
  20. data/lib/wright/resource/file.rb +25 -14
  21. data/lib/wright/resource/group.rb +16 -9
  22. data/lib/wright/resource/package.rb +14 -9
  23. data/lib/wright/resource/symlink.rb +10 -8
  24. data/lib/wright/resource/user.rb +30 -9
  25. data/lib/wright/util.rb +14 -2
  26. data/lib/wright/util/erb_renderer.rb +29 -0
  27. data/lib/wright/util/file.rb +1 -1
  28. data/lib/wright/util/file_owner.rb +8 -3
  29. data/lib/wright/util/file_permissions.rb +14 -12
  30. data/lib/wright/util/file_renderer.rb +50 -0
  31. data/lib/wright/util/mustache_renderer.rb +41 -0
  32. data/lib/wright/util/pencil_mustache.rb +58 -0
  33. data/lib/wright/version.rb +1 -1
  34. data/man/wright.1 +10 -11
  35. data/spec/dsl_spec.rb +72 -7
  36. data/spec/provider/package/apt/{apt-get_--purge_remove_-qy_abcde.return → apt-get_-qy_--purge_remove_abcde.return} +0 -0
  37. data/spec/provider/package/apt/{apt-get_--purge_remove_-qy_abcde.stderr → apt-get_-qy_--purge_remove_abcde.stderr} +0 -0
  38. data/spec/provider/package/apt/{apt-get_--purge_remove_-qy_abcde.stdout → apt-get_-qy_--purge_remove_abcde.stdout} +0 -0
  39. data/spec/provider/package/apt/{apt-get_install_-qy_abcde=2.5.4-1.return → apt-get_-qy_install_abcde=2.5.4-1.return} +0 -0
  40. data/spec/provider/package/apt/{apt-get_install_-qy_abcde=2.5.4-1.stderr → apt-get_-qy_install_abcde=2.5.4-1.stderr} +0 -0
  41. data/spec/provider/package/apt/{apt-get_install_-qy_abcde=2.5.4-1.stdout → apt-get_-qy_install_abcde=2.5.4-1.stdout} +0 -0
  42. data/spec/provider/package/apt/{apt-get_install_-qy_htop.return → apt-get_-qy_install_htop.return} +0 -0
  43. data/spec/provider/package/apt/{apt-get_install_-qy_htop.stderr → apt-get_-qy_install_htop.stderr} +0 -0
  44. data/spec/provider/package/apt/{apt-get_install_-qy_htop.stdout → apt-get_-qy_install_htop.stdout} +0 -0
  45. data/spec/provider/package/apt/{apt-get_install_-qy_not-a-real-package.return → apt-get_-qy_install_not-a-real-package.return} +0 -0
  46. data/spec/provider/package/apt/{apt-get_install_-qy_not-a-real-package.stderr → apt-get_-qy_install_not-a-real-package.stderr} +0 -0
  47. data/spec/provider/package/apt/{apt-get_install_-qy_not-a-real-package.stdout → apt-get_-qy_install_not-a-real-package.stdout} +0 -0
  48. data/spec/provider/package/apt/{apt-get_remove_-qy_abcde.return → apt-get_-qy_remove_abcde.return} +0 -0
  49. data/spec/provider/package/apt/{apt-get_remove_-qy_abcde.stderr → apt-get_-qy_remove_abcde.stderr} +0 -0
  50. data/spec/provider/package/apt/{apt-get_remove_-qy_abcde.stdout → apt-get_-qy_remove_abcde.stdout} +0 -0
  51. data/spec/provider/package/apt_spec.rb +2 -2
  52. data/spec/provider/package/yum/{yum_install_-y_mc-4.8.7-8.el7.return → yum_-y_install_mc-4.8.7-8.el7.return} +0 -0
  53. data/spec/provider/package/yum/{yum_install_-y_mc-4.8.7-8.el7.stderr → yum_-y_install_mc-4.8.7-8.el7.stderr} +0 -0
  54. data/spec/provider/package/yum/{yum_install_-y_mc-4.8.7-8.el7.stdout → yum_-y_install_mc-4.8.7-8.el7.stdout} +0 -0
  55. data/spec/provider/package/yum/{yum_install_-y_nano.return → yum_-y_install_nano.return} +0 -0
  56. data/spec/provider/package/yum/{yum_install_-y_nano.stderr → yum_-y_install_nano.stderr} +0 -0
  57. data/spec/provider/package/yum/{yum_install_-y_nano.stdout → yum_-y_install_nano.stdout} +0 -0
  58. data/spec/provider/package/yum/{yum_install_-y_not-a-real-package.return → yum_-y_install_not-a-real-package.return} +0 -0
  59. data/spec/provider/package/yum/{yum_install_-y_not-a-real-package.stderr → yum_-y_install_not-a-real-package.stderr} +0 -0
  60. data/spec/provider/package/yum/{yum_install_-y_not-a-real-package.stdout → yum_-y_install_not-a-real-package.stdout} +0 -0
  61. data/spec/provider/package/yum/{yum_remove_-y_screen.return → yum_-y_remove_screen.return} +0 -0
  62. data/spec/provider/package/yum/{yum_remove_-y_screen.stderr → yum_-y_remove_screen.stderr} +0 -0
  63. data/spec/provider/package/yum/{yum_remove_-y_screen.stdout → yum_-y_remove_screen.stdout} +0 -0
  64. data/spec/provider/package/yum_spec.rb +1 -1
  65. data/spec/resource/directory_spec.rb +15 -0
  66. data/spec/resource/file_spec.rb +17 -0
  67. data/spec/resource/group_spec.rb +15 -0
  68. data/spec/resource/package_spec.rb +13 -0
  69. data/spec/resource/symlink_spec.rb +11 -0
  70. data/spec/resource/user_spec.rb +32 -0
  71. data/spec/resource_spec.rb +18 -10
  72. data/spec/spec_helper.rb +1 -0
  73. data/spec/spec_helpers/fake_capture3.rb +1 -1
  74. data/spec/util/erb_renderer_spec.rb +23 -0
  75. data/spec/util/file_owner_spec.rb +19 -0
  76. data/spec/util/file_renderer_spec.rb +28 -0
  77. data/spec/util/mustache_renderer_spec.rb +57 -0
  78. data/spec/util/pencil_mustache_spec.rb +15 -0
  79. data/spec/util_spec.rb +17 -3
  80. metadata +90 -64
@@ -1,4 +1,4 @@
1
1
  module Wright # rubocop:disable Documentation
2
2
  # Current wright version
3
- VERSION = '0.4.4'
3
+ VERSION = '0.5.0'
4
4
  end
@@ -2,12 +2,12 @@
2
2
  .\" Title: wright
3
3
  .\" Author: [see the "AUTHOR" section]
4
4
  .\" Generator: DocBook XSL Stylesheets v1.78.1 <http://docbook.sf.net/>
5
- .\" Date: 06/03/2015
5
+ .\" Date: 09/20/2015
6
6
  .\" Manual: \ \&
7
7
  .\" Source: \ \&
8
8
  .\" Language: English
9
9
  .\"
10
- .TH "WRIGHT" "1" "06/03/2015" "\ \&" "\ \&"
10
+ .TH "WRIGHT" "1" "09/20/2015" "\ \&" "\ \&"
11
11
  .\" -----------------------------------------------------------------
12
12
  .\" * Define some portability stuff
13
13
  .\" -----------------------------------------------------------------
@@ -94,7 +94,7 @@ Create a system user named "foobard":
94
94
  .RS 4
95
95
  .\}
96
96
  .nf
97
- wright \-e \*(Aquser("foobard") { |u| u\&.system = true }\*(Aq
97
+ wright \-e \*(Aquser "foobard", system: true\*(Aq
98
98
  .fi
99
99
  .if n \{\
100
100
  .RE
@@ -106,7 +106,7 @@ Create a system group named "foobard":
106
106
  .RS 4
107
107
  .\}
108
108
  .nf
109
- wright \-e \*(Aqgroup("foobard") { |u| u\&.system = true }\*(Aq
109
+ wright \-e \*(Aqgroup "foobard", system: true\*(Aq
110
110
  .fi
111
111
  .if n \{\
112
112
  .RE
@@ -118,7 +118,7 @@ Create a file named \fI/etc/issue\fR containing the current wright version:
118
118
  .RS 4
119
119
  .\}
120
120
  .nf
121
- wright \-e \*(Aqfile("/etc/issue") { |f| f\&.content = Wright::VERSION }\*(Aq
121
+ wright \-e \*(Aqfile "/etc/issue", content: Wright::VERSION\*(Aq
122
122
  .fi
123
123
  .if n \{\
124
124
  .RE
@@ -142,7 +142,7 @@ Create a symlink from \fI\&.bash_profile\fR to \fI\&.profile\fR in the current u
142
142
  .RS 4
143
143
  .\}
144
144
  .nf
145
- wright \-e \*(Aqsymlink("~/\&.bash_profile") { |s| s\&.to = "~/\&.profile" }\*(Aq
145
+ wright \-e \*(Aqsymlink "~/\&.bash_profile", to: "~/\&.profile"\*(Aq
146
146
  .fi
147
147
  .if n \{\
148
148
  .RE
@@ -156,15 +156,14 @@ To install tmux and update its config file from a wright script, create the foll
156
156
  .nf
157
157
  package \*(Aqtmux\*(Aq
158
158
 
159
- file \*(Aq/etc/tmux\&.conf\*(Aq do |f|
160
- f\&.content = <<EOF
159
+ file \*(Aq/etc/tmux\&.conf\*(Aq,
160
+ mode: \*(Aq444\*(Aq,
161
+ on_update: \-> { puts \*(AqUpdated /etc/tmux\&.conf\*(Aq },
162
+ content: <<EOF
161
163
  unbind C\-b
162
164
  set \-g prefix C\-a
163
165
  bind\-key a send\-prefix
164
166
  EOF
165
- f\&.mode = \*(Aq444\*(Aq
166
- f\&.on_update = \-> { puts \*(AqUpdated /etc/tmux\&.conf\*(Aq }
167
- end
168
167
  .fi
169
168
  .if n \{\
170
169
  .RE
@@ -6,9 +6,8 @@ describe Wright::DSL do
6
6
  before(:each) do
7
7
  # duplicate Wright::DSL for testing
8
8
  dsl = Wright::DSL.dup
9
- @recipe = Class.new do
10
- extend dsl
11
- end
9
+ @recipe = Object.new
10
+ @recipe.extend(dsl)
12
11
  @wright_dsl = dsl
13
12
  end
14
13
 
@@ -17,7 +16,8 @@ describe Wright::DSL do
17
16
  def self.name
18
17
  'ResourceKlass'
19
18
  end
20
- def initialize(_name); end
19
+
20
+ def initialize(_name, _args); end
21
21
  end
22
22
 
23
23
  @wright_dsl.register_resource(resource_class)
@@ -26,8 +26,10 @@ describe Wright::DSL do
26
26
  resource_name = 'just a name'
27
27
  @recipe.must_respond_to(resource_method_name)
28
28
 
29
+ # Ruby 1.9: "0 for 1", Ruby 2: "0 for 1..2"
30
+ error_message_re = /\Awrong number of arguments \(0 for 1(..2)?\)\Z/
29
31
  e = -> { @recipe.send(resource_method_name) }.must_raise ArgumentError
30
- e.message.must_equal 'wrong number of arguments (0 for 1)'
32
+ e.message.must_match error_message_re
31
33
 
32
34
  resource = @recipe.send(resource_method_name, resource_name)
33
35
  resource.must_be_instance_of(resource_class)
@@ -39,7 +41,7 @@ describe Wright::DSL do
39
41
  'Hello'
40
42
  end
41
43
 
42
- def initialize(name)
44
+ def initialize(name, _args = {})
43
45
  @name = name
44
46
  end
45
47
 
@@ -58,7 +60,7 @@ describe Wright::DSL do
58
60
  'ResourceKlass'
59
61
  end
60
62
 
61
- def initialize(_name); end
63
+ def initialize(_name, _args = {}); end
62
64
  end
63
65
  @wright_dsl.register_resource(resource_class)
64
66
 
@@ -67,4 +69,67 @@ describe Wright::DSL do
67
69
 
68
70
  -> { @recipe.send(resource_name, nil, &block) }.must_throw resource_class
69
71
  end
72
+
73
+ describe '#util' do
74
+ it 'should return a Wright::DSL::Util object' do
75
+ @recipe.util.must_be_instance_of Wright::DSL::Util
76
+ end
77
+ end
78
+ end
79
+
80
+ describe Wright::DSL::Util do
81
+ before(:each) { @util = Wright::DSL::Util.new }
82
+
83
+ describe '#render_erb' do
84
+ it 'should delegate rendering ERB templates to ErbRenderer' do
85
+ erb_renderer_class_double = Minitest::Mock.new
86
+ erb_renderer_object_double = Minitest::Mock.new
87
+ erb_renderer_class_double.expect(:new,
88
+ erb_renderer_object_double,
89
+ [:hash])
90
+ erb_renderer_object_double.expect(:render, nil, [:template])
91
+
92
+ Wright::Util.stub_const(:ErbRenderer,
93
+ erb_renderer_class_double) do
94
+ @util.render_erb(:template, :hash)
95
+ end
96
+ erb_renderer_class_double.verify
97
+ erb_renderer_object_double.verify
98
+ end
99
+ end
100
+
101
+ describe '#render_mustache' do
102
+ it 'should delegate rendering mustache templates to MustacheRenderer' do
103
+ mustache_renderer_class_double = Minitest::Mock.new
104
+ mustache_renderer_object_double = Minitest::Mock.new
105
+ mustache_renderer_class_double.expect(:new,
106
+ mustache_renderer_object_double,
107
+ [:hash])
108
+ mustache_renderer_object_double.expect(:render, nil, [:template])
109
+
110
+ Wright::Util.stub_const(:MustacheRenderer,
111
+ mustache_renderer_class_double) do
112
+ @util.render_mustache(:template, :hash)
113
+ end
114
+ mustache_renderer_class_double.verify
115
+ mustache_renderer_object_double.verify
116
+ end
117
+ end
118
+
119
+ describe '#render_file' do
120
+ it 'should delegate rendering files templates to FileRenderer' do
121
+ file_renderer_class_double = Minitest::Mock.new
122
+ file_renderer_object_double = Minitest::Mock.new
123
+ file_renderer_class_double.expect(:new,
124
+ file_renderer_object_double,
125
+ [:hash])
126
+ file_renderer_object_double.expect(:render, nil, [:filename])
127
+
128
+ Wright::Util.stub_const(:FileRenderer, file_renderer_class_double) do
129
+ @util.render_file(:filename, :hash)
130
+ end
131
+ file_renderer_class_double.verify
132
+ file_renderer_object_double.verify
133
+ end
134
+ end
70
135
  end
@@ -10,7 +10,7 @@ describe Wright::Provider::Package::Apt do
10
10
  def apt_get(action, pkg_name, args = {})
11
11
  version = args[:version].nil? ? '' : "=#{args[:version]}"
12
12
  options = args[:options]
13
- ['apt-get', *options, action.to_s, '-qy', pkg_name + version]
13
+ ['apt-get', '-qy', *options, action.to_s, pkg_name + version]
14
14
  end
15
15
 
16
16
  def package_provider(pkg_name, args = {})
@@ -135,7 +135,7 @@ describe Wright::Provider::Package::Apt do
135
135
  pkg_provider = package_provider(pkg_name, options: pkg_options)
136
136
  apt_cmd = apt_get(:install, pkg_name, options: pkg_options)
137
137
 
138
- @fake_capture3.expect(apt_cmd, 'apt-get_install_-qy_htop')
138
+ @fake_capture3.expect(apt_cmd, 'apt-get_-qy_install_htop')
139
139
  @fake_capture3.stub do
140
140
  pkg_provider.send(:install_package)
141
141
  end
@@ -18,7 +18,7 @@ describe Wright::Provider::Package::Yum do
18
18
 
19
19
  def yum(action, pkg_name, args = {})
20
20
  version = args[:version].nil? ? '' : "-#{args[:version]}"
21
- ['yum', *args[:options], action.to_s, '-y', pkg_name + version]
21
+ ['yum', '-y', *args[:options], action.to_s, pkg_name + version]
22
22
  end
23
23
 
24
24
  before :each do
@@ -9,6 +9,21 @@ describe Wright::Resource::Directory do
9
9
 
10
10
  after(:each) { FakeFS::FileSystem.clear }
11
11
 
12
+ describe '#initialize' do
13
+ it 'should accept attributes via an argument hash' do
14
+ resource = Wright::Resource::Directory.new(@dirname,
15
+ mode: 'sample_mode',
16
+ action: 'sample_action',
17
+ owner: 'sample_owner',
18
+ group: 'sample_group')
19
+ resource.name.must_equal @dirname
20
+ resource.mode.must_equal 'sample_mode'
21
+ resource.action.must_equal 'sample_action'
22
+ resource.owner.must_equal 'sample_owner'
23
+ resource.group.must_equal 'sample_group'
24
+ end
25
+ end
26
+
12
27
  describe '#create' do
13
28
  it 'should create directories' do
14
29
  FakeFS do
@@ -12,6 +12,23 @@ describe Wright::Resource::File do
12
12
 
13
13
  after(:each) { FakeFS::FileSystem.clear }
14
14
 
15
+ describe '#initialize' do
16
+ it 'should accept attributes via an argument hash' do
17
+ resource = Wright::Resource::File.new(@filename,
18
+ content: 'sample_content',
19
+ mode: 'sample_mode',
20
+ action: 'sample_action',
21
+ owner: 'sample_owner',
22
+ group: 'sample_group')
23
+ resource.name.must_equal @filename
24
+ resource.content.must_equal 'sample_content'
25
+ resource.mode.must_equal 'sample_mode'
26
+ resource.action.must_equal 'sample_action'
27
+ resource.owner.must_equal 'sample_owner'
28
+ resource.group.must_equal 'sample_group'
29
+ end
30
+ end
31
+
15
32
  describe '#create' do
16
33
  it 'should create files' do
17
34
  FakeFS do
@@ -9,6 +9,21 @@ describe Wright::Resource::Group do
9
9
  @group.instance_variable_set(:@provider, @provider)
10
10
  end
11
11
 
12
+ describe '#initialize' do
13
+ it 'should accept attributes via an argument hash' do
14
+ resource = Wright::Resource::Group.new('sample_name',
15
+ members: 'sample_members',
16
+ gid: 'sample_gid',
17
+ system: 'sample_system',
18
+ action: 'sample_action')
19
+ resource.name.must_equal 'sample_name'
20
+ resource.members.must_equal 'sample_members'
21
+ resource.gid.must_equal 'sample_gid'
22
+ resource.system.must_equal 'sample_system'
23
+ resource.action.must_equal 'sample_action'
24
+ end
25
+ end
26
+
12
27
  describe '#create' do
13
28
  it 'should ask the provider to create the group' do
14
29
  @provider.expect(:create, nil)
@@ -9,6 +9,19 @@ describe Wright::Resource::Package do
9
9
  @package.instance_variable_set(:@provider, @provider)
10
10
  end
11
11
 
12
+ describe '#initialize' do
13
+ it 'should accept attributes via an argument hash' do
14
+ resource = Wright::Resource::Package.new('sample_name',
15
+ version: 'sample_version',
16
+ options: 'sample_options',
17
+ action: 'sample_action')
18
+ resource.name.must_equal 'sample_name'
19
+ resource.version.must_equal 'sample_version'
20
+ resource.options.must_equal 'sample_options'
21
+ resource.action.must_equal 'sample_action'
22
+ end
23
+ end
24
+
12
25
  describe '#installed_versions' do
13
26
  it 'should ask the provider for installed versions' do
14
27
  @provider.expect(:installed_versions, nil)
@@ -18,6 +18,17 @@ describe Wright::Resource::Symlink do
18
18
  link
19
19
  end
20
20
 
21
+ describe '#initialize' do
22
+ it 'should accept attributes via an argument hash' do
23
+ resource = Wright::Resource::Symlink.new(@link_name,
24
+ to: 'sample_to',
25
+ action: 'sample_action')
26
+ resource.name.must_equal @link_name
27
+ resource.to.must_equal 'sample_to'
28
+ resource.action.must_equal 'sample_action'
29
+ end
30
+ end
31
+
21
32
  describe '#create' do
22
33
  it 'should create symlinks' do
23
34
  FakeFS do
@@ -9,6 +9,38 @@ describe Wright::Resource::User do
9
9
  @user.instance_variable_set(:@provider, @provider)
10
10
  end
11
11
 
12
+ describe '#initialize' do
13
+ it 'should accept attributes via an argument hash' do
14
+ resource = Wright::Resource::User.new('sample_name',
15
+ uid: 'sample_uid',
16
+ full_name: 'sample_full_name',
17
+ groups: 'sample_groups',
18
+ shell: 'sample_shell',
19
+ home: 'sample_home',
20
+ primary_group: 'sample_pgroup',
21
+ system: 'sample_system',
22
+ action: 'sample_action')
23
+ resource.name.must_equal 'sample_name'
24
+ resource.uid.must_equal 'sample_uid'
25
+ resource.full_name.must_equal 'sample_full_name'
26
+ resource.groups.must_equal 'sample_groups'
27
+ resource.shell.must_equal 'sample_shell'
28
+ resource.home.must_equal 'sample_home'
29
+ resource.primary_group.must_equal 'sample_pgroup'
30
+ resource.system.must_equal 'sample_system'
31
+ resource.action.must_equal 'sample_action'
32
+ end
33
+
34
+ it 'should accept aliased attributes via an argument hash' do
35
+ resource = Wright::Resource::User.new('sample_name',
36
+ login_group: 'sample_login_group',
37
+ homedir: 'sample_homedir')
38
+ resource.name.must_equal 'sample_name'
39
+ resource.login_group.must_equal 'sample_login_group'
40
+ resource.homedir.must_equal 'sample_homedir'
41
+ end
42
+ end
43
+
12
44
  describe '#create' do
13
45
  it 'should ask the provider to create the user' do
14
46
  @provider.expect(:create, nil)
@@ -3,13 +3,6 @@ require_relative 'spec_helper'
3
3
  require 'wright/resource'
4
4
  require 'wright/provider'
5
5
 
6
- module Wright
7
- # add provider attribute reader for tests
8
- class Resource
9
- attr_reader :provider
10
- end
11
- end
12
-
13
6
  module Wright
14
7
  class Provider
15
8
  class Sample < Wright::Provider; end
@@ -56,20 +49,23 @@ describe Wright::Resource do
56
49
 
57
50
  it 'should retrieve a provider for a resource' do
58
51
  provider_class = Wright::Provider::Sample
59
- Sample.new.provider.must_be_kind_of provider_class
52
+ provider = Sample.new.send(:provider)
53
+ provider.must_be_kind_of provider_class
60
54
  end
61
55
 
62
56
  it 'should retrieve a provider for a resource listed in the config' do
63
57
  # instantiating the Sample resource without any config should
64
58
  # yield the Sample provider
65
59
  provider_class = Wright::Provider::Sample
66
- Sample.new.provider.must_be_kind_of provider_class
60
+ provider = Sample.new.send(:provider)
61
+ provider.must_be_kind_of provider_class
67
62
 
68
63
  # when the provider for Sample resources is set to
69
64
  # AlternateSample, AlternateSample should be instantiated
70
65
  alternate = Wright::Provider::AlternateSample
71
66
  Wright::Config[:resources] = { sample: { provider: alternate.name } }
72
- Sample.new.provider.must_be_kind_of alternate
67
+ alternate_provider = Sample.new.send(:provider)
68
+ alternate_provider.must_be_kind_of alternate
73
69
  end
74
70
 
75
71
  it 'should display warnings for nonexistent providers' do
@@ -189,4 +185,16 @@ describe Wright::Resource do
189
185
  resource.fail_train
190
186
  end.must_raise(RuntimeError)
191
187
  end
188
+
189
+ it 'should accept attributes via an argument hash' do
190
+ sample_lambda = -> {}
191
+ sample = Sample.new('sample_name',
192
+ action: 'sample_action',
193
+ on_update: sample_lambda,
194
+ ignore_failure: 'sample_ignore_failure')
195
+ sample.name.must_equal 'sample_name'
196
+ sample.action.must_equal 'sample_action'
197
+ sample.send(:on_update).must_equal sample_lambda
198
+ sample.ignore_failure.must_equal 'sample_ignore_failure'
199
+ end
192
200
  end