gratan 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +6 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +86 -0
  8. data/Rakefile +5 -0
  9. data/bin/gratan +132 -0
  10. data/gratan.gemspec +28 -0
  11. data/lib/gratan/client.rb +211 -0
  12. data/lib/gratan/driver.rb +166 -0
  13. data/lib/gratan/dsl/context/on.rb +19 -0
  14. data/lib/gratan/dsl/context/user.rb +25 -0
  15. data/lib/gratan/dsl/context.rb +57 -0
  16. data/lib/gratan/dsl/converter.rb +74 -0
  17. data/lib/gratan/dsl/validator.rb +13 -0
  18. data/lib/gratan/dsl.rb +9 -0
  19. data/lib/gratan/exporter.rb +49 -0
  20. data/lib/gratan/ext/string_ext.rb +25 -0
  21. data/lib/gratan/grant_parser.rb +68 -0
  22. data/lib/gratan/identifier/auto.rb +28 -0
  23. data/lib/gratan/identifier/csv.rb +25 -0
  24. data/lib/gratan/identifier/null.rb +5 -0
  25. data/lib/gratan/identifier.rb +2 -0
  26. data/lib/gratan/logger.rb +28 -0
  27. data/lib/gratan/version.rb +3 -0
  28. data/lib/gratan.rb +24 -0
  29. data/spec/change/change_grants_2_spec.rb +154 -0
  30. data/spec/change/change_grants_3_spec.rb +164 -0
  31. data/spec/change/change_grants_4_spec.rb +37 -0
  32. data/spec/change/change_grants_spec.rb +209 -0
  33. data/spec/create/create_user_2_spec.rb +139 -0
  34. data/spec/create/create_user_3_spec.rb +115 -0
  35. data/spec/create/create_user_spec.rb +194 -0
  36. data/spec/drop/drop_user_2_spec.rb +77 -0
  37. data/spec/drop/drop_user_spec.rb +67 -0
  38. data/spec/drop/expire_user_spec.rb +179 -0
  39. data/spec/export/export_spec.rb +119 -0
  40. data/spec/misc/misc_spec.rb +74 -0
  41. data/spec/misc/require_spec.rb +77 -0
  42. data/spec/spec_helper.rb +118 -0
  43. metadata +198 -0
@@ -0,0 +1,194 @@
1
+ describe 'Gratan::Client#apply' do
2
+ context 'when user does not exist' do
3
+ subject { client }
4
+
5
+ it do
6
+ result = apply(subject) { '' }
7
+ expect(result).to be_falsey
8
+ expect(show_grants).to match_array []
9
+ end
10
+ end
11
+
12
+ context 'when create user' do
13
+ subject { client }
14
+
15
+ it do
16
+ result = apply(subject) {
17
+ <<-RUBY
18
+ user 'scott', 'localhost', identified: 'tiger' do
19
+ on '*.*' do
20
+ grant 'SELECT'
21
+ grant 'INSERT'
22
+ grant 'UPDATE'
23
+ grant 'DELETE'
24
+ end
25
+
26
+ on 'test.*' do
27
+ grant 'SELECT'
28
+ grant 'INSERT'
29
+ grant 'UPDATE'
30
+ grant 'DELETE'
31
+ end
32
+ end
33
+ RUBY
34
+ }
35
+
36
+ expect(result).to be_truthy
37
+
38
+ expect(show_grants).to match_array [
39
+ "GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'scott'@'localhost' IDENTIFIED BY PASSWORD '*F2F68D0BB27A773C1D944270E5FAFED515A3FA40'",
40
+ "GRANT SELECT, INSERT, UPDATE, DELETE ON `test`.* TO 'scott'@'localhost'",
41
+ ]
42
+ end
43
+ end
44
+
45
+ context 'when add user' do
46
+ before do
47
+ apply {
48
+ <<-RUBY
49
+ user 'bob', '%', required: 'SSL' do
50
+ on '*.*' do
51
+ grant 'ALL PRIVILEGES'
52
+ end
53
+
54
+ on 'test.*' do
55
+ grant 'SELECT'
56
+ end
57
+ end
58
+ RUBY
59
+ }
60
+ end
61
+
62
+ subject { client }
63
+
64
+ it do
65
+ apply(subject) {
66
+ <<-RUBY
67
+ user 'bob', '%', required: 'SSL' do
68
+ on '*.*' do
69
+ grant 'ALL PRIVILEGES'
70
+ end
71
+
72
+ on 'test.*' do
73
+ grant 'SELECT'
74
+ end
75
+ end
76
+
77
+ user 'scott', 'localhost', identified: 'tiger' do
78
+ on '*.*' do
79
+ grant 'SELECT'
80
+ grant 'INSERT'
81
+ grant 'UPDATE'
82
+ grant 'DELETE'
83
+ end
84
+
85
+ on 'test.*' do
86
+ grant 'SELECT'
87
+ grant 'INSERT'
88
+ grant 'UPDATE'
89
+ grant 'DELETE'
90
+ end
91
+ end
92
+ RUBY
93
+ }
94
+
95
+ expect(show_grants).to match_array [
96
+ "GRANT ALL PRIVILEGES ON *.* TO 'bob'@'%' REQUIRE SSL",
97
+ "GRANT SELECT ON `test`.* TO 'bob'@'%'",
98
+ "GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'scott'@'localhost' IDENTIFIED BY PASSWORD '*F2F68D0BB27A773C1D944270E5FAFED515A3FA40'",
99
+ "GRANT SELECT, INSERT, UPDATE, DELETE ON `test`.* TO 'scott'@'localhost'",
100
+ ]
101
+ end
102
+ end
103
+
104
+ context 'when create user with grant option' do
105
+ subject { client }
106
+
107
+ it do
108
+ apply(subject) {
109
+ <<-RUBY
110
+ user 'scott', 'localhost', identified: 'tiger' do
111
+ on '*.*', with: 'grant option' do
112
+ grant 'SELECT'
113
+ grant 'INSERT'
114
+ grant 'UPDATE'
115
+ grant 'DELETE'
116
+ end
117
+
118
+ on 'test.*' do
119
+ grant 'SELECT'
120
+ grant 'INSERT'
121
+ grant 'UPDATE'
122
+ grant 'DELETE'
123
+ end
124
+ end
125
+ RUBY
126
+ }
127
+
128
+ expect(show_grants).to match_array [
129
+ "GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'scott'@'localhost' IDENTIFIED BY PASSWORD '*F2F68D0BB27A773C1D944270E5FAFED515A3FA40' WITH GRANT OPTION",
130
+ "GRANT SELECT, INSERT, UPDATE, DELETE ON `test`.* TO 'scott'@'localhost'",
131
+ ]
132
+ end
133
+ end
134
+
135
+ context 'when duplicata user' do
136
+ subject { client }
137
+
138
+ it do
139
+ dsl = <<-RUBY
140
+ user 'scott', 'localhost', required: 'SSL' do
141
+ on '*.*' do
142
+ grant 'ALL PRIVILEGES'
143
+ end
144
+
145
+ on 'test.*' do
146
+ grant 'SELECT'
147
+ end
148
+ end
149
+
150
+ user 'scott', 'localhost', identified: 'tiger' do
151
+ on '*.*' do
152
+ grant 'SELECT'
153
+ grant 'INSERT'
154
+ grant 'UPDATE'
155
+ grant 'DELETE'
156
+ end
157
+
158
+ on 'test.*' do
159
+ grant 'SELECT'
160
+ grant 'INSERT'
161
+ grant 'UPDATE'
162
+ grant 'DELETE'
163
+ end
164
+ end
165
+ RUBY
166
+
167
+ expect {
168
+ apply(subject) { dsl }
169
+ }.to raise_error('User `scott@localhost` is already defined')
170
+ end
171
+ end
172
+
173
+ context 'when duplicata object' do
174
+ subject { client }
175
+
176
+ it do
177
+ dsl = <<-RUBY
178
+ user 'scott', 'localhost', required: 'SSL' do
179
+ on '*.*' do
180
+ grant 'ALL PRIVILEGES'
181
+ end
182
+
183
+ on '*.*' do
184
+ grant 'SELECT'
185
+ end
186
+ end
187
+ RUBY
188
+
189
+ expect {
190
+ apply(subject) { dsl }
191
+ }.to raise_error('User `scott@localhost`: Object `*.*` is already defined')
192
+ end
193
+ end
194
+ end
@@ -0,0 +1,77 @@
1
+ describe 'Gratan::Client#apply' do
2
+ before(:each) do
3
+ apply {
4
+ <<-RUBY
5
+ user 'scott', 'localhost', identified: 'tiger', required: 'SSL' do
6
+ on '*.*' do
7
+ grant 'SELECT'
8
+ grant 'INSERT'
9
+ end
10
+
11
+ on 'test.*' do
12
+ grant 'UPDATE'
13
+ grant 'DELETE'
14
+ end
15
+
16
+ on 'mysql.user' do
17
+ grant 'SELECT (user)'
18
+ end
19
+ end
20
+
21
+ user 'bob', 'localhost' do
22
+ on '*.*' do
23
+ grant 'USAGE'
24
+ end
25
+
26
+ on 'test.*' do
27
+ grant 'ALL PRIVILEGES'
28
+ end
29
+ end
30
+ RUBY
31
+ }
32
+ end
33
+
34
+ context 'when drop user' do
35
+ subject { client(dry_run: true) }
36
+
37
+ it do
38
+ apply(subject) {
39
+ <<-RUBY
40
+ user 'bob', 'localhost' do
41
+ on '*.*' do
42
+ grant 'USAGE'
43
+ end
44
+
45
+ on 'test.*' do
46
+ grant 'ALL PRIVILEGES'
47
+ end
48
+ end
49
+ RUBY
50
+ }
51
+
52
+ expect(show_grants).to match_array [
53
+ "GRANT ALL PRIVILEGES ON `test`.* TO 'bob'@'localhost'",
54
+ "GRANT SELECT (user) ON `mysql`.`user` TO 'scott'@'localhost'",
55
+ "GRANT SELECT, INSERT ON *.* TO 'scott'@'localhost' IDENTIFIED BY PASSWORD '*F2F68D0BB27A773C1D944270E5FAFED515A3FA40' REQUIRE SSL",
56
+ "GRANT UPDATE, DELETE ON `test`.* TO 'scott'@'localhost'",
57
+ "GRANT USAGE ON *.* TO 'bob'@'localhost'",
58
+ ]
59
+ end
60
+ end
61
+
62
+ context 'when drop all users' do
63
+ subject { client(dry_run: true) }
64
+
65
+ it do
66
+ apply(subject) { '' }
67
+
68
+ expect(show_grants).to match_array [
69
+ "GRANT ALL PRIVILEGES ON `test`.* TO 'bob'@'localhost'",
70
+ "GRANT SELECT (user) ON `mysql`.`user` TO 'scott'@'localhost'",
71
+ "GRANT SELECT, INSERT ON *.* TO 'scott'@'localhost' IDENTIFIED BY PASSWORD '*F2F68D0BB27A773C1D944270E5FAFED515A3FA40' REQUIRE SSL",
72
+ "GRANT UPDATE, DELETE ON `test`.* TO 'scott'@'localhost'",
73
+ "GRANT USAGE ON *.* TO 'bob'@'localhost'",
74
+ ]
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,67 @@
1
+ describe 'Gratan::Client#apply' do
2
+ before(:each) do
3
+ apply {
4
+ <<-RUBY
5
+ user 'scott', 'localhost', identified: 'tiger', required: 'SSL' do
6
+ on '*.*' do
7
+ grant 'SELECT'
8
+ grant 'INSERT'
9
+ end
10
+
11
+ on 'test.*' do
12
+ grant 'UPDATE'
13
+ grant 'DELETE'
14
+ end
15
+
16
+ on 'mysql.user' do
17
+ grant 'SELECT (user)'
18
+ end
19
+ end
20
+
21
+ user 'bob', 'localhost' do
22
+ on '*.*' do
23
+ grant 'USAGE'
24
+ end
25
+
26
+ on 'test.*' do
27
+ grant 'ALL PRIVILEGES'
28
+ end
29
+ end
30
+ RUBY
31
+ }
32
+ end
33
+
34
+ context 'when drop user' do
35
+ subject { client }
36
+
37
+ it do
38
+ apply(subject) {
39
+ <<-RUBY
40
+ user 'bob', 'localhost' do
41
+ on '*.*' do
42
+ grant 'USAGE'
43
+ end
44
+
45
+ on 'test.*' do
46
+ grant 'ALL PRIVILEGES'
47
+ end
48
+ end
49
+ RUBY
50
+ }
51
+
52
+ expect(show_grants).to match_array [
53
+ "GRANT ALL PRIVILEGES ON `test`.* TO 'bob'@'localhost'",
54
+ "GRANT USAGE ON *.* TO 'bob'@'localhost'",
55
+ ]
56
+ end
57
+ end
58
+
59
+ context 'when drop all users' do
60
+ subject { client }
61
+
62
+ it do
63
+ apply(subject) { '' }
64
+ expect(show_grants).to match_array []
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,179 @@
1
+ describe 'Gratan::Client#apply' do
2
+ before(:each) do
3
+ apply {
4
+ <<-RUBY
5
+ user 'scott', 'localhost', identified: 'tiger', required: 'SSL' do
6
+ on '*.*' do
7
+ grant 'SELECT'
8
+ grant 'INSERT'
9
+ end
10
+
11
+ on 'test.*' do
12
+ grant 'UPDATE'
13
+ grant 'DELETE'
14
+ end
15
+
16
+ on 'mysql.user' do
17
+ grant 'SELECT (user)'
18
+ end
19
+ end
20
+
21
+ user 'bob', 'localhost' do
22
+ on '*.*' do
23
+ grant 'USAGE'
24
+ end
25
+
26
+ on 'test.*' do
27
+ grant 'ALL PRIVILEGES'
28
+ end
29
+ end
30
+ RUBY
31
+ }
32
+ end
33
+
34
+ context 'when has expired' do
35
+ let(:logger) do
36
+ logger = Logger.new('/dev/null')
37
+ expect(logger).to receive(:warn).with('[WARN] User `scott@localhost` has expired')
38
+ logger
39
+ end
40
+
41
+ subject do
42
+ client(
43
+ enable_expired: true,
44
+ logger: logger
45
+ )
46
+ end
47
+
48
+ it do
49
+ dsl = <<-RUBY
50
+ user 'scott', 'localhost', identified: 'tiger', required: 'SSL', expired: '2014/10/06' do
51
+ on '*.*' do
52
+ grant 'SELECT'
53
+ grant 'INSERT'
54
+ end
55
+
56
+ on 'test.*' do
57
+ grant 'UPDATE'
58
+ grant 'DELETE'
59
+ end
60
+
61
+ on 'mysql.user' do
62
+ grant 'SELECT (user)'
63
+ end
64
+ end
65
+
66
+ user 'bob', 'localhost' do
67
+ on '*.*' do
68
+ grant 'USAGE'
69
+ end
70
+
71
+ on 'test.*' do
72
+ grant 'ALL PRIVILEGES'
73
+ end
74
+ end
75
+ RUBY
76
+
77
+ Timecop.freeze(Time.parse('2014/10/06')) do
78
+ apply(subject) { dsl }
79
+ end
80
+
81
+ expect(show_grants).to match_array [
82
+ "GRANT ALL PRIVILEGES ON `test`.* TO 'bob'@'localhost'",
83
+ "GRANT USAGE ON *.* TO 'bob'@'localhost'",
84
+ ]
85
+ end
86
+ end
87
+
88
+ context 'when has not expired' do
89
+ subject { client(enable_expired: true) }
90
+
91
+ it do
92
+ dsl = <<-RUBY
93
+ user 'scott', 'localhost', identified: 'tiger', required: 'SSL', expired: '2014/10/06' do
94
+ on '*.*' do
95
+ grant 'SELECT'
96
+ grant 'INSERT'
97
+ end
98
+
99
+ on 'test.*' do
100
+ grant 'UPDATE'
101
+ grant 'DELETE'
102
+ end
103
+
104
+ on 'mysql.user' do
105
+ grant 'SELECT (user)'
106
+ end
107
+ end
108
+
109
+ user 'bob', 'localhost' do
110
+ on '*.*' do
111
+ grant 'USAGE'
112
+ end
113
+
114
+ on 'test.*' do
115
+ grant 'ALL PRIVILEGES'
116
+ end
117
+ end
118
+ RUBY
119
+
120
+ Timecop.freeze(Time.parse('2014/10/05 23:59:59')) do
121
+ apply(subject) { dsl }
122
+ end
123
+
124
+ expect(show_grants).to match_array [
125
+ "GRANT ALL PRIVILEGES ON `test`.* TO 'bob'@'localhost'",
126
+ "GRANT SELECT (user) ON `mysql`.`user` TO 'scott'@'localhost'",
127
+ "GRANT SELECT, INSERT ON *.* TO 'scott'@'localhost' IDENTIFIED BY PASSWORD '*F2F68D0BB27A773C1D944270E5FAFED515A3FA40' REQUIRE SSL",
128
+ "GRANT UPDATE, DELETE ON `test`.* TO 'scott'@'localhost'",
129
+ "GRANT USAGE ON *.* TO 'bob'@'localhost'",
130
+ ]
131
+ end
132
+ end
133
+
134
+ context 'when enable_expired is false' do
135
+ subject { client(enable_expired: false) }
136
+
137
+ it do
138
+ dsl = <<-RUBY
139
+ user 'scott', 'localhost', identified: 'tiger', required: 'SSL', expired: '2014/10/06' do
140
+ on '*.*' do
141
+ grant 'SELECT'
142
+ grant 'INSERT'
143
+ end
144
+
145
+ on 'test.*' do
146
+ grant 'UPDATE'
147
+ grant 'DELETE'
148
+ end
149
+
150
+ on 'mysql.user' do
151
+ grant 'SELECT (user)'
152
+ end
153
+ end
154
+
155
+ user 'bob', 'localhost' do
156
+ on '*.*' do
157
+ grant 'USAGE'
158
+ end
159
+
160
+ on 'test.*' do
161
+ grant 'ALL PRIVILEGES'
162
+ end
163
+ end
164
+ RUBY
165
+
166
+ Timecop.freeze(Time.parse('2014/10/10')) do
167
+ apply(subject) { dsl }
168
+ end
169
+
170
+ expect(show_grants).to match_array [
171
+ "GRANT ALL PRIVILEGES ON `test`.* TO 'bob'@'localhost'",
172
+ "GRANT SELECT (user) ON `mysql`.`user` TO 'scott'@'localhost'",
173
+ "GRANT SELECT, INSERT ON *.* TO 'scott'@'localhost' IDENTIFIED BY PASSWORD '*F2F68D0BB27A773C1D944270E5FAFED515A3FA40' REQUIRE SSL",
174
+ "GRANT UPDATE, DELETE ON `test`.* TO 'scott'@'localhost'",
175
+ "GRANT USAGE ON *.* TO 'bob'@'localhost'",
176
+ ]
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,119 @@
1
+ describe 'Gratan::Client#export' do
2
+ context 'when user does not exist' do
3
+ subject { client }
4
+
5
+ it do
6
+ expect(subject.export.strip).to eq ''
7
+ end
8
+ end
9
+
10
+ context 'when user exists' do
11
+ let(:grantfile) {
12
+ <<-RUBY
13
+ user "scott", "%" do
14
+ on "*.*" do
15
+ grant "USAGE"
16
+ end
17
+
18
+ on "test.*" do
19
+ grant "SELECT"
20
+ end
21
+ end
22
+
23
+ user "scott", "localhost" do
24
+ on "*.*" do
25
+ grant "USAGE"
26
+ end
27
+
28
+ on "test.*" do
29
+ grant "SELECT"
30
+ end
31
+ end
32
+ RUBY
33
+ }
34
+
35
+ subject { client }
36
+
37
+ before do
38
+ apply(subject) do
39
+ grantfile
40
+ end
41
+ end
42
+
43
+ it do
44
+ expect(subject.export.strip).to eq grantfile.strip
45
+ end
46
+ end
47
+
48
+ context 'when ignore user exists' do
49
+ let(:grantfile) {
50
+ <<-RUBY
51
+ user "scott", "%" do
52
+ on "*.*" do
53
+ grant "USAGE"
54
+ end
55
+
56
+ on "test.*" do
57
+ grant "SELECT"
58
+ end
59
+ end
60
+
61
+ user "bob", "localhost" do
62
+ on "*.*" do
63
+ grant "USAGE"
64
+ end
65
+
66
+ on "test.*" do
67
+ grant "SELECT"
68
+ end
69
+ end
70
+ RUBY
71
+ }
72
+
73
+ subject { client(ignore_user: /\Abob\z/) }
74
+
75
+ before do
76
+ apply(subject) do
77
+ grantfile
78
+ end
79
+ end
80
+
81
+ it do
82
+ expect(subject.export.strip).to eq <<-RUBY.strip
83
+ user "scott", "%" do
84
+ on "*.*" do
85
+ grant "USAGE"
86
+ end
87
+
88
+ on "test.*" do
89
+ grant "SELECT"
90
+ end
91
+ end
92
+ RUBY
93
+ end
94
+ end
95
+
96
+ context 'when with option exists' do
97
+ let(:grantfile) {
98
+ <<-RUBY
99
+ user "scott", "%" do
100
+ on "*.*", :with=>"GRANT OPTION" do
101
+ grant "USAGE"
102
+ end
103
+ end
104
+ RUBY
105
+ }
106
+
107
+ subject { client(ignore_user: /\Abob\z/) }
108
+
109
+ before do
110
+ apply(subject) do
111
+ grantfile
112
+ end
113
+ end
114
+
115
+ it do
116
+ expect(subject.export.strip).to eq grantfile.strip
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,74 @@
1
+ describe 'Gratan::Client#apply' do
2
+ context 'when colorize is true' do
3
+ subject { client }
4
+
5
+ it do
6
+ dsl = <<-RUBY
7
+ user 'scott', 'localhost', identified: 'tiger' do
8
+ on '*.*' do
9
+ grant 'SELECT'
10
+ grant 'INSERT'
11
+ grant 'UPDATE'
12
+ grant 'DELETE'
13
+ end
14
+
15
+ on 'test.*' do
16
+ grant 'SELECT'
17
+ grant 'INSERT'
18
+ grant 'UPDATE'
19
+ grant 'DELETE'
20
+ end
21
+ end
22
+ RUBY
23
+
24
+ begin
25
+ String.colorize = true
26
+ apply(subject) { dsl }
27
+ ensure
28
+ String.colorize = false
29
+ end
30
+
31
+ expect(show_grants).to match_array [
32
+ "GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'scott'@'localhost' IDENTIFIED BY PASSWORD '*F2F68D0BB27A773C1D944270E5FAFED515A3FA40'",
33
+ "GRANT SELECT, INSERT, UPDATE, DELETE ON `test`.* TO 'scott'@'localhost'",
34
+ ]
35
+ end
36
+ end
37
+
38
+ context 'when set debug' do
39
+ let(:logger) do
40
+ logger = Gratan::Logger.instance
41
+ logger.set_debug(true)
42
+ logger
43
+ end
44
+
45
+ subject { client(logger: logger) }
46
+
47
+ it do
48
+ apply(subject) {
49
+ <<-RUBY
50
+ user 'scott', 'localhost', identified: 'tiger' do
51
+ on '*.*' do
52
+ grant 'SELECT'
53
+ grant 'INSERT'
54
+ grant 'UPDATE'
55
+ grant 'DELETE'
56
+ end
57
+
58
+ on 'test.*' do
59
+ grant 'SELECT'
60
+ grant 'INSERT'
61
+ grant 'UPDATE'
62
+ grant 'DELETE'
63
+ end
64
+ end
65
+ RUBY
66
+ }
67
+
68
+ expect(show_grants).to match_array [
69
+ "GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'scott'@'localhost' IDENTIFIED BY PASSWORD '*F2F68D0BB27A773C1D944270E5FAFED515A3FA40'",
70
+ "GRANT SELECT, INSERT, UPDATE, DELETE ON `test`.* TO 'scott'@'localhost'",
71
+ ]
72
+ end
73
+ end
74
+ end