Skip to content

Commit

Permalink
Testing where_object and where_object_changes
Browse files Browse the repository at this point in the history
Minor improvements and additions to tests.

Trying to reproduce issue #803.
  • Loading branch information
jaredbeck committed Jul 9, 2017
1 parent b5500f1 commit b02be11
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 86 deletions.
1 change: 0 additions & 1 deletion .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,6 @@ unset BUNDLE_GEMFILE
cd ../..
# Run tests
DB=postgres bundle exec rake
DB=postgres bundle exec appraisal ar-5.0 rake
```

Expand Down
142 changes: 64 additions & 78 deletions spec/models/json_version_spec.rb
Original file line number Diff line number Diff line change
@@ -1,99 +1,85 @@
require "spec_helper"

# The `json_versions` table tests postgres' `json` data type. So, that
# table is only created when testing against postgres and ActiveRecord >= 4.
# table is only created when testing against postgres.
if JsonVersion.table_exists?
RSpec.describe JsonVersion, type: :model do
it "includes the VersionConcern module" do
expect(described_class).to include(PaperTrail::VersionConcern)
end

describe "Methods" do
describe "Class" do
describe "#where_object" do
it { expect(described_class).to respond_to(:where_object) }

it "escapes values" do
f = Fruit.create(name: "Bobby")
expect(
f.
versions.
where_object(name: "Robert'; DROP TABLE Students;--").
count
).to eq(0)
end

context "invalid arguments" do
it "raises an error" do
expect { described_class.where_object(:foo) }.to raise_error(ArgumentError)
expect { described_class.where_object([]) }.to raise_error(ArgumentError)
end
end

context "valid arguments", versioning: true do
let(:fruit_names) { %w[apple orange lemon banana lime coconut strawberry blueberry] }
let(:fruit) { Fruit.new }
let(:name) { "pomegranate" }
let(:color) { FFaker::Color.name }

before do
fruit.update_attributes!(name: name)
fruit.update_attributes!(name: fruit_names.sample, color: color)
fruit.update_attributes!(name: fruit_names.sample, color: FFaker::Color.name)
end
describe ".where_object" do
it "escapes values" do
f = Fruit.create(name: "Bobby")
expect {
f.
versions.
where_object(name: "Robert'; DROP TABLE Students;--").
count
}.not_to raise_error
end

it "locates versions according to their `object` contents" do
expect(described_class.where_object(name: name)).to eq([fruit.versions[1]])
expect(described_class.where_object(color: color)).to eq([fruit.versions[2]])
end
end
context "invalid argument (not a Hash)" do
it "raises an error" do
expect { described_class.where_object(:foo) }.to raise_error(ArgumentError)
expect { described_class.where_object([]) }.to raise_error(ArgumentError)
end
end

describe "#where_object_changes" do
it { expect(described_class).to respond_to(:where_object_changes) }
context "valid arguments", versioning: true do
it "locates versions according to their `object` contents" do
fruit_names = %w[apple orange lemon banana lime coconut strawberry blueberry]
fruit = Fruit.new
name = "pomegranate"
color = FFaker::Color.name
fruit.update_attributes!(name: name)
fruit.update_attributes!(name: fruit_names.sample, color: color)
fruit.update_attributes!(name: fruit_names.sample, color: FFaker::Color.name)
expect(described_class.where_object(name: name)).to eq([fruit.versions[1]])
expect(described_class.where_object(color: color)).to eq([fruit.versions[2]])
end
end
end

it "escapes values" do
f = Fruit.create(name: "Bobby")
expect(
f.
versions.
where_object_changes(name: "Robert'; DROP TABLE Students;--").
count
).to eq(0)
end
describe ".where_object_changes" do
it "escapes values" do
f = Fruit.create(name: "Bobby")
expect {
f.
versions.
where_object_changes(name: "Robert'; DROP TABLE Students;--").
count
}.not_to raise_error
end

context "invalid arguments" do
it "raises an error" do
expect { described_class.where_object_changes(:foo) }.to raise_error(ArgumentError)
expect { described_class.where_object_changes([]) }.to raise_error(ArgumentError)
end
end
context "invalid argument (not a Hash)" do
it "raises an error" do
expect { described_class.where_object_changes(:foo) }.to raise_error(ArgumentError)
expect { described_class.where_object_changes([]) }.to raise_error(ArgumentError)
end
end

context "valid arguments", versioning: true do
let(:color) { %w[red green] }
let(:fruit) { Fruit.create!(name: name[0]) }
let(:name) { %w[banana kiwi mango] }
context "valid arguments", versioning: true do
let(:fruit) { Fruit.create!(name: "banana") }

before do
fruit.update_attributes!(name: name[1], color: color[0])
fruit.update_attributes!(name: name[2], color: color[1])
end
before do
fruit.update_attributes!(name: "kiwi", color: "red")
fruit.update_attributes!(name: "mango", color: "green")
end

it "finds versions according to their `object_changes` contents" do
expect(
fruit.versions.where_object_changes(name: name[0])
).to match_array(fruit.versions[0..1])
expect(
fruit.versions.where_object_changes(color: color[0])
).to match_array(fruit.versions[1..2])
end
it "finds versions according to their `object_changes` contents" do
expect(
fruit.versions.where_object_changes(name: "banana")
).to match_array(fruit.versions[0..1])
expect(
fruit.versions.where_object_changes(color: "red")
).to match_array(fruit.versions[1..2])
end

it "finds versions with multiple attributes changed" do
expect(
fruit.versions.where_object_changes(color: color[0], name: name[0])
).to match_array([fruit.versions[1]])
end
end
it "finds versions with multiple attributes changed" do
expect(
fruit.versions.where_object_changes(color: "red", name: "banana")
).to match_array([fruit.versions[1]])
end
end
end
Expand Down
12 changes: 6 additions & 6 deletions spec/models/version_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -207,11 +207,11 @@ module PaperTrail
describe "#where_object_changes", versioning: true do
let(:widget) { Widget.new }
let(:name) { FFaker::Name.first_name }
let(:int) { rand(5) + 2 }
let(:int) { rand(10) + 1 }

before do
widget.update_attributes!(name: name, an_integer: 0)
widget.update_attributes!(name: "foobar", an_integer: 77)
widget.update_attributes!(name: "foobar", an_integer: 100)
widget.update_attributes!(name: FFaker::Name.last_name, an_integer: int)
end

Expand All @@ -232,7 +232,7 @@ module PaperTrail
widget.versions.where_object_changes(name: name)
).to eq(widget.versions[0..1])
expect(
widget.versions.where_object_changes(an_integer: 77)
widget.versions.where_object_changes(an_integer: 100)
).to eq(widget.versions[1..2])
expect(
widget.versions.where_object_changes(an_integer: int)
Expand All @@ -241,7 +241,7 @@ module PaperTrail

it "handles queries for multiple attributes" do
expect(
widget.versions.where_object_changes(an_integer: 77, name: "foobar")
widget.versions.where_object_changes(an_integer: 100, name: "foobar")
).to eq(widget.versions[1..2])
end
end
Expand All @@ -255,7 +255,7 @@ module PaperTrail
widget.versions.where_object_changes(name: name)
).to eq(widget.versions[0..1])
expect(
widget.versions.where_object_changes(an_integer: 77)
widget.versions.where_object_changes(an_integer: 100)
).to eq(widget.versions[1..2])
expect(
widget.versions.where_object_changes(an_integer: int)
Expand All @@ -264,7 +264,7 @@ module PaperTrail

it "handles queries for multiple attributes" do
expect(
widget.versions.where_object_changes(an_integer: 77, name: "foobar")
widget.versions.where_object_changes(an_integer: 100, name: "foobar")
).to eq(widget.versions[1..2])
end

Expand Down
2 changes: 1 addition & 1 deletion spec/paper_trail/serializers/yaml_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ module Serializers
matches = described_class.where_object_condition(
::PaperTrail::Version.arel_table[:object], :arg1, "Val 1"
)
expect(matches.instance_of?(Arel::Nodes::Matches)).to(eq(true))
expect(matches).to be_an(Arel::Nodes::Matches)
expect(matches.right.val).to eq("%\narg1: Val 1\n%")
end
end
Expand Down

0 comments on commit b02be11

Please sign in to comment.