potassium 5.2.1 → 6.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +84 -0
- data/.gitignore +2 -1
- data/.node-version +1 -0
- data/.rubocop.yml +530 -0
- data/.ruby-version +1 -1
- data/CHANGELOG.md +91 -0
- data/README.md +41 -47
- data/docs/DSL.md +5 -5
- data/lib/potassium/assets/.buildpacks +0 -1
- data/lib/potassium/assets/.circleci/config.yml.erb +102 -0
- data/lib/potassium/assets/.eslintrc.json +352 -0
- data/lib/potassium/assets/.github/pull_request_template.md +9 -0
- data/lib/potassium/assets/.pryrc +1 -1
- data/lib/potassium/assets/.rubocop.yml +528 -0
- data/lib/potassium/assets/.stylelintrc.json +46 -0
- data/lib/potassium/assets/Dockerfile.ci +1 -1
- data/lib/potassium/assets/Makefile.erb +21 -32
- data/lib/potassium/assets/Procfile +1 -0
- data/lib/potassium/assets/README.yml +58 -11
- data/lib/potassium/assets/active_admin/admin-component.vue +35 -0
- data/lib/potassium/assets/active_admin/admin_application.js +14 -0
- data/lib/potassium/assets/active_admin/init_activeadmin_vue.rb +10 -0
- data/lib/potassium/assets/app/graphql/graphql_controller.rb +55 -0
- data/lib/potassium/assets/app/graphql/mutations/login_mutation.rb +23 -0
- data/lib/potassium/assets/app/graphql/queries/base_query.rb +4 -0
- data/lib/potassium/assets/app/graphql/types/base/base_argument.rb +4 -0
- data/lib/potassium/assets/app/graphql/types/base/base_enum.rb +4 -0
- data/lib/potassium/assets/app/graphql/types/base/base_field.rb +5 -0
- data/lib/potassium/assets/app/graphql/types/base/base_input_object.rb +5 -0
- data/lib/potassium/assets/app/graphql/types/base/base_interface.rb +7 -0
- data/lib/potassium/assets/app/graphql/types/base/base_object.rb +5 -0
- data/lib/potassium/assets/app/graphql/types/base/base_scalar.rb +4 -0
- data/lib/potassium/assets/app/graphql/types/base/base_union.rb +4 -0
- data/lib/potassium/assets/app/graphql/types/mutation_type.rb +10 -0
- data/lib/potassium/assets/app/graphql/types/query_type.rb +13 -0
- data/lib/potassium/assets/app/javascript/app.spec.js +14 -0
- data/lib/potassium/assets/app/uploaders/base_uploader.rb +11 -0
- data/lib/potassium/assets/app/uploaders/image_uploader.rb +5 -0
- data/lib/potassium/assets/app/views/shared/_gtm_body.html.erb +4 -0
- data/lib/potassium/assets/app/views/shared/_gtm_head.html.erb +7 -0
- data/lib/potassium/assets/bin/cibuild.erb +24 -7
- data/lib/potassium/assets/bin/release +9 -0
- data/lib/potassium/assets/bin/setup.erb +1 -1
- data/lib/potassium/assets/config/database_mysql.yml.erb +2 -2
- data/lib/potassium/assets/config/database_postgresql.yml.erb +2 -2
- data/lib/potassium/assets/config/graphql_playground.rb +20 -0
- data/lib/potassium/assets/config/puma.rb +1 -1
- data/lib/potassium/assets/config/shrine.rb +36 -0
- data/lib/potassium/assets/docker-compose.ci.yml +2 -1
- data/lib/potassium/assets/lib/tasks/auto_annotate_models.rake +34 -33
- data/lib/potassium/assets/package.json +4 -1
- data/lib/potassium/assets/redis.yml +1 -2
- data/lib/potassium/assets/testing/rails_helper.rb +4 -2
- data/lib/potassium/cli/commands/create.rb +12 -19
- data/lib/potassium/cli_options.rb +77 -26
- data/lib/potassium/helpers/gem-helpers.rb +1 -1
- data/lib/potassium/helpers/template-helpers.rb +4 -0
- data/lib/potassium/newest_version_ensurer.rb +19 -36
- data/lib/potassium/node_version_ensurer.rb +30 -0
- data/lib/potassium/recipes/admin.rb +3 -3
- data/lib/potassium/recipes/annotate.rb +1 -1
- data/lib/potassium/recipes/api.rb +93 -21
- data/lib/potassium/recipes/background_processor.rb +66 -19
- data/lib/potassium/recipes/ci.rb +6 -4
- data/lib/potassium/recipes/data_migrate.rb +44 -0
- data/lib/potassium/recipes/database.rb +4 -0
- data/lib/potassium/recipes/database_container.rb +7 -5
- data/lib/potassium/recipes/draper.rb +1 -10
- data/lib/potassium/recipes/file_storage.rb +66 -0
- data/lib/potassium/recipes/front_end.rb +219 -9
- data/lib/potassium/recipes/github.rb +93 -15
- data/lib/potassium/recipes/google_tag_manager.rb +90 -0
- data/lib/potassium/recipes/heroku.rb +44 -30
- data/lib/potassium/recipes/mailer.rb +27 -4
- data/lib/potassium/recipes/node.rb +21 -0
- data/lib/potassium/recipes/rack_cors.rb +18 -15
- data/lib/potassium/recipes/schedule.rb +17 -2
- data/lib/potassium/recipes/style.rb +21 -3
- data/lib/potassium/recipes/vue_admin.rb +124 -0
- data/lib/potassium/templates/application.rb +9 -7
- data/lib/potassium/version.rb +6 -4
- data/potassium.gemspec +11 -6
- data/spec/features/api_spec.rb +25 -0
- data/spec/features/background_processor_spec.rb +19 -6
- data/spec/features/data_migrate_spec.rb +14 -0
- data/spec/features/database_container_spec.rb +2 -5
- data/spec/features/draper_spec.rb +1 -6
- data/spec/features/file_storage_spec.rb +75 -0
- data/spec/features/front_end_spec.rb +88 -0
- data/spec/features/github_spec.rb +53 -8
- data/spec/features/google_tag_manager_spec.rb +59 -0
- data/spec/features/graphql_spec.rb +71 -0
- data/spec/features/heroku_spec.rb +8 -5
- data/spec/features/mailer_spec.rb +58 -0
- data/spec/features/new_project_spec.rb +6 -14
- data/spec/features/node_spec.rb +28 -0
- data/spec/features/power_types_spec.rb +5 -16
- data/spec/features/schedule_spec.rb +11 -4
- data/spec/features/vue_admin_spec.rb +47 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/support/fake_octokit.rb +31 -0
- data/spec/support/potassium_test_helpers.rb +26 -9
- data/tmp/.keep +0 -0
- metadata +157 -48
- data/circle.yml +0 -12
- data/lib/potassium/assets/.circleci/config.yml +0 -20
- data/lib/potassium/assets/active_admin/active_admin.js.coffee +0 -4
- data/lib/potassium/assets/active_admin/init_activeadmin_angular.rb +0 -8
- data/lib/potassium/assets/api/api_error_concern.rb +0 -32
- data/lib/potassium/assets/api/base_controller.rb +0 -9
- data/lib/potassium/assets/api/draper_responder.rb +0 -62
- data/lib/potassium/assets/api/responder.rb +0 -41
- data/lib/potassium/assets/aws.rb +0 -1
- data/lib/potassium/assets/sidekiq_scheduler.yml +0 -9
- data/lib/potassium/assets/testing/paperclip.rb +0 -59
- data/lib/potassium/recipes/active_storage.rb +0 -40
- data/lib/potassium/recipes/angular_admin.rb +0 -56
- data/lib/potassium/recipes/aws_sdk.rb +0 -7
- data/lib/potassium/recipes/paperclip.rb +0 -47
- data/spec/features/active_storage_spec.rb +0 -30
- data/spec/features/front_end.rb +0 -30
@@ -0,0 +1,75 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe "File Storage" do
|
4
|
+
context "when selecting active_storage" do
|
5
|
+
before :all do
|
6
|
+
drop_dummy_database
|
7
|
+
remove_project_directory
|
8
|
+
create_dummy_project(storage: :active_storage)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "adds the aws-sdk-s3 gem to Gemfile" do
|
12
|
+
gemfile_content = IO.read("#{project_path}/Gemfile")
|
13
|
+
expect(gemfile_content).to include("gem 'aws-sdk-s3'")
|
14
|
+
end
|
15
|
+
|
16
|
+
it "customizes config file" do
|
17
|
+
content = IO.read("#{project_path}/config/storage.yml")
|
18
|
+
expect(content).to include("bucket: <%= ENV['S3_BUCKET'] %>")
|
19
|
+
end
|
20
|
+
|
21
|
+
it "adds brief to README file" do
|
22
|
+
content = IO.read("#{project_path}/README.md")
|
23
|
+
expect(content).to include("Active Storage")
|
24
|
+
end
|
25
|
+
|
26
|
+
it "uses amazon on production env" do
|
27
|
+
content = IO.read("#{project_path}/config/environments/production.rb")
|
28
|
+
expect(content).to include("config.active_storage.service = :amazon")
|
29
|
+
end
|
30
|
+
|
31
|
+
it "adds S3 bucket ENV vars" do
|
32
|
+
content = IO.read("#{project_path}/.env.development")
|
33
|
+
expect(content).to include("S3_BUCKET=")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "when selecting shrine" do
|
38
|
+
before :all do
|
39
|
+
drop_dummy_database
|
40
|
+
remove_project_directory
|
41
|
+
create_dummy_project(storage: :shrine)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "adds the aws-sdk-s3, shrine and marcel gems to Gemfile" do
|
45
|
+
gemfile_content = IO.read("#{project_path}/Gemfile")
|
46
|
+
expect(gemfile_content).to include("gem 'aws-sdk-s3'")
|
47
|
+
expect(gemfile_content).to include("gem 'shrine'")
|
48
|
+
expect(gemfile_content).to include("gem 'marcel'")
|
49
|
+
end
|
50
|
+
|
51
|
+
it "adds brief to README file" do
|
52
|
+
content = IO.read("#{project_path}/README.md")
|
53
|
+
expect(content).to include("Shrine")
|
54
|
+
end
|
55
|
+
|
56
|
+
it "adds shrine initializer" do
|
57
|
+
expect(File.exist?("#{project_path}/config/initializers/shrine.rb")).to be true
|
58
|
+
end
|
59
|
+
|
60
|
+
it "adds base_uploader and image_uploader" do
|
61
|
+
expect(File.exist?("#{project_path}/app/uploaders/base_uploader.rb")).to be true
|
62
|
+
expect(File.exist?("#{project_path}/app/uploaders/image_uploader.rb")).to be true
|
63
|
+
end
|
64
|
+
|
65
|
+
it "adds S3 bucket ENV vars" do
|
66
|
+
content = IO.read("#{project_path}/.env.development")
|
67
|
+
expect(content).to include("S3_BUCKET=")
|
68
|
+
end
|
69
|
+
|
70
|
+
it "adds filestorage path to gitignore" do
|
71
|
+
content = IO.read("#{project_path}/.gitignore")
|
72
|
+
expect(content).to include("/public/uploads")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe "Front end" do
|
4
|
+
before :all do
|
5
|
+
drop_dummy_database
|
6
|
+
remove_project_directory
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:application_css_path) { "#{project_path}/app/javascript/css/application.css" }
|
10
|
+
let(:gemfile) { IO.read("#{project_path}/Gemfile") }
|
11
|
+
let(:node_modules_file) { IO.read("#{project_path}/package.json") }
|
12
|
+
let(:application_js_file) { IO.read("#{project_path}/app/javascript/packs/application.js") }
|
13
|
+
let(:layout_file) { IO.read("#{project_path}/app/views/layouts/application.html.erb") }
|
14
|
+
let(:application_css_file) { IO.read(application_css_path) }
|
15
|
+
let(:tailwind_config_file) { IO.read("#{project_path}/tailwind.config.js") }
|
16
|
+
let(:rails_css_file) { IO.read("#{project_path}/app/assets/stylesheets/application.css") }
|
17
|
+
|
18
|
+
it "creates a project without a front end framework" do
|
19
|
+
remove_project_directory
|
20
|
+
create_dummy_project("front_end" => "None")
|
21
|
+
expect(gemfile).to include('webpacker')
|
22
|
+
expect(File).not_to exist(application_css_path)
|
23
|
+
end
|
24
|
+
|
25
|
+
context "with vue" do
|
26
|
+
before(:all) do
|
27
|
+
remove_project_directory
|
28
|
+
create_dummy_project("front_end" => "vue")
|
29
|
+
end
|
30
|
+
|
31
|
+
it "creates a project with vue in compiler mode as frontend framework" do
|
32
|
+
expect(gemfile).to include('webpacker')
|
33
|
+
expect(node_modules_file).to include("\"vue\"")
|
34
|
+
expect(application_js_file).to include('vue/dist/vue.esm')
|
35
|
+
expect(application_js_file).to include("el: '#vue-app'")
|
36
|
+
expect(layout_file).to include('id="vue-app"')
|
37
|
+
end
|
38
|
+
|
39
|
+
it "creates a project with only one js pack tag" do
|
40
|
+
expect(layout_file.scan("javascript_pack_tag").length).to eq(1)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "creates a vue project with client css" do
|
44
|
+
expect(application_js_file).to include("import '../css/application.css';")
|
45
|
+
expect(layout_file).to include("<%= stylesheet_pack_tag 'application' %>")
|
46
|
+
expect(rails_css_file).not_to include('*= require_tree', '*= require_self')
|
47
|
+
end
|
48
|
+
|
49
|
+
it "creates a vue project with tailwindcss" do
|
50
|
+
expect(node_modules_file).to include("\"tailwindcss\"")
|
51
|
+
expect(application_css_file).to include(
|
52
|
+
"@import 'tailwindcss/base';",
|
53
|
+
"@import 'tailwindcss/components';"
|
54
|
+
)
|
55
|
+
expect(tailwind_config_file).to include('module.exports')
|
56
|
+
end
|
57
|
+
|
58
|
+
context "with graphql" do
|
59
|
+
before(:all) do
|
60
|
+
remove_project_directory
|
61
|
+
create_dummy_project("front_end" => "vue", "api" => "graphql")
|
62
|
+
end
|
63
|
+
|
64
|
+
it "creates a vue project with apollo" do
|
65
|
+
expect(node_modules_file).to include("\"vue-apollo\"")
|
66
|
+
expect(application_js_file).to include("import { ApolloClient } from 'apollo-client';")
|
67
|
+
expect(application_js_file).to include("Vue.use(VueApollo)")
|
68
|
+
expect(application_js_file).to include("apolloProvider,")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context "with angular" do
|
74
|
+
before(:all) do
|
75
|
+
remove_project_directory
|
76
|
+
create_dummy_project("front_end" => "angular")
|
77
|
+
end
|
78
|
+
|
79
|
+
it "creates a project without vue as front end framework" do
|
80
|
+
expect(gemfile).to include('webpacker')
|
81
|
+
expect(node_modules_file).to include("\"@angular/core\"")
|
82
|
+
end
|
83
|
+
|
84
|
+
it "creates application_js_file for tailwind without vue" do
|
85
|
+
expect(application_js_file).to include("import '../css/application.css';")
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -1,22 +1,67 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
RSpec.describe "GitHub" do
|
4
|
+
let(:org_name) { "platanus" }
|
5
|
+
let(:repo_name) { PotassiumTestHelpers::APP_NAME.dasherize }
|
6
|
+
let(:access_token) { "1234" }
|
7
|
+
let(:pr_template_file) { IO.read("#{project_path}/.github/pull_request_template.md") }
|
8
|
+
|
4
9
|
before do
|
5
10
|
drop_dummy_database
|
6
11
|
remove_project_directory
|
7
12
|
end
|
8
13
|
|
9
|
-
it "
|
10
|
-
create_dummy_project(
|
11
|
-
|
14
|
+
it "creates the github repository" do
|
15
|
+
create_dummy_project(
|
16
|
+
"github" => true,
|
17
|
+
"github_private" => false,
|
18
|
+
"github_has_org" => false,
|
19
|
+
"github_name" => repo_name,
|
20
|
+
"github_access_token" => access_token
|
21
|
+
)
|
22
|
+
|
23
|
+
expect(FakeOctokit).to have_created_repo(repo_name)
|
24
|
+
expect(pr_template_file).to include('Contexto')
|
25
|
+
end
|
26
|
+
|
27
|
+
it "creates the private github repository" do
|
28
|
+
create_dummy_project(
|
29
|
+
"github" => true,
|
30
|
+
"github_private" => true,
|
31
|
+
"github_has_org" => false,
|
32
|
+
"github_name" => repo_name,
|
33
|
+
"github_access_token" => access_token
|
34
|
+
)
|
35
|
+
|
36
|
+
expect(FakeOctokit).to have_created_private_repo(repo_name)
|
37
|
+
expect(pr_template_file).to include('Contexto')
|
38
|
+
end
|
39
|
+
|
40
|
+
it "creates the github repository for the organization" do
|
41
|
+
create_dummy_project(
|
42
|
+
"github" => true,
|
43
|
+
"github_private" => false,
|
44
|
+
"github_has_org" => true,
|
45
|
+
"github_org" => org_name,
|
46
|
+
"github_name" => repo_name,
|
47
|
+
"github_access_token" => access_token
|
48
|
+
)
|
12
49
|
|
13
|
-
expect(
|
50
|
+
expect(FakeOctokit).to have_created_repo_for_org(repo_name, org_name)
|
51
|
+
expect(pr_template_file).to include('Contexto')
|
14
52
|
end
|
15
53
|
|
16
|
-
it "
|
17
|
-
create_dummy_project(
|
18
|
-
|
54
|
+
it "creates the private github repository for the organization" do
|
55
|
+
create_dummy_project(
|
56
|
+
"github" => true,
|
57
|
+
"github_private" => true,
|
58
|
+
"github_has_org" => true,
|
59
|
+
"github_org" => org_name,
|
60
|
+
"github_name" => repo_name,
|
61
|
+
"github_access_token" => access_token
|
62
|
+
)
|
19
63
|
|
20
|
-
expect(
|
64
|
+
expect(FakeOctokit).to have_created_private_repo_for_org(repo_name, org_name)
|
65
|
+
expect(pr_template_file).to include('Contexto')
|
21
66
|
end
|
22
67
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe "Google Tag Manager" do
|
4
|
+
before :all do
|
5
|
+
remove_project_directory
|
6
|
+
create_dummy_project('google_tag_manager' => true)
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:gtm_head_file_path) do
|
10
|
+
"#{project_path}/app/views/shared/_gtm_head.html.erb"
|
11
|
+
end
|
12
|
+
let(:gtm_body_file_path) do
|
13
|
+
"#{project_path}/app/views/shared/_gtm_body.html.erb"
|
14
|
+
end
|
15
|
+
let(:content_security_policy_file_path) do
|
16
|
+
"#{project_path}/config/initializers/content_security_policy.rb"
|
17
|
+
end
|
18
|
+
let(:application_layout_file) do
|
19
|
+
IO.read("#{project_path}/app/views/layouts/application.html.erb")
|
20
|
+
end
|
21
|
+
let(:content_security_policy_file) do
|
22
|
+
IO.read(content_security_policy_file_path)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'adds google tag manager script' do
|
26
|
+
expect(File).to be_file(gtm_head_file_path)
|
27
|
+
expect(File).to be_file(gtm_body_file_path)
|
28
|
+
expect(application_layout_file).to include('shared/gtm_head')
|
29
|
+
expect(application_layout_file).to include('shared/gtm_body')
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'add content security policy' do
|
33
|
+
expect(content_security_policy_file)
|
34
|
+
.to include(content_security_policy_code)
|
35
|
+
end
|
36
|
+
|
37
|
+
def content_security_policy_code
|
38
|
+
<<~HERE
|
39
|
+
Rails.application.config.content_security_policy do |policy|
|
40
|
+
if Rails.env.development?
|
41
|
+
policy.connect_src :self, :https, 'http://localhost:3035', 'ws://localhost:3035'
|
42
|
+
policy.script_src :self, :https, :unsafe_eval
|
43
|
+
else
|
44
|
+
policy.script_src :self, :https
|
45
|
+
# google tag manager requires to enable unsafe inline:
|
46
|
+
# https://developers.google.com/tag-manager/web/csp
|
47
|
+
policy.connect_src :self, :https, 'https://www.google-analytics.com'
|
48
|
+
policy.script_src :self,
|
49
|
+
:https,
|
50
|
+
:unsafe_inline,
|
51
|
+
'https://www.googletagmanager.com',
|
52
|
+
'https://www.google-analytics.com',
|
53
|
+
'https://ssl.google-analytics.com'
|
54
|
+
policy.img_src :self, :https, 'https://www.googletagmanager.com', 'https://www.google-analytics.com'
|
55
|
+
end
|
56
|
+
end
|
57
|
+
HERE
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe "GraphQL" do
|
4
|
+
context 'when using only graphql' do
|
5
|
+
before :all do
|
6
|
+
drop_dummy_database
|
7
|
+
remove_project_directory
|
8
|
+
create_dummy_project("api" => :graphql)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "adds graphql related gems to Gemfile" do
|
12
|
+
gemfile_content = IO.read("#{project_path}/Gemfile")
|
13
|
+
expect(gemfile_content).to include("gem 'graphql'")
|
14
|
+
expect(gemfile_content).to include("gem 'graphql_playground-rails'")
|
15
|
+
expect(gemfile_content).not_to include("gem 'graphiql'")
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'installs and sets up graphql' do
|
19
|
+
schema = IO.read(
|
20
|
+
"#{project_path}/app/graphql/#{PotassiumTestHelpers::APP_NAME.dasherize.tr('-', '_')}_schema.rb"
|
21
|
+
)
|
22
|
+
expect(schema).to include(
|
23
|
+
"class #{PotassiumTestHelpers::APP_NAME.titleize.delete(' ')}Schema < GraphQL::Schema"
|
24
|
+
)
|
25
|
+
|
26
|
+
base_mutation = IO.read("#{project_path}/app/graphql/mutations/base_mutation.rb")
|
27
|
+
expect(base_mutation).to include('Types::Base::Base')
|
28
|
+
expect(base_mutation).not_to include('input_object_class')
|
29
|
+
expect(base_mutation).not_to include('RelayClassic')
|
30
|
+
|
31
|
+
controller = IO.read("#{project_path}/app/controllers/graphql_controller.rb")
|
32
|
+
expect(controller).to include('skip_before_action :verify_authenticity_token')
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'sets up graphql playground' do
|
36
|
+
routes = IO.read("#{project_path}/config/routes.rb")
|
37
|
+
expect(routes).to include(
|
38
|
+
'mount GraphqlPlayground::Rails::Engine, at: "/graphiql", graphql_path: "/graphql"'
|
39
|
+
)
|
40
|
+
config = IO.read("#{project_path}/config/initializers/graphql_playground.rb")
|
41
|
+
expect(config).to include('GraphqlPlayground::Rails.configure do |config|')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'when using authentication' do
|
46
|
+
before :all do
|
47
|
+
drop_dummy_database
|
48
|
+
remove_project_directory
|
49
|
+
create_dummy_project("api" => :graphql, "devise": true)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'gathers jwt gem' do
|
53
|
+
gemfile_content = IO.read("#{project_path}/Gemfile")
|
54
|
+
expect(gemfile_content).to include("gem 'jwt'")
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'Adds auth related mutation and controller' do
|
58
|
+
controller = IO.read("#{project_path}/app/controllers/graphql_controller.rb")
|
59
|
+
expect(controller).to include('get_current_user')
|
60
|
+
expect(controller).to include(
|
61
|
+
"#{PotassiumTestHelpers::APP_NAME.titleize.delete(' ')}Schema.execute"
|
62
|
+
)
|
63
|
+
|
64
|
+
mutation_type = IO.read("#{project_path}/app/graphql/types/mutation_type.rb")
|
65
|
+
expect(mutation_type).to include('field :login, mutation: Mutations::LoginMutation')
|
66
|
+
|
67
|
+
login_mutation = IO.read("#{project_path}/app/graphql/mutations/login_mutation.rb")
|
68
|
+
expect(login_mutation).to include('class Mutations::LoginMutation < Mutations::BaseMutation')
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -18,6 +18,7 @@ RSpec.describe "Heroku" do
|
|
18
18
|
procfile = IO.read(procfile_path)
|
19
19
|
|
20
20
|
expect(procfile).to include("web: bundle exec puma -C ./config/puma.rb")
|
21
|
+
expect(procfile).to include("release: bin/release")
|
21
22
|
|
22
23
|
buildpacks_path = "#{project_path}/.buildpacks"
|
23
24
|
buildpacks = IO.read(buildpacks_path)
|
@@ -25,20 +26,15 @@ RSpec.describe "Heroku" do
|
|
25
26
|
expect(buildpacks).to include("https://github.com/heroku/heroku-buildpack-nodejs")
|
26
27
|
expect(buildpacks).to include("https://github.com/platanus/heroku-buildpack-ruby-version.git")
|
27
28
|
expect(buildpacks).to include("https://github.com/heroku/heroku-buildpack-ruby.git")
|
28
|
-
expect(buildpacks).to(
|
29
|
-
include("https://github.com/gunpowderlabs/buildpack-ruby-rake-deploy-tasks.git")
|
30
|
-
)
|
31
29
|
|
32
30
|
expect(FakeHeroku).to have_created_app_for("staging")
|
33
31
|
expect(FakeHeroku).to have_created_app_for("production")
|
34
32
|
|
35
33
|
expect(FakeHeroku).to have_configured_vars("staging", "SECRET_KEY_BASE")
|
36
34
|
expect(FakeHeroku).to have_configured_vars("staging", "RACK_ENV")
|
37
|
-
expect(FakeHeroku).to have_configured_vars("staging", "DEPLOY_TASKS")
|
38
35
|
|
39
36
|
expect(FakeHeroku).to have_configured_vars("production", "SECRET_KEY_BASE")
|
40
37
|
expect(FakeHeroku).to have_configured_vars("production", "RACK_ENV")
|
41
|
-
expect(FakeHeroku).to have_configured_vars("production", "DEPLOY_TASKS")
|
42
38
|
|
43
39
|
expect(FakeHeroku).to have_created_pipeline_for("staging")
|
44
40
|
expect(FakeHeroku).to have_add_pipeline_for("production")
|
@@ -55,5 +51,12 @@ RSpec.describe "Heroku" do
|
|
55
51
|
expect(bin_setup_heroku).to include("heroku apps:info --app pl-#{app_name}-production")
|
56
52
|
expect(bin_setup_heroku).to include("git config heroku.remote staging")
|
57
53
|
expect(File.stat(bin_setup_path)).to be_executable
|
54
|
+
|
55
|
+
bin_release_path = "#{project_path}/bin/release"
|
56
|
+
bin_release = IO.read(bin_release_path)
|
57
|
+
|
58
|
+
expect(bin_release).to include('set -e')
|
59
|
+
expect(bin_release).to include('bundle exec rails db:migrate:with_data')
|
60
|
+
expect(File.stat(bin_release_path)).to be_executable
|
58
61
|
end
|
59
62
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe "Mailer" do
|
4
|
+
let(:gemfile) { IO.read("#{project_path}/Gemfile") }
|
5
|
+
let(:mailer_config) { IO.read("#{project_path}/config/mailer.rb") }
|
6
|
+
let(:dev_config) { IO.read("#{project_path}/config/environments/development.rb") }
|
7
|
+
let(:sidekiq_config) { IO.read("#{project_path}/config/sidekiq.yml") }
|
8
|
+
|
9
|
+
before(:all) { drop_dummy_database }
|
10
|
+
|
11
|
+
context "when selecting sendgrid as mailer" do
|
12
|
+
before(:all) do
|
13
|
+
remove_project_directory
|
14
|
+
create_dummy_project("email_service" => "sendgrid")
|
15
|
+
end
|
16
|
+
|
17
|
+
it { expect(gemfile).to include("send_grid_mailer") }
|
18
|
+
|
19
|
+
it "adds configuration to mailer.rb" do
|
20
|
+
expect(mailer_config).to include("delivery_method = :sendgrid")
|
21
|
+
expect(mailer_config).to include("sendgrid_settings = {")
|
22
|
+
expect(mailer_config).to include("api_key: ENV['SENDGRID_API_KEY']")
|
23
|
+
end
|
24
|
+
|
25
|
+
it "adds configuration to development.rb" do
|
26
|
+
expect(dev_config).to include("delivery_method = :sendgrid_dev")
|
27
|
+
expect(dev_config).to include("sendgrid_dev_settings = {")
|
28
|
+
expect(dev_config).to include("api_key: ENV['SENDGRID_API_KEY']")
|
29
|
+
end
|
30
|
+
|
31
|
+
it { expect(sidekiq_config).to include("- mailers") }
|
32
|
+
end
|
33
|
+
|
34
|
+
context "when selecting aws_ses as mailer" do
|
35
|
+
before(:all) do
|
36
|
+
remove_project_directory
|
37
|
+
create_dummy_project("email_service" => "aws_ses")
|
38
|
+
end
|
39
|
+
|
40
|
+
it { expect(gemfile).to include("aws-sdk-rails") }
|
41
|
+
it { expect(gemfile).to include("letter_opener") }
|
42
|
+
it { expect(mailer_config).to include("delivery_method = :aws_sdk") }
|
43
|
+
it { expect(dev_config).to include("delivery_method = :letter_opener") }
|
44
|
+
it { expect(sidekiq_config).to include("- mailers") }
|
45
|
+
end
|
46
|
+
|
47
|
+
context "when selecting a mailer and sidekiq" do
|
48
|
+
before :all do
|
49
|
+
drop_dummy_database
|
50
|
+
remove_project_directory
|
51
|
+
create_dummy_project(
|
52
|
+
"background_processor" => true, "email_service" => 'sendgrid'
|
53
|
+
)
|
54
|
+
end
|
55
|
+
|
56
|
+
it { expect(sidekiq_config).to include("- mailers") }
|
57
|
+
end
|
58
|
+
end
|