Skip to content

Commit 19bd175

Browse files
committed
fix quirk with active record predicates and zero
- i.e. generated predicate methods unintuitively return false for zero
1 parent 776f668 commit 19bd175

File tree

3 files changed

+62
-23
lines changed

3 files changed

+62
-23
lines changed

app/models/license.rb

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -262,47 +262,47 @@ class License < ApplicationRecord
262262
validates :max_machines,
263263
numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 2_147_483_647 },
264264
allow_nil: true,
265-
if: -> { max_machines_override? }
265+
if: -> { max_machines_override.present? }
266266

267267
validates :max_machines,
268268
numericality: { greater_than_or_equal_to: 1, message: 'must be greater than or equal to 1 for floating policy' },
269269
allow_nil: true,
270-
if: -> { max_machines_override? && floating? }
270+
if: -> { max_machines_override.present? && floating? }
271271

272272
validates :max_machines,
273273
numericality: { equal_to: 1, message: 'must be equal to 1 for non-floating policy' },
274274
allow_nil: true,
275-
if: -> { max_machines_override? && node_locked? }
275+
if: -> { max_machines_override.present? && node_locked? }
276276

277277
validates :max_cores,
278278
numericality: { greater_than_or_equal_to: 1, less_than_or_equal_to: 2_147_483_647 },
279279
allow_nil: true,
280-
if: -> { max_cores_override? }
280+
if: -> { max_cores_override.present? }
281281

282282
validates :max_memory,
283283
numericality: { greater_than_or_equal_to: 1, less_than_or_equal_to: 9_223_372_036_854_775_807 },
284284
allow_nil: true,
285-
if: -> { max_memory_override? }
285+
if: -> { max_memory_override.present? }
286286

287287
validates :max_disk,
288288
numericality: { greater_than_or_equal_to: 1, less_than_or_equal_to: 9_223_372_036_854_775_807 },
289289
allow_nil: true,
290-
if: -> { max_disk_override? }
290+
if: -> { max_disk_override.present? }
291291

292292
validates :max_uses,
293293
numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 2_147_483_647 },
294294
allow_nil: true,
295-
if: -> { max_uses_override? }
295+
if: -> { max_uses_override.present? }
296296

297297
validates :max_processes,
298298
numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 2_147_483_647 },
299299
allow_nil: true,
300-
if: -> { max_processes_override? }
300+
if: -> { max_processes_override.present? }
301301

302302
validates :max_users,
303303
numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 2_147_483_647 },
304304
allow_nil: true,
305-
if: -> { max_users_override? }
305+
if: -> { max_users_override.present? }
306306

307307
scope :search_id, -> (term) {
308308
identifier = term.to_s
@@ -775,44 +775,43 @@ def status
775775
end
776776
end
777777

778-
779-
def max_machines = max_machines_override? ? max_machines_override : policy&.max_machines
778+
def max_machines = max_machines_override.present? ? max_machines_override : policy&.max_machines
780779
def max_machines? = max_machines.present?
781780
def max_machines=(value)
782781
self.max_machines_override = value
783782
end
784783

785-
def max_cores = max_cores_override? ? max_cores_override : policy&.max_cores
784+
def max_cores = max_cores_override.present? ? max_cores_override : policy&.max_cores
786785
def max_cores? = max_cores.present?
787786
def max_cores=(value)
788787
self.max_cores_override = value
789788
end
790789

791-
def max_memory = max_memory_override? ? max_memory_override : policy&.max_memory
790+
def max_memory = max_memory_override.present? ? max_memory_override : policy&.max_memory
792791
def max_memory? = max_memory.present?
793792
def max_memory=(value)
794793
self.max_memory_override = value
795794
end
796795

797-
def max_disk = max_disk_override? ? max_disk_override : policy&.max_disk
796+
def max_disk = max_disk_override.present? ? max_disk_override : policy&.max_disk
798797
def max_disk? = max_disk.present?
799798
def max_disk=(value)
800799
self.max_disk_override = value
801800
end
802801

803-
def max_uses = max_uses_override? ? max_uses_override : policy&.max_uses
802+
def max_uses = max_uses_override.present? ? max_uses_override : policy&.max_uses
804803
def max_uses? = max_uses.present?
805804
def max_uses=(value)
806805
self.max_uses_override = value
807806
end
808807

809-
def max_processes = max_processes_override? ? max_processes_override : policy&.max_processes
808+
def max_processes = max_processes_override.present? ? max_processes_override : policy&.max_processes
810809
def max_processes? = max_processes.present?
811810
def max_processes=(value)
812811
self.max_processes_override = value
813812
end
814813

815-
def max_users = max_users_override? ? max_users_override : policy&.max_users
814+
def max_users = max_users_override.present? ? max_users_override : policy&.max_users
816815
def max_users? = max_users.present?
817816
def max_users=(value)
818817
self.max_users_override = value

app/models/machine.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ class ResurrectionExpiredError < StandardError; end
114114

115115
validates :max_processes,
116116
numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 2_147_483_647 },
117-
if: :max_processes_override?,
117+
if: -> { max_processes_override.present? },
118118
allow_nil: true
119119

120120
validates :ip, length: { maximum: 255 }
@@ -672,7 +672,7 @@ def group!
672672
group
673673
end
674674

675-
def max_processes = max_processes_override? ? max_processes_override : license&.max_processes
675+
def max_processes = max_processes_override.present? ? max_processes_override : license&.max_processes
676676
def max_processes? = max_processes.present?
677677
def max_processes=(value)
678678
self.max_processes_override = value

features/api/v1/licenses/create.feature

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6660,6 +6660,46 @@ Feature: Create license
66606660
And sidekiq should have 1 "metric" job
66616661
And sidekiq should have 1 "request-log" job
66626662

6663+
Scenario: Admin creates a license with an invalid max memory override
6664+
Given I am an admin of account "test1"
6665+
And the current account is "test1"
6666+
And the current account has 1 "policy"
6667+
And I use an authentication token
6668+
When I send a POST request to "/accounts/test1/licenses" with the following:
6669+
"""
6670+
{
6671+
"data": {
6672+
"type": "licenses",
6673+
"attributes": {
6674+
"maxMemory": 0
6675+
},
6676+
"relationships": {
6677+
"policy": {
6678+
"data": {
6679+
"type": "policies",
6680+
"id": "$policies[0]"
6681+
}
6682+
}
6683+
}
6684+
}
6685+
}
6686+
"""
6687+
Then the response status should be "422"
6688+
And the first error should have the following properties:
6689+
"""
6690+
{
6691+
"title": "Unprocessable resource",
6692+
"detail": "must be greater than or equal to 1",
6693+
"code": "MAX_MEMORY_INVALID",
6694+
"source": {
6695+
"pointer": "/data/attributes/maxMemory"
6696+
}
6697+
}
6698+
"""
6699+
And sidekiq should have 0 "webhook" jobs
6700+
And sidekiq should have 0 "metric" jobs
6701+
And sidekiq should have 1 "request-log" job
6702+
66636703
Scenario: Admin creates a license with a max disk override
66646704
Given I am an admin of account "test1"
66656705
And the current account is "test1"
@@ -6691,7 +6731,7 @@ Feature: Create license
66916731
And sidekiq should have 1 "metric" job
66926732
And sidekiq should have 1 "request-log" job
66936733

6694-
Scenario: Admin creates a license with an invalid max memory override
6734+
Scenario: Admin creates a license with an invalid max disk override
66956735
Given I am an admin of account "test1"
66966736
And the current account is "test1"
66976737
And the current account has 1 "policy"
@@ -6702,7 +6742,7 @@ Feature: Create license
67026742
"data": {
67036743
"type": "licenses",
67046744
"attributes": {
6705-
"maxMemory": -1
6745+
"maxDisk": -1
67066746
},
67076747
"relationships": {
67086748
"policy": {
@@ -6721,9 +6761,9 @@ Feature: Create license
67216761
{
67226762
"title": "Unprocessable resource",
67236763
"detail": "must be greater than or equal to 1",
6724-
"code": "MAX_MEMORY_INVALID",
6764+
"code": "MAX_DISK_INVALID",
67256765
"source": {
6726-
"pointer": "/data/attributes/maxMemory"
6766+
"pointer": "/data/attributes/maxDisk"
67276767
}
67286768
}
67296769
"""

0 commit comments

Comments
 (0)