def test_wrong_field_type(self): # can't put a percent in another percent field_spec = {"aggregation": "simple", "field": "is_pregnant", "type": "percent"} with self.assertRaises(BadValueError): ReportColumnFactory.from_spec( {"type": "percent", "column_id": "pct", "numerator": field_spec, "denominator": field_spec} )
def testBadAggregation(self): with self.assertRaises(BadSpecError): ReportColumnFactory.from_spec({ "aggregation": "simple_", "field": "doc_id", "type": "field", })
def testBadFormat(self): with self.assertRaises(BadValueError): ReportColumnFactory.from_spec({ "aggregation": "simple", "field": "doc_id", "format": "default_", "type": "field", })
def test_wrong_field_type(self): # can't put a percent in another percent field_spec = { "aggregation": "simple", "field": "is_pregnant", "type": "percent", } with self.assertRaises(BadSpecError): ReportColumnFactory.from_spec({ 'type': 'percent', 'column_id': 'pct', 'numerator': field_spec, 'denominator': field_spec, })
def testColumnDefaultsToField(self): field = ReportColumnFactory.from_spec({ "aggregation": "simple", "field": "doc_id", "type": "field", }) self.assertEqual('doc_id', field.column_id)
def validate(self, required=True): def _check_for_duplicates(supposedly_unique_list, error_msg): # http://stackoverflow.com/questions/9835762/find-and-list-duplicates-in-python-list duplicate_items = set( [item for item in supposedly_unique_list if supposedly_unique_list.count(item) > 1] ) if len(duplicate_items) > 0: raise BadSpecError( _(error_msg).format(', '.join(sorted(duplicate_items))) ) super(ReportConfiguration, self).validate(required) # check duplicates before passing to factory since it chokes on them _check_for_duplicates( [FilterSpec.wrap(f).slug for f in self.filters], 'Filters cannot contain duplicate slugs: {}', ) _check_for_duplicates( [ReportColumnFactory.from_spec(c).column_id for c in self.columns], 'Columns cannot contain duplicate column_ids: {}', ) # these calls all implicitly do validation ReportFactory.from_spec(self) self.ui_filters self.charts
def test_format_pct_non_numeric(self): spec = self._test_spec() spec['format'] = 'percent' wrapped = ReportColumnFactory.from_spec(spec) for unexpected_value in ['hello', object()]: self.assertEqual('?', wrapped.get_format_fn()({'num': 1, 'denom': unexpected_value}), 'non-numeric value failed for denominator {}'. format(unexpected_value)) self.assertEqual('?', wrapped.get_format_fn()({'num': unexpected_value, 'denom': 1}))
def test_expansion(self): column = ReportColumnFactory.from_spec( dict(type="expanded", field="lab_result", display="Lab Result", format="default", description="foo") ) cols = _expand_column(column, ["positive", "negative"], "en") self.assertEqual(len(cols), 2) self.assertEqual(type(cols[0].view), SumWhen) self.assertEqual(cols[1].view.whens, {"negative": 1})
def test_format_both(self): spec = self._test_spec() spec['format'] = 'both' wrapped = ReportColumnFactory.from_spec(spec, is_static=False) self.assertEqual('33% (1/3)', wrapped.get_format_fn()({ 'num': 1, 'denom': 3 }))
def testColumnSetFromAlias(self): field = ReportColumnFactory.from_spec({ "aggregation": "simple", "field": "doc_id", "alias": "the_right_answer", "type": "field", }) self.assertTrue(isinstance(field, FieldColumn)) self.assertEqual('the_right_answer', field.column_id)
def testColumnSetFromAlias(self): field = ReportColumnFactory.from_spec({ "aggregation": "simple", "field": "doc_id", "alias": "the_right_answer", "type": "field", }, is_static=False) self.assertTrue(isinstance(field, FieldColumn)) self.assertEqual('the_right_answer', field.column_id)
def testColumnDefaultsToField(self): field = ReportColumnFactory.from_spec( { "aggregation": "simple", "field": "doc_id", "type": "field", }, is_static=False) self.assertEqual('doc_id', field.column_id)
def testGoodFormat(self): for format in ["default", "percent_of_total"]: self.assertEquals( FieldColumn, type( ReportColumnFactory.from_spec( {"aggregation": "simple", "field": "doc_id", "format": format, "type": "field"} ) ), )
def test_format_pct_non_numeric(self): spec = self._test_spec() spec["format"] = "percent" wrapped = ReportColumnFactory.from_spec(spec) for unexpected_value in ["hello", object()]: self.assertEqual( "?", wrapped.get_format_fn()({"num": 1, "denom": unexpected_value}), "non-numeric value failed for denominator {}".format(unexpected_value), ) self.assertEqual("?", wrapped.get_format_fn()({"num": unexpected_value, "denom": 1}))
def test_format_pct_denom_0(self): spec = self._test_spec() spec['format'] = 'percent' wrapped = ReportColumnFactory.from_spec(spec) for empty_value in [0, 0.0, None, '']: self.assertEqual( '--', wrapped.get_format_fn()({ 'num': 1, 'denom': empty_value }))
def test_expansion(self): column = ReportColumnFactory.from_spec( dict(type="expanded", field="lab_result", display="Lab Result", format="default", description="foo")) cols = expand_column(column, ["positive", "negative"], "en") self.assertEqual(len(cols), 2) self.assertEqual(type(cols[0].view), SumWhen) self.assertEqual(cols[1].view.whens, {'negative': 1})
def test_missing_fields(self): field_spec = { "aggregation": "simple", "field": "is_pregnant", "type": "field", } with self.assertRaises(BadSpecError): ReportColumnFactory.from_spec( { 'type': 'percent', 'column_id': 'pct', }, is_static=False) with self.assertRaises(BadSpecError): ReportColumnFactory.from_spec( { 'type': 'percent', 'column_id': 'pct', 'numerator': field_spec, }, is_static=False) with self.assertRaises(BadSpecError): ReportColumnFactory.from_spec( { 'type': 'percent', 'column_id': 'pct', 'denominator': field_spec, }, is_static=False)
def testGoodFormat(self): for format in [ 'default', 'percent_of_total', ]: self.assertEquals(FieldColumn, type( ReportColumnFactory.from_spec({ "aggregation": "simple", "field": "doc_id", "format": format, "type": "field", }, is_static=False) ))
def testGoodFormat(self): for format in [ 'default', 'percent_of_total', ]: self.assertEquals(FieldColumn, type( ReportColumnFactory.from_spec({ "aggregation": "simple", "field": "doc_id", "format": format, "type": "field", }) ))
def test_missing_fields(self): field_spec = {"aggregation": "simple", "field": "is_pregnant", "type": "field"} with self.assertRaises(BadValueError): ReportColumnFactory.from_spec({"type": "percent", "column_id": "pct"}) with self.assertRaises(BadValueError): ReportColumnFactory.from_spec({"type": "percent", "column_id": "pct", "numerator": field_spec}) with self.assertRaises(BadValueError): ReportColumnFactory.from_spec({"type": "percent", "column_id": "pct", "denominator": field_spec})
def test_wrap(self): wrapped = ReportColumnFactory.from_spec( { "type": "percent", "column_id": "pct", "numerator": {"aggregation": "sum", "field": "has_danger_signs", "type": "field"}, "denominator": {"aggregation": "sum", "field": "is_pregnant", "type": "field"}, } ) self.assertTrue(isinstance(wrapped, PercentageColumn)) self.assertEqual("pct", wrapped.column_id) self.assertEqual("has_danger_signs", wrapped.numerator.field) self.assertEqual("is_pregnant", wrapped.denominator.field) self.assertEqual("percent", wrapped.format)
def test_format_pct_non_numeric(self): spec = self._test_spec() spec['format'] = 'percent' wrapped = ReportColumnFactory.from_spec(spec) for unexpected_value in ['hello', object()]: self.assertEqual( '?', wrapped.get_format_fn()({ 'num': 1, 'denom': unexpected_value }), 'non-numeric value failed for denominator {}'.format( unexpected_value)) self.assertEqual( '?', wrapped.get_format_fn()({ 'num': unexpected_value, 'denom': 1 }))
def test_wrap(self): wrapped = ReportColumnFactory.from_spec({ 'type': 'percent', 'column_id': 'pct', 'numerator': { "aggregation": "sum", "field": "has_danger_signs", "type": "field", }, 'denominator': { "aggregation": "sum", "field": "is_pregnant", "type": "field", }, }) self.assertTrue(isinstance(wrapped, PercentageColumn)) self.assertEqual('pct', wrapped.column_id) self.assertEqual('has_danger_signs', wrapped.numerator.field) self.assertEqual('is_pregnant', wrapped.denominator.field) self.assertEqual('percent', wrapped.format)
def test_missing_fields(self): field_spec = { "aggregation": "simple", "field": "is_pregnant", "type": "field", } with self.assertRaises(BadSpecError): ReportColumnFactory.from_spec({ 'type': 'percent', 'column_id': 'pct', }) with self.assertRaises(BadSpecError): ReportColumnFactory.from_spec({ 'type': 'percent', 'column_id': 'pct', 'numerator': field_spec, }) with self.assertRaises(BadSpecError): ReportColumnFactory.from_spec({ 'type': 'percent', 'column_id': 'pct', 'denominator': field_spec, })
def report_columns(self): return [ReportColumnFactory.from_spec(c) for c in self.columns]
def test_format_fraction(self): spec = self._test_spec() spec['format'] = 'fraction' wrapped = ReportColumnFactory.from_spec(spec) self.assertEqual('1/3', wrapped.get_format_fn()({'num': 1, 'denom': 3}))
def test_format(self): wrapped = ReportColumnFactory.from_spec(self._spec) self.assertEqual('2015-03', wrapped.get_format_fn()({'year': 2015, 'month': 3}))
def test_format_pct_denom_0(self): spec = self._test_spec() spec['format'] = 'percent' wrapped = ReportColumnFactory.from_spec(spec) self.assertEqual('--', wrapped.get_format_fn()({'num': 1, 'denom': 0}))
def test_format_numeric_pct(self): spec = self._test_spec() spec['format'] = 'numeric_percent' wrapped = ReportColumnFactory.from_spec(spec) self.assertEqual(33, wrapped.get_format_fn()({'num': 1, 'denom': 3}))
def test_format_float(self): spec = self._test_spec() spec['format'] = 'decimal' wrapped = ReportColumnFactory.from_spec(spec) self.assertEqual(.333, wrapped.get_format_fn()({'num': 1, 'denom': 3})) self.assertEqual(.25, wrapped.get_format_fn()({'num': 1, 'denom': 4}))
def test_format_both(self): spec = self._test_spec() spec['format'] = 'both' wrapped = ReportColumnFactory.from_spec(spec) self.assertEqual('33% (1/3)', wrapped.get_format_fn()({'num': 1, 'denom': 3}))
def test_custom_format(self): self._spec.update({'format': '%b %Y'}) wrapped = ReportColumnFactory.from_spec(self._spec) self.assertEqual('Mar 2015', wrapped.get_format_fn()({'year': 2015, 'month': 3}))
def test_format_pct_denom_0(self): spec = self._test_spec() spec['format'] = 'percent' wrapped = ReportColumnFactory.from_spec(spec) for empty_value in [0, 0.0, None, '']: self.assertEqual('--', wrapped.get_format_fn()({'num': 1, 'denom': empty_value}))
def test_format_float(self): spec = self._test_spec() spec["format"] = "decimal" wrapped = ReportColumnFactory.from_spec(spec) self.assertEqual(0.333, wrapped.get_format_fn()({"num": 1, "denom": 3})) self.assertEqual(0.25, wrapped.get_format_fn()({"num": 1, "denom": 4}))
def test_wrap(self): wrapped = ReportColumnFactory.from_spec(self._spec) self.assertTrue(isinstance(wrapped, AggregateDateColumn)) self.assertEqual('a_date', wrapped.column_id)
def test_format_missing(self): wrapped = ReportColumnFactory.from_spec(self._spec) self.assertEqual('Unknown Date', wrapped.get_format_fn()({'year': None, 'month': None}))
def test_group_by(self): wrapped = ReportColumnFactory.from_spec(self._spec) self.assertEqual(['a_date_year', 'a_date_month'], wrapped.get_query_column_ids())
def test_format_numeric_pct(self): spec = self._test_spec() spec["format"] = "numeric_percent" wrapped = ReportColumnFactory.from_spec(spec) self.assertEqual(33, wrapped.get_format_fn()({"num": 1, "denom": 3}))
def test_group_by(self): wrapped = ReportColumnFactory.from_spec(self._spec) self.assertEqual(['a_date_year', 'a_date_month'], wrapped.get_group_by_columns())
def report_columns(self): return [ ReportColumnFactory.from_spec(c, self.is_static) for c in self.columns ]