prodder 1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/.travis.yml +52 -0
- data/Gemfile +16 -0
- data/Gemfile.lock +64 -0
- data/LICENSE.txt +21 -0
- data/README.md +272 -0
- data/Rakefile +20 -0
- data/bin/prodder +4 -0
- data/features/commit.feature +69 -0
- data/features/dump.feature +187 -0
- data/features/init.feature +24 -0
- data/features/lint.feature +46 -0
- data/features/prodder.feature +76 -0
- data/features/push.feature +25 -0
- data/features/step_definitions/git_steps.rb +65 -0
- data/features/step_definitions/prodder_steps.rb +150 -0
- data/features/support/blog.git.tgz +0 -0
- data/features/support/env.rb +116 -0
- data/features/support/prodder__blog_prod.sql +153 -0
- data/lib/prodder.rb +5 -0
- data/lib/prodder/cli.rb +135 -0
- data/lib/prodder/config.rb +95 -0
- data/lib/prodder/git.rb +97 -0
- data/lib/prodder/pg.rb +486 -0
- data/lib/prodder/prodder.rake +390 -0
- data/lib/prodder/project.rb +150 -0
- data/lib/prodder/railtie.rb +7 -0
- data/lib/prodder/version.rb +3 -0
- data/prodder.gemspec +25 -0
- data/spec/config_spec.rb +64 -0
- data/spec/spec_helper.rb +3 -0
- metadata +91 -0
data/Rakefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# Will this ever be useful? ...
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
RSpec::Core::RakeTask.new(:spec)
|
4
|
+
|
5
|
+
task :extract_fixtures do
|
6
|
+
unless File.directory? 'features/support/blog.git'
|
7
|
+
Dir.chdir('features/support') { sh "tar xzf blog.git.tgz" }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'cucumber/rake/task'
|
12
|
+
Cucumber::Rake::Task.new :cucumber => :extract_fixtures
|
13
|
+
|
14
|
+
namespace :cuke do
|
15
|
+
Cucumber::Rake::Task.new(:wip => :extract_fixtures) do |t|
|
16
|
+
t.cucumber_opts = '--tags @wip'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
task :default => [:spec, :cucumber]
|
data/bin/prodder
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
Feature: Commiting updated dumps to a project's repository
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given a prodder config in "prodder.yml" with project: blog
|
5
|
+
And a "blog" git repository
|
6
|
+
And I successfully run `prodder init -c prodder.yml`
|
7
|
+
And I successfully run `prodder dump -c prodder.yml`
|
8
|
+
|
9
|
+
Scenario: Structure, seed, quality_checks, permissions and settings files not yet tracked
|
10
|
+
When I run `prodder commit -c prodder.yml`
|
11
|
+
Then 1 commit by "prodder auto-commit" should be in the "blog" repository
|
12
|
+
And the file "db/structure.sql" should now be tracked
|
13
|
+
And the file "db/seeds.sql" should now be tracked
|
14
|
+
And the file "db/quality_checks.sql" should now be tracked
|
15
|
+
And the file "db/permissions.sql" should now be tracked
|
16
|
+
And the file "db/settings.sql" should now be tracked
|
17
|
+
|
18
|
+
Scenario: No changes to any file
|
19
|
+
When I run `prodder commit -c prodder.yml`
|
20
|
+
Then 1 commit by "prodder auto-commit" should be in the "blog" repository
|
21
|
+
When I run `prodder dump -c prodder.yml`
|
22
|
+
And I run `prodder commit -c prodder.yml`
|
23
|
+
Then 1 commit by "prodder auto-commit" should be in the "blog" repository
|
24
|
+
|
25
|
+
Scenario: Changes only to the structure
|
26
|
+
When I run `prodder commit -c prodder.yml`
|
27
|
+
Then 1 commit by "prodder auto-commit" should be in the "blog" repository
|
28
|
+
When I create a new table "linkbacks" in the "blog" database
|
29
|
+
And I run `prodder dump -c prodder.yml`
|
30
|
+
And I run `prodder commit -c prodder.yml`
|
31
|
+
And 2 commits by "prodder auto-commit" should be in the "blog" repository
|
32
|
+
And the latest commit should have changed "db/structure.sql" to contain "CREATE TABLE linkbacks"
|
33
|
+
And the latest commit should not have changed "db/seeds.sql"
|
34
|
+
And the latest commit should not have changed "db/quality_checks.sql"
|
35
|
+
|
36
|
+
Scenario: Changes only to the seed file
|
37
|
+
When I run `prodder commit -c prodder.yml`
|
38
|
+
Then 1 commit by "prodder auto-commit" should be in the "blog" repository
|
39
|
+
When I add a new author "Marley" to the "blog" database
|
40
|
+
And I run `prodder dump -c prodder.yml`
|
41
|
+
And I run `prodder commit -c prodder.yml`
|
42
|
+
Then 2 commits by "prodder auto-commit" should be in the "blog" repository
|
43
|
+
And the latest commit should have changed "db/seeds.sql" to contain "Marley"
|
44
|
+
And the latest commit should not have changed "db/structure.sql"
|
45
|
+
And the latest commit should not have changed "db/quality_checks.sql"
|
46
|
+
|
47
|
+
Scenario: Changes to both
|
48
|
+
When I run `prodder commit -c prodder.yml`
|
49
|
+
Then 1 commit by "prodder auto-commit" should be in the "blog" repository
|
50
|
+
When I create a new table "captchas" in the "blog" database
|
51
|
+
And I add a new author "Bob McBobbington" to the "blog" database
|
52
|
+
And I run `prodder dump -c prodder.yml`
|
53
|
+
And I run `prodder commit -c prodder.yml`
|
54
|
+
Then 2 commits by "prodder auto-commit" should be in the "blog" repository
|
55
|
+
And the latest commit should have changed "db/structure.sql" to contain "CREATE TABLE captchas"
|
56
|
+
And the latest commit should have changed "db/seeds.sql" to contain "Bob McBobbington"
|
57
|
+
And the latest commit should not have changed "db/quality_checks.sql"
|
58
|
+
|
59
|
+
Scenario: Changes only to permissions
|
60
|
+
When I run `prodder commit -c prodder.yml`
|
61
|
+
Then 1 commit by "prodder auto-commit" should be in the "blog" repository
|
62
|
+
When I create a new table "gotchas" in the "blog" database
|
63
|
+
When I grant all permissions on table "gotchas" in the "blog" database to "prodder"
|
64
|
+
And I run `prodder dump -c prodder.yml`
|
65
|
+
And I run `prodder commit -c prodder.yml`
|
66
|
+
And 2 commits by "prodder auto-commit" should be in the "blog" repository
|
67
|
+
And the latest commit should have changed "db/permissions.sql" to contain "GRANT ALL ON TABLE gotchas TO prodder"
|
68
|
+
And the latest commit should not have changed "db/seeds.sql"
|
69
|
+
And the latest commit should not have changed "db/quality_checks.sql"
|
@@ -0,0 +1,187 @@
|
|
1
|
+
Feature: prodder dump
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given a prodder config in "prodder.yml" with project: blog
|
5
|
+
|
6
|
+
Scenario: Happy path: dump structure.sql, listed seed tables, quality_checks.sql, permissions.sql and settings.sql
|
7
|
+
When I run `prodder dump -c prodder.yml`
|
8
|
+
Then the exit status should be 0
|
9
|
+
And the workspace file "blog/db/structure.sql" should match /CREATE TABLE posts/
|
10
|
+
And the workspace file "blog/db/structure.sql" should match /CREATE TABLE authors/
|
11
|
+
And the workspace file "blog/db/seeds.sql" should match /COPY posts/
|
12
|
+
And the workspace file "blog/db/seeds.sql" should match /COPY authors/
|
13
|
+
And the workspace file "blog/db/quality_checks.sql" should match /SET search_path/
|
14
|
+
And the workspace file "blog/db/quality_checks.sql" should match /CREATE TRIGGER /
|
15
|
+
And the workspace file "blog/db/permissions.sql" should match /GRANT /
|
16
|
+
And the workspace file "blog/db/settings.sql" should match /ALTER DATABASE /
|
17
|
+
|
18
|
+
Scenario: Include specified users, exclude other login roles from permissions dump
|
19
|
+
When I run `prodder dump -c prodder.yml`
|
20
|
+
Then the exit status should be 0
|
21
|
+
And the workspace file "blog/db/permissions.sql" should not match /exclude_this/
|
22
|
+
And the workspace file "blog/db/permissions.sql" should match /include_this/
|
23
|
+
|
24
|
+
Scenario: Roles missing ACL must be created, modified and granted if they're granted to non-login/included users
|
25
|
+
When I run `prodder dump -c prodder.yml`
|
26
|
+
Then the exit status should be 0
|
27
|
+
And the workspace file "blog/db/permissions.sql" should match /create_role_if_not_exists\('prodder__blog_prod:read_only'\);/
|
28
|
+
And the workspace file "blog/db/permissions.sql" should match /ALTER ROLE "prodder__blog_prod:read_only" WITH NOSUPERUSER/
|
29
|
+
And the workspace file "blog/db/permissions.sql" should match /GRANT "prodder__blog_prod:read_only" TO "prodder"/
|
30
|
+
|
31
|
+
Scenario: Roles are created smartly based on connected components in structure
|
32
|
+
When I run `prodder dump -c prodder.yml`
|
33
|
+
Then the exit status should be 0
|
34
|
+
And the workspace file "blog/db/permissions.sql" should not match /create_role_if_not_exists\('_92b'\);/
|
35
|
+
And the workspace file "blog/db/permissions.sql" should not match /create_role_if_not_exists\('_93b'\);/
|
36
|
+
And the workspace file "blog/db/permissions.sql" should not match /ALTER ROLE "_92b" WITH/
|
37
|
+
And the workspace file "blog/db/permissions.sql" should not match /ALTER ROLE "_93b" WITH/
|
38
|
+
And the workspace file "blog/db/permissions.sql" should not match /GRANT "_92b" TO "_93b"/
|
39
|
+
|
40
|
+
#TODO: Not sure how to test this
|
41
|
+
Scenario: All loginable (are there other kinds?) superusers are dumped
|
42
|
+
#TODO: Not sure how to test this
|
43
|
+
Scenario: Exhaustively test ACL
|
44
|
+
|
45
|
+
Scenario: Valid until option is quoted
|
46
|
+
When I run `prodder dump -c prodder.yml`
|
47
|
+
Then the exit status should be 0
|
48
|
+
And the workspace file "blog/db/permissions.sql" should match /VALID UNTIL '.*'/
|
49
|
+
|
50
|
+
Scenario: Exclude passwords from permissions dump
|
51
|
+
When I run `prodder dump -c prodder.yml`
|
52
|
+
Then the exit status should be 0
|
53
|
+
And the workspace file "blog/db/permissions.sql" should not match /PASSWORD '.*'/
|
54
|
+
|
55
|
+
Scenario: Roles are created if not existing instead of always being created
|
56
|
+
When I run `prodder dump -c prodder.yml`
|
57
|
+
Then the exit status should be 0
|
58
|
+
And the workspace file "blog/db/permissions.sql" should not match /CREATE ROLE \S*;/
|
59
|
+
And the workspace file "blog/db/permissions.sql" should match /create_role_if_not_exists\(.*\)/
|
60
|
+
|
61
|
+
Scenario: Exclude permissions dump if file missing
|
62
|
+
Given the prodder config in "prodder.yml" does not include a permissions file for the "blog" project
|
63
|
+
When I run `prodder dump -c prodder.yml`
|
64
|
+
Then the exit status should be 0
|
65
|
+
Then the workspace file "blog/db/permissions.sql" should not exist
|
66
|
+
|
67
|
+
Scenario: Exclude permissions dump if permissions object is missing
|
68
|
+
Given the prodder config in "prodder.yml" does not include permissions for the "blog" project
|
69
|
+
When I run `prodder dump -c prodder.yml`
|
70
|
+
Then the exit status should be 0
|
71
|
+
Then the workspace file "blog/db/permissions.sql" should not exist
|
72
|
+
|
73
|
+
Scenario Outline: Exhaustively test role creation and altering
|
74
|
+
When I run `prodder dump -c prodder.yml`
|
75
|
+
Then the exit status should be 0
|
76
|
+
And the workspace file "blog/db/permissions.sql" should match /<role_creation>/
|
77
|
+
And the workspace file "blog/db/permissions.sql" should match /<role_altering>/
|
78
|
+
|
79
|
+
Examples:
|
80
|
+
| role_creation | role_altering |
|
81
|
+
| prodder | ALTER ROLE "prodder" WITH NOSUPERUSER |
|
82
|
+
| prodder__blog_prod:read_only | ALTER ROLE "prodder__blog_prod:read_only" WITH NOSUPERUSER |
|
83
|
+
| include_this | ALTER ROLE "include_this" WITH NOSUPERUSER |
|
84
|
+
| _90enva | ALTER ROLE "_90enva" WITH NOSUPERUSER |
|
85
|
+
| _91b | ALTER ROLE "_91b" WITH NOSUPERUSER |
|
86
|
+
| _91qa | ALTER ROLE "_91qa" WITH NOSUPERUSER |
|
87
|
+
| _91se | ALTER ROLE "_91se" WITH NOSUPERUSER |
|
88
|
+
| _92qa | ALTER ROLE "_92qa" WITH NOSUPERUSER |
|
89
|
+
| _92se | ALTER ROLE "_92se" WITH NOSUPERUSER |
|
90
|
+
| _93se | ALTER ROLE "_93se" WITH NOSUPERUSER |
|
91
|
+
| _94se | ALTER ROLE "_94se" WITH NOSUPERUSER |
|
92
|
+
|prodder__blog_prod:permissions_test:read_only|ALTER ROLE "prodder__blog_prod:permissions_test:read_only" WITH NOSUPERUSER|
|
93
|
+
|prodder__blog_prod:permissions_test:read_only|ALTER ROLE "prodder__blog_prod:permissions_test:read_write" WITH NOSUPERUSER|
|
94
|
+
|
95
|
+
Scenario Outline: Exhaustively test memeberships
|
96
|
+
When I run `prodder dump -c prodder.yml`
|
97
|
+
Then the exit status should be 0
|
98
|
+
And the workspace file "blog/db/permissions.sql" should match /<membership>/
|
99
|
+
|
100
|
+
Examples:
|
101
|
+
| membership |
|
102
|
+
| GRANT "prodder__blog_prod:permissions_test:read_write" TO "include_this" |
|
103
|
+
| GRANT "prodder__blog_prod:read_only" TO "prodder" |
|
104
|
+
| GRANT "prodder__blog_prod:permissions_test:read_only" TO "prodder__blog_prod:read_only" |
|
105
|
+
| GRANT "_90enva" TO "_91se" |
|
106
|
+
| GRANT "_90enva" TO "_91qa" |
|
107
|
+
| GRANT "_90enva" TO "_91b" |
|
108
|
+
| GRANT "_91se" TO "_92se" |
|
109
|
+
| GRANT "_91qa" TO "_92se" |
|
110
|
+
| GRANT "_91qa" TO "_92qa" |
|
111
|
+
| GRANT "_91b" TO "_92qa" |
|
112
|
+
| GRANT "_91qa" TO "_94se" |
|
113
|
+
| GRANT "_92se" TO "_93se" |
|
114
|
+
| GRANT "_93se" TO "_94se" |
|
115
|
+
|
116
|
+
Scenario: Exclude specified tables from structure dump
|
117
|
+
Given the prodder config in "prodder.yml" excludes the table "authors" from the dump of "blog"
|
118
|
+
When I run `prodder dump -c prodder.yml`
|
119
|
+
Then the exit status should be 0
|
120
|
+
And the workspace file "blog/db/structure.sql" should not match /CREATE TABLE authors/
|
121
|
+
|
122
|
+
Scenario: Verify settings file contents
|
123
|
+
Given I add a customer parameter "c.p" with value "v" in the "blog" project's database
|
124
|
+
When I run `prodder dump -c prodder.yml`
|
125
|
+
Then the workspace file "blog/db/settings.sql" should match /ALTER DATABASE prodder__blog_prod SET c.p=v/
|
126
|
+
|
127
|
+
Scenario: Exclude specified schemas from structure dump
|
128
|
+
Given the prodder config in "prodder.yml" excludes the schema "ads" from the dump of "blog"
|
129
|
+
And I add a "ads" schema to the "blog" project's database
|
130
|
+
When I run `prodder dump -c prodder.yml`
|
131
|
+
Then the exit status should be 0
|
132
|
+
And the workspace file "blog/db/structure.sql" should not match /CREATE SCHEMA ads/
|
133
|
+
|
134
|
+
Scenario: Unspecified tables are not dumped to seeds
|
135
|
+
When I run `prodder dump -c prodder.yml`
|
136
|
+
Then the exit status should be 0
|
137
|
+
And the workspace file "blog/db/seeds.sql" should not match /COPY comments/
|
138
|
+
|
139
|
+
Scenario: Grant/revoke/ownership are not in the structure dump
|
140
|
+
When I run `prodder dump -c prodder.yml`
|
141
|
+
Then the workspace file "blog/db/structure.sql" should not match /GRANT/
|
142
|
+
And the workspace file "blog/db/structure.sql" should not match /ALTER TABLE.*OWNER TO/
|
143
|
+
|
144
|
+
Scenario: Ownership is not in the seeds dump
|
145
|
+
When I run `prodder dump -c prodder.yml`
|
146
|
+
Then the workspace file "blog/db/seeds.sql" should match /Owner: -/
|
147
|
+
And the workspace file "blog/db/seeds.sql" should not match /Owner: [^-]/
|
148
|
+
|
149
|
+
Scenario: Verify quality_checks file contents
|
150
|
+
Given I add a foreign key from table "posts" and column "author_id" to table "authors" and column "author_id" in the "blog" project's database
|
151
|
+
When I run `prodder dump -c prodder.yml`
|
152
|
+
Then the workspace file "blog/db/quality_checks.sql" should match /ADD CONSTRAINT .* FOREIGN KEY/
|
153
|
+
Given I add an index to table "posts" on column "author_id" in the "blog" project's database
|
154
|
+
When I run `prodder dump -c prodder.yml`
|
155
|
+
Then the workspace file "blog/db/quality_checks.sql" should match /CREATE INDEX /
|
156
|
+
|
157
|
+
Scenario: Maintaining quality checks directly in the structure file
|
158
|
+
Given the prodder config in "prodder.yml" does not include a quality check file for the "blog" project
|
159
|
+
And I add a foreign key from table "posts" and column "author_id" to table "authors" and column "author_id" in the "blog" project's database
|
160
|
+
When I run `prodder dump -c prodder.yml`
|
161
|
+
Then the workspace file "blog/db/quality_checks.sql" should not exist
|
162
|
+
And the workspace file "blog/db/structure.sql" should match /ADD CONSTRAINT .* FOREIGN KEY/
|
163
|
+
|
164
|
+
Scenario: Projects can use a YAML file to specify their seed tables
|
165
|
+
Given the prodder config in "prodder.yml" says to read the "blog" seed tables from "db/seeds.yml"
|
166
|
+
And the "blog" file "db/seeds.yml" contains:
|
167
|
+
"""
|
168
|
+
- posts
|
169
|
+
"""
|
170
|
+
When I run `prodder dump -c prodder.yml`
|
171
|
+
Then the exit status should be 0
|
172
|
+
And the workspace file "blog/db/seeds.sql" should match /COPY posts/
|
173
|
+
But the workspace file "blog/db/seeds.sql" should not match /COPY authors/
|
174
|
+
|
175
|
+
Scenario: YAML file listing seed tables does not exist
|
176
|
+
Given the prodder config in "prodder.yml" says to read the "blog" seed tables from "db/seeds.yml"
|
177
|
+
But the "blog" file "db/seeds.yml" does not exist
|
178
|
+
When I run `prodder dump -c prodder.yml`
|
179
|
+
Then the exit status should be 1
|
180
|
+
And the output should contain "No such file: blog/db/seeds.yml"
|
181
|
+
|
182
|
+
@restore-perms
|
183
|
+
Scenario: pg_dump failed
|
184
|
+
Given the "prodder" role can not read from the "blog" database's tables
|
185
|
+
When I run `prodder dump -c prodder.yml`
|
186
|
+
Then the exit status should be 1
|
187
|
+
And the output should contain "permission denied"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Feature: prodder init
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given a prodder config in "prodder.yml" with project: blog
|
5
|
+
And a "blog" git repository
|
6
|
+
|
7
|
+
Scenario: Clone a project
|
8
|
+
When I run `prodder init -c prodder.yml`
|
9
|
+
Then the exit status should be 0
|
10
|
+
And a directory named "prodder-workspace/blog" should exist
|
11
|
+
And the workspace file "blog/README" should match /Read me/
|
12
|
+
|
13
|
+
Scenario: Update pre-existing repository on re-initializing
|
14
|
+
Given I run `prodder init -c prodder.yml`
|
15
|
+
And a new commit is already in the "blog" git repository
|
16
|
+
When I run `prodder init -c prodder.yml`
|
17
|
+
Then the new commit should be in the workspace copy of the "blog" repository
|
18
|
+
|
19
|
+
Scenario: Can't clone repository (no such repo, permissions, whatever)
|
20
|
+
Given I deleted the "blog" git repository
|
21
|
+
When I run `prodder init -c prodder.yml`
|
22
|
+
Then the exit status should be 1
|
23
|
+
And the output should contain "Failed to run 'git clone ./repos/blog"
|
24
|
+
And the output should match /repository.*does not exist/
|
@@ -0,0 +1,46 @@
|
|
1
|
+
Feature: Configuration lint
|
2
|
+
In order to simplify later error handling and hopefully provide
|
3
|
+
rapid feedback on configuration issues, the config file is always
|
4
|
+
run through a linting process to ensure sanity before any other
|
5
|
+
operations are performed.
|
6
|
+
|
7
|
+
See spec/config_spec for a more detailed test of linting. This
|
8
|
+
test only ensures that the CLI reports lint failures reasonably.
|
9
|
+
|
10
|
+
Background:
|
11
|
+
Given a prodder config in "prodder.yml" with project: store
|
12
|
+
And no-op versions of these bins are available on my PATH: pg_dump, git
|
13
|
+
|
14
|
+
Scenario: One of the required project config keys is missing
|
15
|
+
But the "store/db/name" key is missing from "prodder.yml"
|
16
|
+
When I run `prodder ls -c prodder.yml`
|
17
|
+
Then the exit status should be 1
|
18
|
+
And the output should contain:
|
19
|
+
"""
|
20
|
+
Missing required configuration key: store/db/name
|
21
|
+
|
22
|
+
Example configuration:
|
23
|
+
"""
|
24
|
+
And the output should contain the example config contents
|
25
|
+
|
26
|
+
Scenario: pg_dump is not available
|
27
|
+
Given "pg_dump" is not available on my PATH
|
28
|
+
When I run `prodder ls -c prodder.yml`
|
29
|
+
Then the exit status should be 1
|
30
|
+
And the output should contain:
|
31
|
+
"""
|
32
|
+
`pg_dump` could not be found on your $PATH.
|
33
|
+
|
34
|
+
Current PATH:
|
35
|
+
"""
|
36
|
+
|
37
|
+
Scenario: git is not available
|
38
|
+
Given "git" is not available on my PATH
|
39
|
+
When I run `prodder ls -c prodder.yml`
|
40
|
+
Then the exit status should be 1
|
41
|
+
And the output should contain:
|
42
|
+
"""
|
43
|
+
`git` could not be found on your $PATH.
|
44
|
+
|
45
|
+
Current PATH:
|
46
|
+
"""
|
@@ -0,0 +1,76 @@
|
|
1
|
+
Feature: Basic CLI usage
|
2
|
+
|
3
|
+
Scenario: prodder help
|
4
|
+
When I run `prodder help`
|
5
|
+
Then the output should contain "Tasks:"
|
6
|
+
|
7
|
+
Scenario: No config file supplied
|
8
|
+
When I run `prodder`
|
9
|
+
Then the output should contain "required option '--config'"
|
10
|
+
|
11
|
+
Scenario: Config file not found
|
12
|
+
When I run `prodder init -c not-there.yml`
|
13
|
+
Then the output should contain exactly "Config file not found: not-there.yml\n"
|
14
|
+
And the exit status should be 1
|
15
|
+
|
16
|
+
Scenario: Malformed config file
|
17
|
+
Given a file named "broken.yml" with:
|
18
|
+
"""
|
19
|
+
%this IS NOT VALID YAML
|
20
|
+
"""
|
21
|
+
When I run `prodder init -c broken.yml`
|
22
|
+
Then the output should contain:
|
23
|
+
"""
|
24
|
+
Invalid YAML in config file broken.yml. Current file contents:
|
25
|
+
|
26
|
+
%this IS NOT VALID YAML
|
27
|
+
"""
|
28
|
+
|
29
|
+
Scenario: No database defined on project
|
30
|
+
Given a file named "prodder.yml" with:
|
31
|
+
"""
|
32
|
+
blog:
|
33
|
+
structure_file: db/structure.sql
|
34
|
+
seed_file: db/seeds.sql
|
35
|
+
quality_check_file: db/quality_checks.sql
|
36
|
+
git:
|
37
|
+
origin: git@github.com:pd/blog.git
|
38
|
+
author: prodder auto-commit <pd+prodder@krh.me>
|
39
|
+
"""
|
40
|
+
When I run `prodder dump blog -c prodder.yml`
|
41
|
+
Then the output should contain:
|
42
|
+
"""
|
43
|
+
Missing required configuration key: blog/db
|
44
|
+
|
45
|
+
Example configuration:
|
46
|
+
blog:
|
47
|
+
structure_file: db/structure.sql
|
48
|
+
seed_file: db/seeds.sql
|
49
|
+
quality_check_file: db/quality_checks.sql
|
50
|
+
git:
|
51
|
+
origin: git@github.com:your/repo.git
|
52
|
+
author: prodder <prodder@example.com>
|
53
|
+
db:
|
54
|
+
name: database_name
|
55
|
+
host: database.server.example.com
|
56
|
+
user: username
|
57
|
+
password: password
|
58
|
+
tables:
|
59
|
+
- posts
|
60
|
+
- authors
|
61
|
+
"""
|
62
|
+
|
63
|
+
Scenario: Projects named not defined in config file
|
64
|
+
Given a prodder config in "prodder.yml" with project: store
|
65
|
+
When I run `prodder init blog api -c prodder.yml`
|
66
|
+
Then the output should contain "Project not defined: blog, api"
|
67
|
+
|
68
|
+
Scenario: Listing projects
|
69
|
+
Given a prodder config in "prodder.yml" with projects: store, blog
|
70
|
+
When I run `prodder ls -c prodder.yml`
|
71
|
+
Then the output should contain exactly:
|
72
|
+
"""
|
73
|
+
store
|
74
|
+
blog
|
75
|
+
|
76
|
+
"""
|
@@ -0,0 +1,25 @@
|
|
1
|
+
Feature: prodder push
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given a prodder config in "prodder.yml" with project: blog
|
5
|
+
And a "blog" git repository
|
6
|
+
And I successfully run `prodder init -c prodder.yml`
|
7
|
+
And I successfully run `prodder dump -c prodder.yml`
|
8
|
+
And I successfully run `prodder commit -c prodder.yml`
|
9
|
+
|
10
|
+
Scenario: Changes are pushed upstream
|
11
|
+
When I successfully run `prodder push -c prodder.yml`
|
12
|
+
Then the exit status should be 0
|
13
|
+
Then the new commit should be in the remote repository
|
14
|
+
|
15
|
+
Scenario: Push fails due to permissions
|
16
|
+
Given the "blog" git repository does not allow pushing to it
|
17
|
+
When I run `prodder push -c prodder.yml`
|
18
|
+
Then the exit status should be 1
|
19
|
+
And the output should contain "insufficient permission"
|
20
|
+
|
21
|
+
Scenario: Push fails due to non-fast-forward
|
22
|
+
Given a new commit is already in the "blog" git repository
|
23
|
+
When I run `prodder push -c prodder.yml`
|
24
|
+
Then the exit status should be 1
|
25
|
+
And the output should contain "Refusing to push to remote"
|