File: test_middleware.rb

package info (click to toggle)
ruby-client-side-validations 3.2.6%2Bgh-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 676 kB
  • sloc: javascript: 3,019; ruby: 2,959; makefile: 2
file content (211 lines) | stat: -rw-r--r-- 7,589 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
# encoding: utf-8

require 'middleware/cases/helper'
require 'active_record/cases/helper'

class ClientSideValidationsActiveRecordMiddlewareTest < Test::Unit::TestCase
  include Rack::Test::Methods

  def teardown
    User.delete_all
  end

  def with_kcode(kcode)
    if RUBY_VERSION < '1.9'
      orig_kcode, $KCODE = $KCODE, kcode
      begin
        yield
      ensure
        $KCODE = orig_kcode
      end
    else
      yield
    end
  end

  def app
    app = Proc.new { |env| [200, {}, ['success']] }
    ClientSideValidations::Middleware::Validators.new(app)
  end

  def test_uniqueness_when_resource_exists
    User.create(:email => 'user@test.com')
    get '/validators/uniqueness', { 'user[email]' => 'user@test.com', 'case_sensitive' => true }

    assert_equal 'false', last_response.body
    assert last_response.ok?
  end

  def test_uniqueness_when_resource_exists_and_param_order_is_backwards
    User.create(:email => 'user@test.com')
    get '/validators/uniqueness', { 'case_sensitive' => true, 'user[email]' => 'user@test.com' }

    assert_equal 'false', last_response.body
    assert last_response.ok?
  end

  def test_uniqueness_when_resource_does_not_exist
    get '/validators/uniqueness', { 'user[email]' => 'user@test.com', 'case_sensitive' => true }

    assert_equal 'true', last_response.body
    assert last_response.not_found?
  end

  def test_uniqueness_when_value_must_be_typecast
    User.create(:active => false)
    get '/validators/uniqueness', { 'user[active]' => 'false', 'case_sensitive' => true }

    assert_equal 'false', last_response.body
    assert last_response.ok?
  end

  def test_uniqueness_when_id_is_given
    user = User.create(:email => 'user@test.com')
    get '/validators/uniqueness', { 'user[email]' => 'user@test.com', 'id' => user.id, 'case_sensitive' => true }

    assert_equal 'true', last_response.body
    assert last_response.not_found?
  end

  def test_mysql_adapter_uniqueness_when_id_is_given
    user = User.create(:email => 'user@test.com')
    User.connection.stubs('adapter_name').returns('Mysql2')

    sql_without_binary = "#{User.arel_table["email"].eq(user.email).to_sql} AND #{User.arel_table.primary_key.not_eq(user.id).to_sql}"
    relation = Arel::Nodes::SqlLiteral.new("BINARY #{sql_without_binary}")

    # NOTE: Stubs User#where because SQLite3 don't know BINARY
    result = User.where(sql_without_binary)
    User.expects(:where).with(relation).returns(result)

    get '/validators/uniqueness', { 'user[email]' => user.email, 'case_sensitive' => true, 'id' => user.id}
    assert_equal 'true', last_response.body
  end

  def test_mysql_adapter_uniqueness_when_id_is_given_with_scope
    user = User.create(:email => 'user@test.com', :name => 'Brian')
    User.connection.stubs('adapter_name').returns('Mysql2')

    sql_without_binary = "#{User.arel_table["email"].eq(user.email).to_sql} AND #{User.arel_table.primary_key.not_eq(user.id).to_sql} AND #{User.arel_table["name"].eq(user.name).to_sql}"
    relation = Arel::Nodes::SqlLiteral.new("BINARY #{sql_without_binary}")

    #NOTE: Stubs User#where because SQLite3 don't know BINARY
    result = User.where(sql_without_binary)
    User.expects(:where).with(relation).returns(result)

    get '/validators/uniqueness', { 'user[email]' => user.email, 'scope' => {'name' => user.name}, 'case_sensitive' => true, 'id' => user.id}
    assert_equal 'true', last_response.body
  end

  def test_uniqueness_when_scope_is_given
    User.create(:email => 'user@test.com', :age => 25)
    get '/validators/uniqueness', { 'user[email]' => 'user@test.com', 'scope' => { 'age' => 30 }, 'case_sensitive' => true }

    assert_equal 'true', last_response.body
    assert last_response.not_found?
  end

  def test_uniqueness_when_scope_is_given_and_value_must_be_typecast
    User.create(:email => 'user@test.com', :active => true)
    get '/validators/uniqueness', { 'user[email]' => 'user@test.com', 'scope' => { 'active' => 'true' }, 'case_sensitive' => true }

    assert_equal 'false', last_response.body
    assert last_response.ok?
  end

  def test_uniqueness_when_multiple_scopes_are_given
    User.create(:email => 'user@test.com', :age => 30, :name => 'Brian')
    get '/validators/uniqueness', { 'user[email]' => 'user@test.com', 'scope' => { 'age' => 30, 'name' => 'Robert' }, 'case_sensitive' => true }

    assert_equal 'true', last_response.body
    assert last_response.not_found?
  end

  def test_uniqueness_when_case_insensitive
    User.create(:name => 'Brian')
    get '/validators/uniqueness', { 'user[name]' => 'BRIAN', 'case_sensitive' => false }

    assert_equal 'false', last_response.body
    assert last_response.ok?
  end

  def test_uniqueness_when_attribute_passes_as_an_integer
    User.create(:name => 123)
    get '/validators/uniqueness', { 'user[name]' => 123, 'case_sensitive' => true }

    assert_equal 'false', last_response.body
    assert last_response.ok?
  end

  def test_uniqueness_when_attribute_passes_as_an_integer
    User.create(:name => 123)
    get '/validators/uniqueness', { 'user[name]' => 123, 'case_sensitive' => true }

    assert_equal 'false', last_response.body
    assert last_response.ok?
  end

  def test_uniqueness_with_columns_which_are_sql_keywords
    Guid.validates_uniqueness_of :key
    assert_nothing_raised do
      get '/validators/uniqueness', { 'guid[key]' => 'test', 'case_sensitive' => true }
    end
  end

  def test_uniqueness_with_limit
    # User.title is limited to 5 characters
    User.create(:title => "abcde")
    get '/validators/uniqueness', { 'user[title]' => 'abcdefgh', 'case_sensitive' => true }

    assert_equal 'false', last_response.body
    assert last_response.ok?
  end

  def test_uniqueness_with_limit_and_utf8
    with_kcode('UTF8') do
      # User.title is limited to 5 characters
      User.create(:title => "一二三四五")
      get '/validators/uniqueness', { 'user[title]' => '一二三四五六七八', 'case_sensitive' => true }

      assert_equal 'false', last_response.body
    assert last_response.ok?
    end
  end

  def test_validate_straight_inheritance_uniqueness
    get '/validators/uniqueness', { 'inept_wizard[name]' => 'Rincewind', 'case_sensitive' => true }
    assert_equal 'true', last_response.body
    assert last_response.not_found?

    IneptWizard.create(:name => 'Rincewind')
    get '/validators/uniqueness', { 'inept_wizard[name]' => 'Rincewind', 'case_sensitive' => true }
    assert_equal 'false', last_response.body
    assert last_response.ok?

    get '/validators/uniqueness', { 'conjurer[name]' => 'Rincewind', 'case_sensitive' => true }
    assert_equal 'false', last_response.body
    assert last_response.ok?

    Conjurer.create(:name => 'The Amazing Bonko')
    get '/validators/uniqueness', { 'thaumaturgist[name]' => 'The Amazing Bonko', 'case_sensitive' => true }
    assert_equal 'false', last_response.body
    assert last_response.ok?
  end

  def test_uniqueness_when_resource_is_a_nested_module
    ActiveRecordTestModule::User2.create(:email => 'user@test.com')
    get '/validators/uniqueness', { 'active_record_test_module/user2[email]' => 'user@test.com', 'case_sensitive' => true }

    assert_equal 'false', last_response.body
    assert last_response.ok?
  end

  def test_uniqueness_when_resource_descends_from_an_abstract_base_class
      Thing.create(:name => 'name_to_be_duplicated')
      get '/validators/uniqueness', { 'thing[name]' => 'name_to_be_duplicated', 'case_sensitive' => true }

      assert_equal 'false', last_response.body
      assert last_response.ok?
  end
end