Skip to content

Commit 4a7ad6a

Browse files
Lee Richmondrichmolj
authored andcommitted
Add filter_group to schema/diffing
Scenarios for diffing are best outlined in the spec, but should be anything that would cause a client to break (for instance adding to the group when all are required).
1 parent d370687 commit 4a7ad6a

File tree

4 files changed

+150
-0
lines changed

4 files changed

+150
-0
lines changed

lib/graphiti/schema.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@ def generate_resources
9999
relationships: relationships(r)
100100
}
101101

102+
if r.grouped_filters.any?
103+
config[:filter_group] = r.grouped_filters
104+
end
105+
102106
if r.default_sort
103107
default_sort = r.default_sort.map { |s|
104108
{s.keys.first.to_s => s.values.first.to_s}
@@ -212,6 +216,10 @@ def filters(resource)
212216
end
213217
end
214218

219+
def filter_group(resource)
220+
resource.config[:grouped_filters]
221+
end
222+
215223
def relationships(resource)
216224
{}.tap do |r|
217225
resource.sideloads.each_pair do |name, config|

lib/graphiti/schema_diff.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ def compare_resources
3030
compare_extra_attributes(r, new_resource)
3131
compare_sorts(r, new_resource)
3232
compare_filters(r, new_resource)
33+
compare_filter_group(r, new_resource)
3334
compare_relationships(r, new_resource)
3435
end
3536
end
@@ -204,6 +205,27 @@ def compare_filters(old_resource, new_resource)
204205
end
205206
end
206207

208+
def compare_filter_group(old_resource, new_resource)
209+
if new_resource[:filter_group]
210+
if old_resource[:filter_group]
211+
new_names = new_resource[:filter_group][:names]
212+
old_names = old_resource[:filter_group][:names]
213+
diff = new_names - old_names
214+
if !diff.empty? && new_resource[:filter_group][:required] == :all
215+
@errors << "#{old_resource[:name]}: all required filter group #{old_names.inspect} added #{"member".pluralize(diff.length)} #{diff.inspect}."
216+
end
217+
218+
old_required = old_resource[:filter_group][:required]
219+
new_required = new_resource[:filter_group][:required]
220+
if old_required == :any && new_required == :all
221+
@errors << "#{old_resource[:name]}: filter group #{old_names.inspect} moved from required: :any to required: :all"
222+
end
223+
else
224+
@errors << "#{old_resource[:name]}: filter group #{new_resource[:filter_group][:names].inspect} was added."
225+
end
226+
end
227+
end
228+
207229
def compare_endpoints
208230
@old[:endpoints].each_pair do |path, old_endpoint|
209231
unless (new_endpoint = @new[:endpoints][path])

spec/schema_diff_spec.rb

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -728,6 +728,112 @@ def self.name
728728
end
729729
end
730730

731+
context "when a filter group is added" do
732+
before do
733+
resource_b.filter_group [:first_name, :last_name], required: :any
734+
end
735+
736+
it "returns error" do
737+
expect(diff).to eq([
738+
"SchemaDiff::EmployeeResource: filter group [:first_name, :last_name] was added."
739+
])
740+
end
741+
end
742+
743+
context "when a filter group is removed" do
744+
before do
745+
resource_b
746+
resource_a.filter_group [:first_name, :last_name], required: :any
747+
end
748+
749+
it "has no errors" do
750+
expect(diff).to eq([])
751+
end
752+
end
753+
754+
context "when a filter group removes a name" do
755+
before do
756+
resource_b.filter_group [:last_name], required: :any
757+
resource_a.filter_group [:first_name, :last_name], required: :any
758+
end
759+
760+
it "has no errors" do
761+
expect(diff).to eq([])
762+
end
763+
end
764+
765+
context "when a filter group adds a name" do
766+
before do
767+
resource_b.filter_group [:first_name, :last_name], required: required
768+
resource_a.filter_group [:first_name], required: required
769+
end
770+
771+
context "and any are required" do
772+
let(:required) { :any }
773+
774+
it "has no errors" do
775+
expect(diff).to eq([])
776+
end
777+
end
778+
779+
context "and all are required" do
780+
let(:required) { :all }
781+
782+
it "returns error" do
783+
expect(diff).to eq([
784+
"SchemaDiff::EmployeeResource: all required filter group [:first_name] added member [:last_name]."
785+
])
786+
end
787+
end
788+
end
789+
790+
context "when a filter group removes a name" do
791+
before do
792+
resource_b.filter_group [:first_name], required: required
793+
resource_a.filter_group [:first_name, :last_name], required: required
794+
end
795+
796+
context "and any are required" do
797+
let(:required) { :any }
798+
799+
it "has no errors" do
800+
expect(diff).to eq([])
801+
end
802+
end
803+
804+
context "and all are required" do
805+
let(:required) { :all }
806+
807+
it "has no errors" do
808+
expect(diff).to eq([])
809+
end
810+
end
811+
end
812+
813+
context "when a filter group goes from :all to :any" do
814+
before do
815+
resource_b.filter_group [:first_name, :last_name], required: :any
816+
resource_a.filter_group [:first_name, :last_name], required: :all
817+
end
818+
819+
it "has no errors" do
820+
expect(diff).to eq([])
821+
end
822+
end
823+
824+
context "when a filter group goes from :any to :all" do
825+
before do
826+
resource_b.filter_group [:first_name, :last_name], required: :all
827+
resource_a.filter_group [:first_name, :last_name], required: :any
828+
end
829+
830+
it "returns error" do
831+
expect(diff).to eq([
832+
"SchemaDiff::EmployeeResource: filter group [:first_name, :last_name] moved from required: :any to required: :all"
833+
])
834+
end
835+
end
836+
731837
context "when filter goes unguarded to guarded" do
732838
before do
733839
resource_b.attribute :foo, :string, filterable: :admin?

spec/schema_spec.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,20 @@ def self.name
475475
end
476476
end
477477

478+
context "when a filter group" do
479+
before do
480+
employee_resource.filter_group [:first_name, :last_name],
481+
required: :any
482+
end
483+
484+
it "is present in the schema" do
485+
expect(schema[:resources][0][:filter_group]).to eq({
486+
names: [:first_name, :last_name],
487+
required: :any
488+
})
489+
end
490+
end
491+
478492
context "when the attribute is a string enum" do
479493
before do
480494
employee_resource.class_eval do

0 commit comments

Comments
 (0)