Skip to content

Commit

Permalink
98% test coverage.
Browse files Browse the repository at this point in the history
  • Loading branch information
onyxfish committed Sep 10, 2015
1 parent 534eeb4 commit 5917741
Show file tree
Hide file tree
Showing 5 changed files with 186 additions and 139 deletions.
2 changes: 1 addition & 1 deletion agate/rows.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

import six

if six.PY3:
if six.PY3: #pragma: no cover
xrange = range

from agate.exceptions import ColumnDoesNotExistError, RowDoesNotExistError
Expand Down
2 changes: 1 addition & 1 deletion agate/table.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@

try:
import csvkit as csv
except ImportError:
except ImportError: #pragma: no cover
import csv

import six
Expand Down
137 changes: 0 additions & 137 deletions tests/test_columns.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,147 +13,10 @@
except ImportError:
import unittest

import pytz

from agate import Table
from agate.data_types import *
from agate.columns import *
from agate.exceptions import *

class TestColumnTypes(unittest.TestCase):
def test_text(self):
self.assertIsInstance(Text().create_column(None, 1), TextColumn)

def test_text_cast(self):
values = ('a', 1, None, Decimal('2.7'), 'n/a', u'👍')
casted = tuple(Text().cast(v) for v in values)
self.assertSequenceEqual(casted, ('a', '1', None, '2.7', None, u'👍'))

def test_boolean(self):
self.assertIsInstance(Boolean().create_column(None, 1), BooleanColumn)

def test_boolean_cast(self):
values = (True, 'yes', None, False, 'no', 'n/a')
casted = tuple(Boolean().cast(v) for v in values)
self.assertSequenceEqual(casted, (True, True, None, False, False, None))

def test_boolean_cast_custom_strings(self):
values = ('a', 'b', 'c', 'd', 'e', 'f')
boolean_type = Boolean(
true_values=('a', 'b'),
false_values=('d', 'e'),
null_values=('c', 'f')
)
casted = tuple(boolean_type.cast(v) for v in values)
self.assertSequenceEqual(casted, (True, True, None, False, False, None))

def test_number(self):
self.assertIsInstance(Number().create_column(None, 1), NumberColumn)

def test_number_cast(self):
values = (2, 1, None, Decimal('2.7'), 'n/a', '2.7', '200,000,000')
casted = tuple(Number().cast(v) for v in values)
self.assertSequenceEqual(casted, (Decimal('2'), Decimal('1'), None, Decimal('2.7'), None, Decimal('2.7'), Decimal('200000000')))

def test_number_cast_locale(self):
values = (2, 1, None, Decimal('2.7'), 'n/a', '2,7', '200.000.000')
casted = tuple(Number(locale='de_DE').cast(v) for v in values)
self.assertSequenceEqual(casted, (Decimal('2'), Decimal('1'), None, Decimal('2.7'), None, Decimal('2.7'), Decimal('200000000')))

def test_number_cast_text(self):
with self.assertRaises(CastError):
Number().cast('a')

def test_number_cast_float(self):
with self.assertRaises(CastError):
Number().cast(1.1)

def test_date(self):
self.assertIsInstance(Date().create_column(None, 1), DateColumn)

def test_date_cast_format(self):
date_type = Date(date_format='%m-%d-%Y')
#
values = ('03-01-1994', '02-17-2011', None, '01-05-1984', 'n/a')
casted = tuple(date_type.cast(v) for v in values)
self.assertSequenceEqual(casted, (
datetime.date(1994, 3, 1),
datetime.date(2011, 2, 17),
None,
datetime.date(1984, 1, 5),
None
))

def test_date_cast_parser(self):
date_type = Date()

values = ('3/1/1994', '2/17/2011', None, 'January 5th, 1984', 'n/a')
casted = tuple(date_type.cast(v) for v in values)
self.assertSequenceEqual(casted, (
datetime.date(1994, 3, 1),
datetime.date(2011, 2, 17),
None,
datetime.date(1984, 1, 5),
None
))

def test_datetime(self):
self.assertIsInstance(DateTime().create_column(None, 1), DateTimeColumn)

def test_datetime_cast_format(self):
datetime_type = DateTime(datetime_format='%m-%d-%Y %I:%M %p')

values = ('03-01-1994 12:30 PM', '02-17-1011 06:30 AM', None, '01-05-1984 06:30 PM', 'n/a')
casted = tuple(datetime_type.cast(v) for v in values)
self.assertSequenceEqual(casted, (
datetime.datetime(1994, 3, 1, 12, 30, 0),
datetime.datetime(1011, 2, 17, 6, 30, 0),
None,
datetime.datetime(1984, 1, 5, 18, 30, 0),
None
))

def test_datetime_cast_parser(self):
datetime_type = DateTime()

values = ('3/1/1994 12:30 PM', '2/17/2011 06:30', None, 'January 5th, 1984 22:37', 'n/a')
casted = tuple(datetime_type.cast(v) for v in values)
self.assertSequenceEqual(casted, (
datetime.datetime(1994, 3, 1, 12, 30, 0),
datetime.datetime(2011, 2, 17, 6, 30, 0),
None,
datetime.datetime(1984, 1, 5, 22, 37, 0),
None
))

def test_datetime_cast_parser_timezone(self):
tzinfo = pytz.timezone('US/Pacific')
datetime_type = DateTime(timezone=tzinfo)

values = ('3/1/1994 12:30 PM', '2/17/2011 06:30', None, 'January 5th, 1984 22:37', 'n/a')
casted = tuple(datetime_type.cast(v) for v in values)
self.assertSequenceEqual(casted, (
tzinfo.localize(datetime.datetime(1994, 3, 1, 12, 30, 0, 0)),
tzinfo.localize(datetime.datetime(2011, 2, 17, 6, 30, 0, 0)),
None,
tzinfo.localize(datetime.datetime(1984, 1, 5, 22, 37, 0, 0)),
None
))

def test_timedelta(self):
self.assertIsInstance(TimeDelta().create_column(None, 1), TimeDeltaColumn)

def test_timedelta_cast_parser(self):
values = ('4:10', '1.2m', '172 hours', '5 weeks, 2 days', 'n/a')
casted = tuple(TimeDelta().cast(v) for v in values)
self.assertSequenceEqual(casted, (
datetime.timedelta(minutes=4, seconds=10),
datetime.timedelta(minutes=1, seconds=12),
datetime.timedelta(hours=172),
datetime.timedelta(weeks=5, days=2),
None
))

class TestColumns(unittest.TestCase):
def setUp(self):
self.rows = (
Expand Down
18 changes: 18 additions & 0 deletions tests/test_computations.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,24 @@ def test_change(self):
self.assertEqual(new_table.columns['test'][2], Decimal('2'))
self.assertEqual(new_table.columns['test'][3], Decimal('1'))

def test_change_mixed_types(self):
rows = (
('1', '10/24/1978'),
('2', '11/13/1974')
)

columns = (
('number', Number()),
('date', Date())
)

table = Table(rows, columns)

with self.assertRaises(ValueError):
table.compute([
('test', Change('number', 'date'))
])

def test_percent_change(self):
new_table = self.table.compute([
('test', PercentChange('two', 'three'))
Expand Down
166 changes: 166 additions & 0 deletions tests/test_data_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,168 @@
except ImportError:
import unittest

import pytz

from agate.columns import *
from agate.data_types import *
from agate.table import Table
from agate.tableset import TableSet

class TestDataTypes(unittest.TestCase):
def test_text(self):
self.assertIsInstance(Text().create_column(None, 1), TextColumn)

def test_text_cast(self):
values = ('a', 1, None, Decimal('2.7'), 'n/a', u'👍')
casted = tuple(Text().cast(v) for v in values)
self.assertSequenceEqual(casted, ('a', '1', None, '2.7', None, u'👍'))

def test_boolean(self):
self.assertIsInstance(Boolean().create_column(None, 1), BooleanColumn)

def test_boolean_cast(self):
values = (True, 'yes', None, False, 'no', 'n/a')
casted = tuple(Boolean().cast(v) for v in values)
self.assertSequenceEqual(casted, (True, True, None, False, False, None))

def test_boolean_cast_custom_strings(self):
values = ('a', 'b', 'c', 'd', 'e', 'f')
boolean_type = Boolean(
true_values=('a', 'b'),
false_values=('d', 'e'),
null_values=('c', 'f')
)
casted = tuple(boolean_type.cast(v) for v in values)
self.assertSequenceEqual(casted, (True, True, None, False, False, None))

def test_boolean_cast_error(self):
with self.assertRaises(CastError):
Boolean().cast('quack')

def test_number(self):
self.assertIsInstance(Number().create_column(None, 1), NumberColumn)

def test_number_cast(self):
values = (2, 1, None, Decimal('2.7'), 'n/a', '2.7', '200,000,000')
casted = tuple(Number().cast(v) for v in values)
self.assertSequenceEqual(casted, (Decimal('2'), Decimal('1'), None, Decimal('2.7'), None, Decimal('2.7'), Decimal('200000000')))

def test_number_cast_locale(self):
values = (2, 1, None, Decimal('2.7'), 'n/a', '2,7', '200.000.000')
casted = tuple(Number(locale='de_DE').cast(v) for v in values)
self.assertSequenceEqual(casted, (Decimal('2'), Decimal('1'), None, Decimal('2.7'), None, Decimal('2.7'), Decimal('200000000')))

def test_number_cast_text(self):
with self.assertRaises(CastError):
Number().cast('a')

def test_number_cast_float(self):
with self.assertRaises(CastError):
Number().cast(1.1)

def test_number_cast_error(self):
with self.assertRaises(CastError):
Number().cast('quack')

def test_date(self):
self.assertIsInstance(Date().create_column(None, 1), DateColumn)

def test_date_cast_format(self):
date_type = Date(date_format='%m-%d-%Y')
#
values = ('03-01-1994', '02-17-2011', None, '01-05-1984', 'n/a')
casted = tuple(date_type.cast(v) for v in values)
self.assertSequenceEqual(casted, (
datetime.date(1994, 3, 1),
datetime.date(2011, 2, 17),
None,
datetime.date(1984, 1, 5),
None
))

def test_date_cast_parser(self):
date_type = Date()

values = ('3/1/1994', '2/17/2011', None, 'January 5th, 1984', 'n/a')
casted = tuple(date_type.cast(v) for v in values)
self.assertSequenceEqual(casted, (
datetime.date(1994, 3, 1),
datetime.date(2011, 2, 17),
None,
datetime.date(1984, 1, 5),
None
))

def test_date_cast_error(self):
with self.assertRaises(CastError):
Date().cast('quack')

def test_datetime(self):
self.assertIsInstance(DateTime().create_column(None, 1), DateTimeColumn)

def test_datetime_cast_format(self):
datetime_type = DateTime(datetime_format='%m-%d-%Y %I:%M %p')

values = ('03-01-1994 12:30 PM', '02-17-1011 06:30 AM', None, '01-05-1984 06:30 PM', 'n/a')
casted = tuple(datetime_type.cast(v) for v in values)
self.assertSequenceEqual(casted, (
datetime.datetime(1994, 3, 1, 12, 30, 0),
datetime.datetime(1011, 2, 17, 6, 30, 0),
None,
datetime.datetime(1984, 1, 5, 18, 30, 0),
None
))

def test_datetime_cast_parser(self):
datetime_type = DateTime()

values = ('3/1/1994 12:30 PM', '2/17/2011 06:30', None, 'January 5th, 1984 22:37', 'n/a')
casted = tuple(datetime_type.cast(v) for v in values)
self.assertSequenceEqual(casted, (
datetime.datetime(1994, 3, 1, 12, 30, 0),
datetime.datetime(2011, 2, 17, 6, 30, 0),
None,
datetime.datetime(1984, 1, 5, 22, 37, 0),
None
))

def test_datetime_cast_parser_timezone(self):
tzinfo = pytz.timezone('US/Pacific')
datetime_type = DateTime(timezone=tzinfo)

values = ('3/1/1994 12:30 PM', '2/17/2011 06:30', None, 'January 5th, 1984 22:37', 'n/a')
casted = tuple(datetime_type.cast(v) for v in values)
self.assertSequenceEqual(casted, (
tzinfo.localize(datetime.datetime(1994, 3, 1, 12, 30, 0, 0)),
tzinfo.localize(datetime.datetime(2011, 2, 17, 6, 30, 0, 0)),
None,
tzinfo.localize(datetime.datetime(1984, 1, 5, 22, 37, 0, 0)),
None
))

def test_datetime_cast_error(self):
with self.assertRaises(CastError):
DateTime().cast('quack')

def test_timedelta(self):
self.assertIsInstance(TimeDelta().create_column(None, 1), TimeDeltaColumn)

def test_timedelta_cast_parser(self):
values = ('4:10', '1.2m', '172 hours', '5 weeks, 2 days', 'n/a')
casted = tuple(TimeDelta().cast(v) for v in values)
self.assertSequenceEqual(casted, (
datetime.timedelta(minutes=4, seconds=10),
datetime.timedelta(minutes=1, seconds=12),
datetime.timedelta(hours=172),
datetime.timedelta(weeks=5, days=2),
None
))


def test_timedelta_cast_error(self):
with self.assertRaises(CastError):
TimeDelta().cast('quack')

class TestTypeInference(unittest.TestCase):
def setUp(self):
self.tester = TypeTester()
Expand Down Expand Up @@ -173,3 +331,11 @@ def test_tableset_from_csv(self):
self.assertSequenceEqual(tableset['table1'].rows[0], ['a', 1])
self.assertSequenceEqual(tableset['table1'].rows[1], ['a', 3])
self.assertSequenceEqual(tableset['table1'].rows[2], ['b', 2])

def test_tableset_from_csv_no_headers(self):
with self.assertRaises(ValueError):
TableSet.from_csv('examples/tableset', self.tester, header=False)

def test_tableset_from_csv_invalid_dir(self):
with self.assertRaises(IOError):
TableSet.from_csv('quack', self.tester)

0 comments on commit 5917741

Please sign in to comment.