Skip to content
This repository has been archived by the owner on Mar 24, 2021. It is now read-only.

Commit

Permalink
WIP: Query changes
Browse files Browse the repository at this point in the history
  • Loading branch information
nick-gravgaard committed Jan 9, 2014
1 parent fecaded commit 9a2a840
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 13 deletions.
18 changes: 12 additions & 6 deletions backdrop/read/validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -266,20 +266,26 @@ def validate(self, request_args, context):
delta = request_args.get('delta')

if (request_args.get('start_at') or request_args.get('end_at')) \
and (date or delta):
self.add_error('Both absolute and relative time cannot be requested')
and (delta or date):
self.add_error("Absolute ('start_at' and 'end_at') and relative "
"('delta' and/or 'date') time cannot be requested "
"at the same time")

if date and not delta:
self.add_error('\'date\' requires delta')
self.add_error("Use of 'date' requires 'delta'")

if delta and not period:
self.add_error('Relative time requires a \'period\'')
if delta:
if delta == 0:
self.add_error("'delta' must not be zero")
if not period:
self.add_error("If 'delta' is requested (for relative time), "
"'period' is required")

if delta:
try:
int(delta)
except ValueError:
self.add_error('\'delta\' is not a valid Integer')
self.add_error("'delta' is not a valid Integer")


def validate_request_args(request_args, raw_queries_allowed=False):
Expand Down
31 changes: 31 additions & 0 deletions tests/read/test_parse_request_args.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from hamcrest import *
import pytz
from werkzeug.datastructures import MultiDict
from freezegun import freeze_time

from backdrop.read.query import parse_request_args

Expand Down Expand Up @@ -142,3 +143,33 @@ def test_one_collect_is_parsed_with_custom_method(self):
args = parse_request_args(request_args)

assert_that(args['collect'], is_([("some_key", "mean")]))

@freeze_time('2014-01-09 00:00:00')
def test_now_and_negative_delta_sets_start_end_window(self):
request_args = MultiDict([
('period', 'day'),
('delta', -3),
])

args = parse_request_args(request_args)

assert_that(args['start_at'], is_(
datetime(2014, 1, 6, 0, 0, 0, tzinfo=pytz.UTC)))

assert_that(args['end_at'], is_(
datetime(2014, 1, 9, 0, 0, 0, tzinfo=pytz.UTC)))

@freeze_time('2014-01-09 00:00:00')
def test_now_and_positive_delta_sets_start_end_window(self):
request_args = MultiDict([
('period', 'day'),
('delta', 3),
])

args = parse_request_args(request_args)

assert_that(args['start_at'], is_(
datetime(2014, 1, 9, 0, 0, 0, tzinfo=pytz.UTC)))

assert_that(args['end_at'], is_(
datetime(2014, 1, 12, 0, 0, 0, tzinfo=pytz.UTC)))
34 changes: 27 additions & 7 deletions tests/read/test_validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -358,14 +358,26 @@ def test_just_delta_isnt_allowed(self):
'delta': '3',
})

assert_that(validation_result, is_invalid_with_message('Relative time requires a \'period\''))
assert_that(validation_result, is_invalid_with_message(
"If 'delta' is requested (for relative time), "
"'period' is required"))

def test_period_with_zero_delta(self):
validation_result = validate_request_args({
'period': 'day',
'delta': '0',
})

assert_that(validation_result, is_invalid_with_message(
"'delta' must not be zero"))

def test_just_date_isnt_allowed(self):
validation_result = validate_request_args({
'date': '2000-02-02T00:00:00+00:00',
})

assert_that(validation_result, is_invalid_with_message('\'date\' requires delta'))
assert_that(validation_result, is_invalid_with_message(
"Use of 'date' requires 'delta'"))

def test_delta_and_start_end_isnt_allowed(self):
validation_result = validate_request_args({
Expand All @@ -374,7 +386,9 @@ def test_delta_and_start_end_isnt_allowed(self):
'delta': '3',
})

assert_that(validation_result, is_invalid_with_message('Both absolute and relative time cannot be requested'))
assert_that(validation_result, is_invalid_with_message(
"Absolute ('start_at' and 'end_at') and relative ('delta' "
"and/or 'date') time cannot be requested at the same time"))

def test_date_and_start_end_isnt_allowed(self):
validation_result = validate_request_args({
Expand All @@ -383,7 +397,9 @@ def test_date_and_start_end_isnt_allowed(self):
'date': '2000-02-02T00:00:00+00:00',
})

assert_that(validation_result, is_invalid_with_message('Both absolute and relative time cannot be requested'))
assert_that(validation_result, is_invalid_with_message(
"Absolute ('start_at' and 'end_at') and relative ('delta' "
"and/or 'date') time cannot be requested at the same time"))

def test_date_delta_and_start_end_isnt_allowed(self):
validation_result = validate_request_args({
Expand All @@ -393,7 +409,9 @@ def test_date_delta_and_start_end_isnt_allowed(self):
'delta': '3',
})

assert_that(validation_result, is_invalid_with_message('Both absolute and relative time cannot be requested'))
assert_that(validation_result, is_invalid_with_message(
"Absolute ('start_at' and 'end_at') and relative ('delta' "
"and/or 'date') time cannot be requested at the same time"))

def test_date_is_a_valid_date(self):
validation_result = validate_request_args({
Expand All @@ -402,15 +420,17 @@ def test_date_is_a_valid_date(self):
'delta': '3',
})

assert_that(validation_result, is_invalid_with_message('date is not a valid datetime'))
assert_that(validation_result, is_invalid_with_message(
'date is not a valid datetime'))

def test_delta_is_a_valid_number(self):
validation_result = validate_request_args({
'period': 'day',
'delta': 'laierughrelg',
})

assert_that(validation_result, is_invalid_with_message('\'delta\' is not a valid Integer'))
assert_that(validation_result, is_invalid_with_message(
"'delta' is not a valid Integer"))

class TestRequestValidationWithNoRawQueries(TestCase):

Expand Down

0 comments on commit 9a2a840

Please sign in to comment.