test_data 0.0.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 (93) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/CHANGELOG.md +2 -0
  4. data/Gemfile +10 -0
  5. data/Gemfile.lock +104 -0
  6. data/LICENSE.txt +25 -0
  7. data/README.md +35 -0
  8. data/Rakefile +11 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +8 -0
  11. data/example/.gitattributes +8 -0
  12. data/example/.gitignore +24 -0
  13. data/example/Gemfile +19 -0
  14. data/example/Gemfile.lock +211 -0
  15. data/example/README.md +24 -0
  16. data/example/Rakefile +6 -0
  17. data/example/app/assets/config/manifest.js +2 -0
  18. data/example/app/assets/stylesheets/application.css +15 -0
  19. data/example/app/controllers/application_controller.rb +2 -0
  20. data/example/app/controllers/boops_controller.rb +10 -0
  21. data/example/app/helpers/application_helper.rb +2 -0
  22. data/example/app/models/application_record.rb +3 -0
  23. data/example/app/models/boop.rb +2 -0
  24. data/example/app/views/boops/index.html.erb +8 -0
  25. data/example/app/views/layouts/application.html.erb +15 -0
  26. data/example/bin/bundle +114 -0
  27. data/example/bin/rails +4 -0
  28. data/example/bin/rake +4 -0
  29. data/example/bin/setup +33 -0
  30. data/example/config.ru +6 -0
  31. data/example/config/application.rb +35 -0
  32. data/example/config/boot.rb +4 -0
  33. data/example/config/credentials.yml.enc +1 -0
  34. data/example/config/database.yml +86 -0
  35. data/example/config/environment.rb +5 -0
  36. data/example/config/environments/development.rb +60 -0
  37. data/example/config/environments/production.rb +96 -0
  38. data/example/config/environments/test.rb +49 -0
  39. data/example/config/initializers/application_controller_renderer.rb +8 -0
  40. data/example/config/initializers/backtrace_silencers.rb +8 -0
  41. data/example/config/initializers/content_security_policy.rb +28 -0
  42. data/example/config/initializers/cookies_serializer.rb +5 -0
  43. data/example/config/initializers/filter_parameter_logging.rb +6 -0
  44. data/example/config/initializers/inflections.rb +16 -0
  45. data/example/config/initializers/mime_types.rb +4 -0
  46. data/example/config/initializers/permissions_policy.rb +11 -0
  47. data/example/config/initializers/wrap_parameters.rb +14 -0
  48. data/example/config/locales/en.yml +33 -0
  49. data/example/config/puma.rb +43 -0
  50. data/example/config/routes.rb +5 -0
  51. data/example/db/migrate/20210417143158_create_boops.rb +7 -0
  52. data/example/db/schema.rb +21 -0
  53. data/example/db/seeds.rb +11 -0
  54. data/example/public/404.html +67 -0
  55. data/example/public/422.html +67 -0
  56. data/example/public/500.html +66 -0
  57. data/example/public/apple-touch-icon-precomposed.png +0 -0
  58. data/example/public/apple-touch-icon.png +0 -0
  59. data/example/public/favicon.ico +0 -0
  60. data/example/public/robots.txt +1 -0
  61. data/example/test/application_system_test_case.rb +5 -0
  62. data/example/test/fixtures/boops.yml +5 -0
  63. data/example/test/integration/basic_boops_test.rb +18 -0
  64. data/example/test/integration/migrated_boops_test.rb +7 -0
  65. data/example/test/integration/parallel_boops_with_fixtures_test.rb +11 -0
  66. data/example/test/integration/parallel_boops_without_fixtures_test.rb +11 -0
  67. data/example/test/integration/updated_boops_test.rb +7 -0
  68. data/example/test/test_helper.rb +41 -0
  69. data/lib/generators/test_data/database_yaml_generator.rb +24 -0
  70. data/lib/generators/test_data/environment_file_generator.rb +29 -0
  71. data/lib/generators/test_data/webpacker_yaml_generator.rb +26 -0
  72. data/lib/test_data.rb +20 -0
  73. data/lib/test_data/active_support_ext.rb +9 -0
  74. data/lib/test_data/config.rb +52 -0
  75. data/lib/test_data/configuration_verification.rb +3 -0
  76. data/lib/test_data/configurators.rb +11 -0
  77. data/lib/test_data/configurators/database_yaml.rb +24 -0
  78. data/lib/test_data/configurators/environment_file.rb +25 -0
  79. data/lib/test_data/configurators/webpacker_yaml.rb +38 -0
  80. data/lib/test_data/detects_database_emptiness.rb +17 -0
  81. data/lib/test_data/dumps_database.rb +49 -0
  82. data/lib/test_data/error.rb +4 -0
  83. data/lib/test_data/installs_configuration.rb +9 -0
  84. data/lib/test_data/loads_database_dumps.rb +45 -0
  85. data/lib/test_data/railtie.rb +12 -0
  86. data/lib/test_data/rake.rb +104 -0
  87. data/lib/test_data/transactional_data_loader.rb +77 -0
  88. data/lib/test_data/verifies_configuration.rb +14 -0
  89. data/lib/test_data/verifies_dumps_are_loadable.rb +37 -0
  90. data/lib/test_data/version.rb +3 -0
  91. data/script/test +49 -0
  92. data/test_data.gemspec +27 -0
  93. metadata +150 -0
@@ -0,0 +1,67 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ .rails-default-error-page {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ .rails-default-error-page div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ .rails-default-error-page div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ .rails-default-error-page h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ .rails-default-error-page div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body class="rails-default-error-page">
58
+ <!-- This file lives in public/422.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>The change you wanted was rejected.</h1>
62
+ <p>Maybe you tried to change something you didn't have access to.</p>
63
+ </div>
64
+ <p>If you are the application owner check the logs for more information.</p>
65
+ </div>
66
+ </body>
67
+ </html>
@@ -0,0 +1,66 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ .rails-default-error-page {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ .rails-default-error-page div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ .rails-default-error-page div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ .rails-default-error-page h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ .rails-default-error-page div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body class="rails-default-error-page">
58
+ <!-- This file lives in public/500.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>We're sorry, but something went wrong.</h1>
62
+ </div>
63
+ <p>If you are the application owner check the logs for more information.</p>
64
+ </div>
65
+ </body>
66
+ </html>
File without changes
File without changes
File without changes
@@ -0,0 +1 @@
1
+ # See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
@@ -0,0 +1,5 @@
1
+ require "test_helper"
2
+
3
+ class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
4
+ driven_by :selenium, using: :chrome, screen_size: [1400, 1400]
5
+ end
@@ -0,0 +1,5 @@
1
+ boop_1:
2
+ updated_at: '2020-01-01'
3
+
4
+ boop_2:
5
+ updated_at: '2019-01-01'
@@ -0,0 +1,18 @@
1
+ require "test_helper"
2
+
3
+ class BasicBoopsTest < SerializedNonTransactionalTestCase
4
+ i_suck_and_my_tests_are_order_dependent!
5
+
6
+ def test_contains_initially_seeded_boops
7
+ assert_equal 10, Boop.count
8
+ end
9
+
10
+ def test_adds_some_boops
11
+ 3.times { Boop.create! }
12
+ assert_equal 13, Boop.count
13
+ end
14
+
15
+ def test_back_to_the_original_number_of_seeded_boops
16
+ assert_equal 10, Boop.count
17
+ end
18
+ end
@@ -0,0 +1,7 @@
1
+ require "test_helper"
2
+
3
+ class MigratedBoopsTest < SerializedNonTransactionalTestCase
4
+ def test_dump_includes_manually_booped_boops_plus_new_beep_column
5
+ assert_equal 15, Boop.where(beep: true).count
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ require "test_helper"
2
+
3
+ class ParallelBoopsWithFixturesTest < ParallelizedTransactionalFixturefullTestCase
4
+ 100.times do |i|
5
+ test "that boops don't change ##{i}" do
6
+ assert_equal 12, Boop.count
7
+ Boop.create!
8
+ assert_equal 13, Boop.count
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require "test_helper"
2
+
3
+ class ParallelBoopsWithoutFixturesTest < ParallelizedNonTransactionalFixturelessTestCase
4
+ 100.times do |i|
5
+ test "that boops don't change ##{i}" do
6
+ assert_equal 10, Boop.count
7
+ Boop.create!
8
+ assert_equal 11, Boop.count
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ require "test_helper"
2
+
3
+ class UpdatedBoopsTest < SerializedNonTransactionalTestCase
4
+ def test_dump_includes_manually_booped_boops
5
+ assert_equal 15, Boop.count
6
+ end
7
+ end
@@ -0,0 +1,41 @@
1
+ ENV["RAILS_ENV"] ||= "test"
2
+ require_relative "../config/environment"
3
+ require "rails/test_help"
4
+
5
+ class SerializedNonTransactionalTestCase < ActiveSupport::TestCase
6
+ parallelize(workers: 1)
7
+ self.use_transactional_tests = false
8
+
9
+ def setup
10
+ TestData.load_data_dump
11
+ end
12
+
13
+ def teardown
14
+ TestData.rollback
15
+ end
16
+ end
17
+
18
+ class ParallelizedTransactionalFixturefullTestCase < ActiveSupport::TestCase
19
+ parallelize(workers: :number_of_processors)
20
+ self.use_transactional_tests = true
21
+ fixtures :all
22
+
23
+ def setup
24
+ TestData.load_data_dump
25
+ end
26
+
27
+ # use_transactional_tests will cause a single rollback on teardown
28
+ end
29
+
30
+ class ParallelizedNonTransactionalFixturelessTestCase < ActiveSupport::TestCase
31
+ parallelize(workers: :number_of_processors)
32
+ self.use_transactional_tests = false
33
+
34
+ def setup
35
+ TestData.load_data_dump
36
+ end
37
+
38
+ def teardown
39
+ TestData.rollback
40
+ end
41
+ end
@@ -0,0 +1,24 @@
1
+ require "rails/generators"
2
+
3
+ module TestData
4
+ class DatabaseYamlGenerator < Rails::Generators::Base
5
+ BEFORE_TEST_DATABASE_STANZA_REGEX = /^$\n(?:^\#.*\n)*^test:/
6
+
7
+ def call
8
+ if Configurators::DatabaseYaml.new.verify.looks_good?
9
+ warn "'test_data' section already defined in config/database.yml"
10
+ else
11
+ app_name = Rails.application.railtie_name.chomp("_application")
12
+ inject_into_file "config/database.yml", before: BEFORE_TEST_DATABASE_STANZA_REGEX do
13
+ <<~YAML
14
+
15
+ # Used in conjunction with the test_data gem
16
+ test_data:
17
+ <<: *default
18
+ database: #{app_name}_test_data
19
+ YAML
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,29 @@
1
+ require "rails/generators"
2
+
3
+ module TestData
4
+ class EnvironmentFileGenerator < Rails::Generators::Base
5
+ def call
6
+ create_file "config/environments/test_data.rb", <<~RUBY
7
+ require_relative "development"
8
+
9
+ TestData.config do |config|
10
+ # Where to store SQL dumps of the test_data database schema
11
+ # config.schema_dump_path = "test/support/test_data/schema.sql"
12
+
13
+ # Where to store SQL dumps of the test_data database test data
14
+ # config.data_dump_path = "test/support/test_data/data.sql"
15
+
16
+ # Where to store SQL dumps of the test_data database non-test data
17
+ # config.non_test_data_dump_path = "test/support/test_data/non_test_data.sql"
18
+
19
+ # Tables whose data shouldn't be loaded into tests
20
+ # config.non_test_data_tables = ["ar_internal_metadata", "schema_migrations"]
21
+ end
22
+
23
+ Rails.application.configure do
24
+ config.active_record.dump_schema_after_migration = false
25
+ end
26
+ RUBY
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,26 @@
1
+ require "rails/generators"
2
+
3
+ module TestData
4
+ class WebpackerYamlGenerator < Rails::Generators::Base
5
+ AFTER_DEVELOPMENT_WEBPACK_STANZA_REGEX = /^development:/
6
+ BEFORE_TEST_WEBPACK_STANZA_REGEX = /^$\n(?:^\#.*\n)*^test:/
7
+
8
+ def call
9
+ if Configurators::WebpackerYaml.new.verify.looks_good?
10
+ warn "'test_data' section not needed in config/webpacker.yml"
11
+ else
12
+ inject_into_file "config/webpacker.yml", after: AFTER_DEVELOPMENT_WEBPACK_STANZA_REGEX do
13
+ " &development"
14
+ end
15
+ inject_into_file "config/webpacker.yml", before: BEFORE_TEST_WEBPACK_STANZA_REGEX do
16
+ <<~YAML
17
+
18
+ # Used in conjunction with the test_data gem
19
+ test_data:
20
+ <<: *development
21
+ YAML
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
data/lib/test_data.rb ADDED
@@ -0,0 +1,20 @@
1
+ require_relative "test_data/active_support_ext"
2
+ require_relative "test_data/config"
3
+ require_relative "test_data/configuration_verification"
4
+ require_relative "test_data/configurators"
5
+ require_relative "test_data/configurators/environment_file"
6
+ require_relative "test_data/configurators/database_yaml"
7
+ require_relative "test_data/configurators/webpacker_yaml"
8
+ require_relative "test_data/detects_database_emptiness"
9
+ require_relative "test_data/dumps_database"
10
+ require_relative "test_data/error"
11
+ require_relative "test_data/installs_configuration"
12
+ require_relative "test_data/loads_database_dumps"
13
+ require_relative "test_data/railtie"
14
+ require_relative "test_data/transactional_data_loader"
15
+ require_relative "test_data/verifies_configuration"
16
+ require_relative "test_data/verifies_dumps_are_loadable"
17
+ require_relative "test_data/version"
18
+ require_relative "generators/test_data/environment_file_generator"
19
+ require_relative "generators/test_data/database_yaml_generator"
20
+ require_relative "generators/test_data/webpacker_yaml_generator"
@@ -0,0 +1,9 @@
1
+ require "active_support/environment_inquirer"
2
+
3
+ module ActiveSupport
4
+ class EnvironmentInquirer < StringInquirer
5
+ def test_data?
6
+ self == "test_data"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,52 @@
1
+ module TestData
2
+ def self.config(pwd: Rails.root, &blk)
3
+ @configuration ||= Configuration.new(pwd: pwd)
4
+
5
+ @configuration.tap do |config|
6
+ blk&.call(config)
7
+ end
8
+ end
9
+
10
+ class Configuration
11
+ # Where to save dumps of your test data's schema
12
+ attr_accessor :schema_dump_path
13
+
14
+ # Where to save dumps of your test data
15
+ attr_accessor :data_dump_path
16
+
17
+ # Where to save dumps of data needed by the test_data env but excluded from your tests
18
+ attr_accessor :non_test_data_dump_path
19
+
20
+ # Tables to exclude from test data dumps
21
+ attr_accessor :non_test_data_tables
22
+
23
+ attr_reader :pwd, :database_yaml_path
24
+
25
+ def self.full_path_reader(*relative_path_readers)
26
+ relative_path_readers.each do |relative_path_reader|
27
+ define_method(relative_path_reader.to_s.gsub(/_path$/, "_full_path")) do
28
+ "#{pwd}/#{send(relative_path_reader)}"
29
+ end
30
+ end
31
+ end
32
+
33
+ full_path_reader :schema_dump_path, :data_dump_path, :non_test_data_dump_path, :database_yaml_path
34
+
35
+ def initialize(pwd:)
36
+ @pwd = pwd
37
+ @schema_dump_path = "test/support/test_data/schema.sql"
38
+ @data_dump_path = "test/support/test_data/data.sql"
39
+ @non_test_data_dump_path = "test/support/test_data/non_test_data.sql"
40
+ @database_yaml_path = "config/database.yml"
41
+ @non_test_data_tables = ["ar_internal_metadata", "schema_migrations"]
42
+ end
43
+
44
+ def database_yaml
45
+ YAML.load_file(database_yaml_full_path)
46
+ end
47
+
48
+ def database_name
49
+ database_yaml.dig("test_data", "database")
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,3 @@
1
+ module TestData
2
+ ConfigurationVerification = Struct.new(:looks_good?, :problems, keyword_init: true)
3
+ end
@@ -0,0 +1,11 @@
1
+ module TestData
2
+ module Configurators
3
+ def self.all
4
+ [
5
+ EnvironmentFile,
6
+ DatabaseYaml,
7
+ WebpackerYaml
8
+ ].map(&:new)
9
+ end
10
+ end
11
+ end