/
test_decimal.py
109 lines (98 loc) · 3.23 KB
/
test_decimal.py
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
# Copyright 2021 Google LLC
#
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file or at
# https://developers.google.com/open-source/licenses/bsd
from .models import Author, Number
from django.test import TransactionTestCase
from django.db import connection
from decimal import Decimal
from tests.system.django_spanner.utils import (
setup_instance,
teardown_instance,
setup_database,
teardown_database,
)
class TestDecimal(TransactionTestCase):
@classmethod
def setUpClass(cls):
setup_instance()
setup_database()
with connection.schema_editor() as editor:
# Create the tables
editor.create_model(Author)
editor.create_model(Number)
@classmethod
def tearDownClass(cls):
with connection.schema_editor() as editor:
# delete the table
editor.delete_model(Author)
editor.delete_model(Number)
teardown_database()
teardown_instance()
def rating_transform(self, value):
return value["rating"]
def values_transform(self, value):
return value.num
def assertValuesEqual(
self, queryset, expected_values, transformer, ordered=True
):
self.assertQuerysetEqual(
queryset, expected_values, transformer, ordered
)
def test_insert_and_search_decimal_value(self):
"""
Tests model object creation with Author model.
"""
author_kent = Author(
first_name="Arthur", last_name="Kent", rating=Decimal("4.1"),
)
author_kent.save()
qs1 = Author.objects.filter(rating__gte=3).values("rating")
self.assertValuesEqual(
qs1, [Decimal("4.1")], self.rating_transform,
)
# Delete data from Author table.
Author.objects.all().delete()
def test_decimal_filter(self):
"""
Tests decimal filter query.
"""
# Insert data into Number table.
Number.objects.bulk_create(
Number(num=Decimal(i) / Decimal(10)) for i in range(10)
)
qs1 = Number.objects.filter(num__lte=Decimal(2) / Decimal(10))
self.assertValuesEqual(
qs1,
[Decimal(i) / Decimal(10) for i in range(3)],
self.values_transform,
ordered=False,
)
# Delete data from Number table.
Number.objects.all().delete()
def test_decimal_precision_limit(self):
"""
Tests decimal object precission limit.
"""
num_val = Number(num=Decimal(1) / Decimal(3))
with self.assertRaises(ValueError):
num_val.save()
def test_decimal_update(self):
"""
Tests decimal object update.
"""
author_kent = Author(
first_name="Arthur", last_name="Kent", rating=Decimal("4.1"),
)
author_kent.save()
author_kent.rating = Decimal("4.2")
author_kent.save()
qs1 = Author.objects.filter(rating__gte=Decimal("4.2")).values(
"rating"
)
self.assertValuesEqual(
qs1, [Decimal("4.2")], self.rating_transform,
)
# Delete data from Author table.
Author.objects.all().delete()