Skip to content

Commit

Permalink
Data verification properties for CoordinatesMixin
Browse files Browse the repository at this point in the history
  • Loading branch information
jace committed Aug 7, 2019
1 parent b6f0361 commit d89620f
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 16 deletions.
11 changes: 11 additions & 0 deletions coaster/sqlalchemy/mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -973,8 +973,19 @@ class CoordinatesMixin(object):
latitude = Column(Numeric)
longitude = Column(Numeric)

@property
def has_coordinates(self):
"""Return `True` if both latitude and longitude are present."""
return self.latitude is not None and self.longitude is not None

@property
def has_missing_coordinates(self):
"""Return `True` if one or both of latitude and longitude are missing."""
return self.latitude is None or self.longitude is None

@property
def coordinates(self):
"""Tuple of (latitude, longitude)."""
return self.latitude, self.longitude

@coordinates.setter
Expand Down
38 changes: 22 additions & 16 deletions tests/test_coordinates.py → tests/test_sqlalchemy_coordinates.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,11 @@
from __future__ import absolute_import

import unittest
import warnings

import sqlalchemy.exc

from coaster.db import db
from coaster.sqlalchemy import BaseMixin, CoordinatesMixin

from .test_models import app1, app2
from .test_models import app2


class CoordinatesData(BaseMixin, CoordinatesMixin, db.Model):
Expand All @@ -21,7 +18,8 @@ class CoordinatesData(BaseMixin, CoordinatesMixin, db.Model):


class TestCoordinatesColumn(unittest.TestCase):
app = app1
# Restrict tests to PostgreSQL as SQLite3 doesn't have a Decimal type
app = app2

def setUp(self):
self.ctx = self.app.test_request_context()
Expand All @@ -41,22 +39,30 @@ def test_columns_created(self):

def test_columns_when_null(self):
data = CoordinatesData()
self.assertEqual(data.coordinates, (None, None))
assert data.coordinates == (None, None)
assert data.has_coordinates is False

def test_column_set_value(self):
warnings.simplefilter('ignore', category=sqlalchemy.exc.SAWarning)
def test_columns_when_missing(self):
data = CoordinatesData()
assert data.has_coordinates is False
assert data.has_missing_coordinates is True
data.coordinates = (12, None)
assert data.has_coordinates is False
assert data.has_missing_coordinates is True
data.coordinates = (None, 73)
assert data.has_coordinates is False
assert data.has_missing_coordinates is True
data.coordinates = (12, 73)
assert data.has_coordinates is True
assert data.has_missing_coordinates is False

def test_column_set_value(self):
data = CoordinatesData()
data.coordinates = (12, 73)
self.assertEqual(data.coordinates, (12, 73))
assert data.coordinates == (12, 73)
assert data.has_coordinates is True
db.session.add(data)
db.session.commit()

readdata = CoordinatesData.query.first()
self.assertEqual(readdata.coordinates, (12, 73))

warnings.resetwarnings()


class TestCoordinatesColumn2(TestCoordinatesColumn):
app = app2
assert readdata.coordinates == (12, 73)

0 comments on commit d89620f

Please sign in to comment.