mimoco 0.3.2 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1d005db7d29601313d32a107b3e0f4c5c2a97cf57458208c48f3647b8504310f
4
- data.tar.gz: 6e2eadc55c6d207ca53b5dfc1208093ca5099c731fcf8ccbaca700a6d4736cac
3
+ metadata.gz: 1796b354edbe98b20ea8aadfdf251b0c9729741df6960747cd68e678996d7451
4
+ data.tar.gz: d21b500b222ec94c01425d329bac0bbf2182492baaceffdd4d20a52d685576f7
5
5
  SHA512:
6
- metadata.gz: eb42f23837494c9c0811b94d95304d01364394d396de5e58338b5aa1025fdfbacb8bdddfc71398612e641ebc2f5d41bded49ac578cff36eb7afecf26476932b1
7
- data.tar.gz: 41eb22c914323da8eb91b72111c0bccad4a8c7f1f86ce1ba399c8ddf3656e8219631a25a34e19788fb12973265cfd352496366b44d631c4b74f3cc85f668a556
6
+ metadata.gz: 37dd105bd461a6538047de9c27f046e46881474abebf878094b5e6c8567a52e1210d8f5ad0a8ca4f7530f80d40c291f831ddb80e8c01b8fbfa9728a62099a2d6
7
+ data.tar.gz: 134215525e99400306ae22f85f28a021fa47a91a37f7dc74ee712080635f19a9396edfa01766be4f2d087be1273f1c36eaf3e7c39339587efac14c5fd3fb035a
@@ -8,19 +8,18 @@ jobs:
8
8
  strategy:
9
9
  fail-fast: false
10
10
  matrix:
11
- os: [ubuntu-latest]
12
- ruby: ["2.7", "3.0", "3.2", head]
13
- test_command: ["bundle exec rake test"]
14
- runs-on: ${{ matrix.os }}
11
+ ruby: ["3.0", "3.2", 3.3]
12
+ gemfile:
13
+ - Gemfile
14
+ # - gemfiles/Gemfile.rails-7.1
15
+ runs-on: ubuntu-latest
15
16
 
16
17
  steps:
17
- - uses: actions/checkout@v3
18
- - uses: ruby/setup-ruby@v1
19
- with:
20
- ruby-version: ${{ matrix.ruby }}
21
- - name: Bundle install
22
- run: |
23
- bundle config path /home/runner/bundle
24
- bundle install
25
- bundle update
26
- - run: ${{ matrix.test_command }}
18
+ - uses: actions/checkout@v3
19
+ - name: Set up Ruby
20
+ uses: ruby/setup-ruby@v1
21
+ with:
22
+ ruby-version: ${{ matrix.ruby_version }}
23
+ bundler-cache: true
24
+ - name: Build and test with Rake
25
+ run: bundle exec rake
data/.gitignore CHANGED
@@ -1,9 +1,10 @@
1
1
  .bundle/
2
2
  coverage/
3
- .watchr
4
3
 
5
4
  *.gem
6
5
  *.log
7
6
  *.lock
8
7
 
9
- **/db/*.sqlite3
8
+ **/db/test.sqlite3*
9
+ /test/internal/storage/
10
+ /test/internal/tmp/
data/.ruby-gemset CHANGED
@@ -1 +1 @@
1
- rails-7.0
1
+ rails-7.1
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-3.2.2
1
+ ruby-3.3.0
data/README.md CHANGED
@@ -73,9 +73,21 @@ class ControllersTest < ActionDispatch::IntegrationTest
73
73
  end
74
74
  ```
75
75
 
76
+ ## Parameter
77
+
78
+ Rails magic adds a few additional methods to a model or a controller
79
+ (e.g. #column_headers).
80
+
81
+ MiMoCo ignores them, but future versions of Rails may add more.
82
+ They can be ignored by:
83
+
84
+ ```ruby
85
+ check_models models, ignore_methods: magic_method
86
+ ...
87
+ check_controllers controllers, ignore_methods: %i[magic2 magic3]
88
+ ```
89
+
76
90
  ## Miscellaneous
77
91
 
78
92
  Copyright (c) 2022-2023 Dittmar Krall (www.matiq.com),
79
- released under the MIT license:
80
-
81
- * https://opensource.org/licenses/MIT
93
+ released under the [MIT license](https://opensource.org/licenses/MIT).
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mimoco
4
- VERSION = "0.3.2" # 2023-04-25
4
+ VERSION = "1.0.1" # 2024-02-16
5
+ # VERSION = "1.0.0" # 2023-12-06
6
+ # VERSION = "0.3.2" # 2023-04-25
5
7
  # VERSION = "0.3.1" # 2022-12-25
6
8
  # VERSION = "0.3.0" # 2022-02-11
7
9
  # VERSION = "0.2.0" # 2022-01-06
data/lib/mimoco.rb CHANGED
@@ -1,140 +1,20 @@
1
1
  require "minitest"
2
+ require "mimoco_base"
3
+ require "mimoco_valid"
4
+ require "mimoco_models"
5
+ require "mimoco_controllers"
2
6
 
3
7
  module Minitest
4
8
  module Checks
5
- def check_models(data)
6
- Models.run data, self
9
+ def check_models(data, ignore_methods: nil)
10
+ Models.run data, self, ignore_methods
7
11
  end
8
12
 
9
- def check_controllers(data)
10
- Controllers.run data, self
13
+ def check_controllers(data, ignore_methods: nil)
14
+ Controllers.run data, self, ignore_methods
11
15
  end
12
16
 
13
17
  class ValidMissingError < StandardError; end
14
-
15
- class Base
16
- attr_accessor :minitest, :klass, :klass_hash, :where
17
-
18
- def self.run(data, minitest)
19
- @minitest = minitest
20
- data.each do |klass, hash|
21
- @klass = klass
22
- @klass_hash = hash
23
- hash.each do |function, value|
24
- @where = "#{klass}##{function}"
25
- send(function, value)
26
- end
27
- end
28
- end
29
-
30
- def self.check_equal(expected, actual, msg = nil)
31
- expected = expected.sort.map(&:to_sym)
32
- actual = actual.sort.map(&:to_sym)
33
- msg = msg ? "#{@where}: #{msg}" : @where
34
- @minitest.assert_equal expected, actual, msg
35
- end
36
-
37
- def self.check_no_nil(actual, msg = nil)
38
- msg = msg ? "#{@where}: #{msg}" : @where
39
- @minitest.refute_nil actual, msg
40
- end
41
- end
42
-
43
- class Models < Base
44
- def self.valid(params)
45
- valids([params])
46
- end
47
-
48
- def self.valids(arr)
49
- arr.each { |params| one_valid(params) }
50
- end
51
-
52
- def self.invalid(params)
53
- invalids([params])
54
- end
55
-
56
- def self.invalids(arr)
57
- arr.each { |params| one_invalid(params) }
58
- end
59
-
60
- def self.class_methods(expected)
61
- cls = @klass.methods(false).sort
62
- cls.delete_if { |x| /^_/ =~ x }
63
- cls.delete_if { |x| /^(after|before|find_by)_/ =~ x }
64
- cls -= %i[column_headers attribute_type_decorations
65
- attributes_to_define_after_schema_loads
66
- default_scope_override defined_enums]
67
- check_equal expected, cls
68
- end
69
-
70
- # call class methods; don't check result
71
- def self.call_class_methods(methods)
72
- methods.each { |meth|
73
- check_no_nil @klass.send(meth), "<#{meth}> should return no nil"
74
- }
75
- end
76
-
77
- def self.public_methods(expected)
78
- cls = @klass.public_instance_methods(false).sort
79
- cls.delete_if { |x| /.*_associated_records_.*/ =~ x }
80
- # validate_associated_records_for_projects]
81
- check_equal expected, cls
82
- end
83
-
84
- # call_public_methods; don't check result
85
- def self.call_public_methods(methods)
86
- klass_params = @klass_hash[:valid] || @klass_hash[:valids]&.first
87
- raise ValidMissingError unless klass_params
88
-
89
- methods.each { |meth|
90
- row, _msg = @klass.create(klass_params)
91
- check_no_nil row.send(meth), "<#{meth}> should return no nil"
92
- }
93
- end
94
-
95
- def self.one_valid(params)
96
- row, msg = create_model(params)
97
- @minitest.assert row.valid?, "#{msg} #{row.errors.full_messages}"
98
- end
99
-
100
- def self.one_invalid(params)
101
- row, msg = create_model(params)
102
- @minitest.refute row.valid?, "#{msg} expected to be invalid"
103
- end
104
-
105
- def self.create_model(params)
106
- row = @klass.create(params)
107
- [row, "#{@klass}: #{params}"]
108
- end
109
- end
110
-
111
- class Controllers < Base
112
- def self.respond_to(methods)
113
- instance = @klass.new
114
- methods.each { |method|
115
- msg = "#{@klass} should respond to #{method}"
116
- @minitest.assert instance.respond_to?(method), msg
117
- }
118
- end
119
-
120
- def self.class_methods(expected)
121
- cls = @klass.methods(false).sort
122
- cls.delete_if { |x| /^_/ =~ x }
123
- cls -= %i[__callbacks helpers_path middleware_stack]
124
- check_equal expected, cls
125
- end
126
-
127
- def self.call_class_methods(methods)
128
- methods.each { |meth|
129
- check_no_nil @klass.send(meth), "<#{meth}> should return no nil"
130
- }
131
- end
132
-
133
- def self.public_methods(expected)
134
- cls = @klass.new.public_methods(false).sort
135
- check_equal expected, cls
136
- end
137
- end
138
18
  end
139
19
 
140
20
  class Test
@@ -0,0 +1,48 @@
1
+ require "minitest"
2
+
3
+ module Minitest
4
+ module Checks
5
+ class Base
6
+ attr_accessor :minitest, :klass, :klass_hash, :where
7
+
8
+ def self.run(data, minitest, ignore_methods)
9
+ @minitest = minitest
10
+ @ignore = [ignore_methods].flatten
11
+ data.each do |klass, hash|
12
+ @klass = klass
13
+ @klass_hash = hash
14
+ hash.each do |function, value|
15
+ @where = "#{klass}##{function}"
16
+ send(function, value)
17
+ end
18
+ end
19
+ end
20
+
21
+ def self.check_equal(expected, actual, msg = nil)
22
+ expected = expected.sort.map(&:to_sym)
23
+ actual = actual.sort.map(&:to_sym)
24
+ msg = msg ? "#{@where}: #{msg}" : @where
25
+ @minitest.assert_equal expected, actual, msg
26
+ end
27
+
28
+ def self.check_no_nil(actual, msg = nil)
29
+ msg = msg ? "#{@where}: #{msg}" : @where
30
+ @minitest.refute_nil actual, msg
31
+ end
32
+
33
+ def self.delete_methods(which)
34
+ ignore2 = %i[attribute_aliases
35
+ attributes_to_define_after_schema_loads column_headers
36
+ default_scope_override]
37
+ # cls -= %i[__callbacks helpers_path middleware_stack]
38
+ # cls -= %i[attribute_type_decorations defined_enums]
39
+ methods = @klass.send(which, false).sort
40
+ methods.delete_if { |x| /^_/ =~ x }
41
+ methods.delete_if { |x| /^(after|before|find_by)_/ =~ x }
42
+ methods.delete_if { |x| /.*_associated_records_.*/ =~ x }
43
+ methods2 = @klass.superclass.send(which, false).sort
44
+ methods - methods2 - @ignore - ignore2
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,31 @@
1
+ require "minitest"
2
+
3
+ module Minitest
4
+ module Checks
5
+ class Controllers < Base
6
+ def self.respond_to(methods)
7
+ instance = @klass.new
8
+ methods.each { |method|
9
+ msg = "#{@klass} should respond to #{method}"
10
+ @minitest.assert instance.respond_to?(method), msg
11
+ }
12
+ end
13
+
14
+ def self.class_methods(expected)
15
+ meths = delete_methods(:methods)
16
+ check_equal expected, meths
17
+ end
18
+
19
+ def self.call_class_methods(methods)
20
+ methods.each { |meth|
21
+ check_no_nil @klass.send(meth), "<#{meth}> should return no nil"
22
+ }
23
+ end
24
+
25
+ def self.public_methods(expected)
26
+ cls = @klass.new.public_methods(false).sort
27
+ check_equal expected, cls
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,36 @@
1
+ require "minitest"
2
+
3
+ module Minitest
4
+ module Checks
5
+ class Models < Base
6
+ def self.class_methods(expected)
7
+ meths = delete_methods(:methods)
8
+ check_equal expected, meths
9
+ end
10
+
11
+ # call class methods; don't check result
12
+ def self.call_class_methods(methods)
13
+ methods.each { |meth|
14
+ check_no_nil @klass.send(meth), "<#{meth}> should return no nil"
15
+ }
16
+ end
17
+
18
+ def self.public_methods(expected)
19
+ meths = delete_methods(:public_instance_methods)
20
+ check_equal expected, meths
21
+ end
22
+
23
+ # call_public_methods; don't check result
24
+ def self.call_public_methods(methods)
25
+ klass_params = @klass_hash[:valid] || @klass_hash[:valids]&.first
26
+ raise ValidMissingError unless klass_params
27
+
28
+ methods.each { |meth|
29
+ # row, _msg = @klass.create(klass_params)
30
+ row = @klass.new(klass_params)
31
+ check_no_nil row.send(meth), "<#{meth}> should return no nil"
32
+ }
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,39 @@
1
+ require "minitest"
2
+
3
+ module Minitest
4
+ module Checks
5
+ class Models < Base
6
+ def self.valid(params)
7
+ valids([params])
8
+ end
9
+
10
+ def self.valids(arr)
11
+ arr.each { |params| one_valid(params) }
12
+ end
13
+
14
+ def self.invalid(params)
15
+ invalids([params])
16
+ end
17
+
18
+ def self.invalids(arr)
19
+ arr.each { |params| one_invalid(params) }
20
+ end
21
+
22
+ def self.one_valid(params)
23
+ row, msg = create_model(params)
24
+ @minitest.assert row.valid?, "#{msg} #{row.errors.full_messages}"
25
+ end
26
+
27
+ def self.one_invalid(params)
28
+ row, msg = create_model(params)
29
+ @minitest.refute row.valid?, "#{msg} expected to be invalid"
30
+ end
31
+
32
+ def self.create_model(params)
33
+ # row = @klass.create(params)
34
+ row = @klass.new(params)
35
+ [row, "#{@klass}: #{params}"]
36
+ end
37
+ end
38
+ end
39
+ end
data/mimoco.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
10
10
  s.description = "Some testing for models and controllers"
11
11
  s.authors = ["Dittmar Krall"]
12
12
  s.email = ["dittmar.krall@matiq.com"]
13
- s.homepage = "http://matiq.com"
13
+ s.homepage = "https://github.com/matique/mimoco"
14
14
  s.license = "MIT"
15
15
 
16
16
  s.metadata["source_code_uri"] = "https://github.com/matique/mimoco"
@@ -1,3 +1,2 @@
1
1
  class ApplicationController < ActionController::Base
2
- protect_from_forgery with: :exception
3
2
  end
@@ -5,12 +5,12 @@ class OrdersController < ApplicationController
5
5
  "just for testing purposes"
6
6
  end
7
7
 
8
- # GET /orders or /orders.json
8
+ # GET /orders
9
9
  def index
10
10
  @orders = Order.all
11
11
  end
12
12
 
13
- # GET /orders/1 or /orders/1.json
13
+ # GET /orders/1
14
14
  def show
15
15
  end
16
16
 
@@ -23,41 +23,30 @@ class OrdersController < ApplicationController
23
23
  def edit
24
24
  end
25
25
 
26
- # POST /orders or /orders.json
26
+ # POST /orders
27
27
  def create
28
28
  @order = Order.new(order_params)
29
29
 
30
- respond_to do |format|
31
- if @order.save
32
- format.html { redirect_to @order, notice: "Order was successfully created." }
33
- format.json { render :show, status: :created, location: @order }
34
- else
35
- format.html { render :new, status: :unprocessable_entity }
36
- format.json { render json: @order.errors, status: :unprocessable_entity }
37
- end
30
+ if @order.save
31
+ redirect_to @order, notice: "Order was successfully created."
32
+ else
33
+ render :new, status: :unprocessable_entity
38
34
  end
39
35
  end
40
36
 
41
- # PATCH/PUT /orders/1 or /orders/1.json
37
+ # PATCH/PUT /orders/1
42
38
  def update
43
- respond_to do |format|
44
- if @order.update(order_params)
45
- format.html { redirect_to @order, notice: "Order was successfully updated." }
46
- format.json { render :show, status: :ok, location: @order }
47
- else
48
- format.html { render :edit, status: :unprocessable_entity }
49
- format.json { render json: @order.errors, status: :unprocessable_entity }
50
- end
39
+ if @order.update(order_params)
40
+ redirect_to @order, notice: "Order was successfully updated.", status: :see_other
41
+ else
42
+ render :edit, status: :unprocessable_entity
51
43
  end
52
44
  end
53
45
 
54
- # DELETE /orders/1 or /orders/1.json
46
+ # DELETE /orders/1
55
47
  def destroy
56
- @order.destroy
57
- respond_to do |format|
58
- format.html { redirect_to orders_url, notice: "Order was successfully destroyed." }
59
- format.json { head :no_content }
60
- end
48
+ @order.destroy!
49
+ redirect_to orders_url, notice: "Order was successfully destroyed.", status: :see_other
61
50
  end
62
51
 
63
52
  private
@@ -0,0 +1,34 @@
1
+ require "test_helper"
2
+ require "mimoco"
3
+
4
+ class ModelsIgnoreTest < Minitest::Test
5
+ def test_no_ignore_class_methods
6
+ models = {Order => {class_methods: %i[class_method]}}
7
+ check_models models
8
+ end
9
+
10
+ def test_ignore_class_methods
11
+ models = {Order => {class_methods: %i[]}}
12
+ check_models models, ignore_methods: :class_method
13
+ end
14
+
15
+ def test_no_ignore_public_methods
16
+ models = {Order => {public_methods: %i[public_method]}}
17
+ check_models models
18
+ end
19
+
20
+ def test_ignore_public_methods
21
+ models = {Order => {public_methods: %i[]}}
22
+ check_models models, ignore_methods: :public_method
23
+ end
24
+
25
+ def test_controllers_no_ignore_class_methods
26
+ controllers = {OrdersController => {class_methods: %i[class_method]}}
27
+ check_controllers controllers
28
+ end
29
+
30
+ def test_controllers_ignore_class_methods
31
+ controllers = {OrdersController => {class_methods: %i[]}}
32
+ check_controllers controllers, ignore_methods: :class_method
33
+ end
34
+ end
@@ -2,40 +2,6 @@ require "test_helper"
2
2
  require "mimoco"
3
3
 
4
4
  class ModelsTest < Minitest::Test
5
- def test_valid
6
- models = {Order => {valid: {name: "Name", qty: 123}}}
7
- check_models models
8
- end
9
-
10
- def test_valids
11
- models = {
12
- Order => {
13
- valids: [
14
- {name: "Name", qty: 123},
15
- {qty: 123}
16
- ]
17
- }
18
- }
19
- check_models models
20
- end
21
-
22
- def test_invalid
23
- models = {Order => {invalid: {qty: :abc}}}
24
- check_models models
25
- end
26
-
27
- def test_invalids
28
- models = {
29
- Order => {
30
- invalids: [
31
- {qty: :abc},
32
- {name: "Name", qty: :def}
33
- ]
34
- }
35
- }
36
- check_models models
37
- end
38
-
39
5
  def test_class_methods
40
6
  models = {Order => {class_methods: %i[class_method]}}
41
7
  check_models models
@@ -0,0 +1,38 @@
1
+ require "test_helper"
2
+ require "mimoco"
3
+
4
+ class ModelsTest < Minitest::Test
5
+ def test_valid
6
+ models = {Order => {valid: {name: "Name", qty: 123}}}
7
+ check_models models
8
+ end
9
+
10
+ def test_valids
11
+ models = {
12
+ Order => {
13
+ valids: [
14
+ {name: "Name", qty: 123},
15
+ {qty: 123}
16
+ ]
17
+ }
18
+ }
19
+ check_models models
20
+ end
21
+
22
+ def test_invalid
23
+ models = {Order => {invalid: {qty: :abc}}}
24
+ check_models models
25
+ end
26
+
27
+ def test_invalids
28
+ models = {
29
+ Order => {
30
+ invalids: [
31
+ {qty: :abc},
32
+ {name: "Name", qty: :def}
33
+ ]
34
+ }
35
+ }
36
+ check_models models
37
+ end
38
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mimoco
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dittmar Krall
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-25 00:00:00.000000000 Z
11
+ date: 2024-02-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: combustion
@@ -69,6 +69,10 @@ files:
69
69
  - Rakefile
70
70
  - lib/mimoco.rb
71
71
  - lib/mimoco/version.rb
72
+ - lib/mimoco_base.rb
73
+ - lib/mimoco_controllers.rb
74
+ - lib/mimoco_models.rb
75
+ - lib/mimoco_valid.rb
72
76
  - mimoco.gemspec
73
77
  - test/controllers/controllers_test.rb
74
78
  - test/controllers/orders_controller_test.rb
@@ -78,20 +82,19 @@ files:
78
82
  - test/internal/app/models/order.rb
79
83
  - test/internal/app/views/orders/_form.html.erb
80
84
  - test/internal/app/views/orders/_order.html.erb
81
- - test/internal/app/views/orders/_order.json.jbuilder
82
85
  - test/internal/app/views/orders/edit.html.erb
83
86
  - test/internal/app/views/orders/index.html.erb
84
- - test/internal/app/views/orders/index.json.jbuilder
85
87
  - test/internal/app/views/orders/new.html.erb
86
88
  - test/internal/app/views/orders/show.html.erb
87
- - test/internal/app/views/orders/show.json.jbuilder
88
89
  - test/internal/config/database.yml
89
90
  - test/internal/config/routes.rb
90
91
  - test/internal/db/migrate/20141016161801_create_orders.rb
91
92
  - test/internal/db/schema.rb
93
+ - test/models/models_ignore_test.rb
92
94
  - test/models/models_test.rb
95
+ - test/models/models_valid_test.rb
93
96
  - test/test_helper.rb
94
- homepage: http://matiq.com
97
+ homepage: https://github.com/matique/mimoco
95
98
  licenses:
96
99
  - MIT
97
100
  metadata:
@@ -111,7 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
111
114
  - !ruby/object:Gem::Version
112
115
  version: '0'
113
116
  requirements: []
114
- rubygems_version: 3.4.10
117
+ rubygems_version: 3.5.6
115
118
  signing_key:
116
119
  specification_version: 4
117
120
  summary: 'Mimoco: some minitests for models and controllers'
@@ -1,2 +0,0 @@
1
- json.extract! order, :id, :name, :created_at, :updated_at
2
- json.url order_url(order, format: :json)
@@ -1 +0,0 @@
1
- json.array! @orders, partial: "orders/order", as: :order
@@ -1 +0,0 @@
1
- json.partial! "orders/order", order: @order