File tree Expand file tree Collapse file tree 2 files changed +45
-0
lines changed Expand file tree Collapse file tree 2 files changed +45
-0
lines changed Original file line number Diff line number Diff line change @@ -24,6 +24,18 @@ def full_messages
24
24
map { |attribute , message | full_message ( attribute , message ) }
25
25
end
26
26
27
+ # Allow ActiveSupport to render errors similar to ActiveModel::Errors
28
+ def as_json ( options = nil )
29
+ Hash . new . tap do |output |
30
+ raise NotImplementedError . new unless output . respond_to? ( :as_json )
31
+
32
+ self . each do |field , value |
33
+ output [ field ] ||= [ ]
34
+ output [ field ] << value
35
+ end
36
+ end . as_json ( options )
37
+ end
38
+
27
39
private
28
40
def full_message ( attribute , message )
29
41
return message if attribute == :base
Original file line number Diff line number Diff line change 68
68
end
69
69
end
70
70
71
+ describe "#as_json" do
72
+ it "raises a NotImplementedError" do
73
+ expect { errors . as_json } . to raise_error SimpleCommand ::NotImplementedError
74
+ end
75
+
76
+ context "when Hash supports as_json" do
77
+ module HashAsJsonMixin
78
+ # Mock example of as_json from ActiveSupport
79
+ def as_json ( options )
80
+ JSON . parse ( to_json ( options ) )
81
+ end
82
+ end
83
+
84
+ around do |example |
85
+ inject_required = !Hash . new . respond_to? ( :as_json )
86
+ Hash . include HashAsJsonMixin if inject_required
87
+ example . run
88
+ Hash . undef_method ( :as_json ) if inject_required
89
+ end
90
+
91
+ it "groups errors by key values" do
92
+ errors . add :attr1 , 'has an error'
93
+ errors . add :attr2 , 'has an error'
94
+ errors . add :attr2 , 'has two errors'
95
+
96
+ expect ( errors . as_json ) . to eq (
97
+ "attr1" => [ "has an error" ] ,
98
+ "attr2" => [ "has an error" , "has two errors" ]
99
+ )
100
+ end
101
+ end
102
+ end
103
+
71
104
describe "#to_json" do
72
105
it "groups errors by key values" do
73
106
errors . add :attr1 , 'has an error'
You can’t perform that action at this time.
0 commit comments