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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
from itertools import count
from django.db import models
from django.test import SimpleTestCase
import django_tables2 as tables
class RowsTest(SimpleTestCase):
def test_bound_rows(self):
class SimpleTable(tables.Table):
name = tables.Column()
data = [{"name": "Bradley"}, {"name": "Chris"}, {"name": "Davina"}]
table = SimpleTable(data)
# iteration
records = []
for row in table.rows:
records.append(row.record)
self.assertEqual(records, data)
def test_bound_row(self):
class SimpleTable(tables.Table):
name = tables.Column()
occupation = tables.Column()
age = tables.Column()
record = {"name": "Bradley", "age": 20, "occupation": "programmer"}
table = SimpleTable([record])
row = table.rows[0]
# integer indexing into a row
self.assertEqual(row.get_cell(0), record["name"])
self.assertEqual(row.get_cell(1), record["occupation"])
self.assertEqual(row.get_cell(2), record["age"])
with self.assertRaises(IndexError):
row.get_cell(3)
# column name indexing into a row
self.assertEqual(row.get_cell("name"), record["name"])
self.assertEqual(row.get_cell("occupation"), record["occupation"])
self.assertEqual(row.get_cell("age"), record["age"])
with self.assertRaises(KeyError):
row.get_cell("gamma")
# row should support contains check
self.assertIn("name", row)
self.assertIn("occupation", row)
self.assertNotIn("gamma", row)
def test_boud_row_cells(self):
class SimpleTable(tables.Table):
name = tables.Column()
occupation = tables.Column()
age = tables.Column()
record = {"name": "Bradley", "age": 20, "occupation": "programmer"}
table = SimpleTable([record])
row = table.rows[0]
self.assertEqual(row.cells.name, record["name"])
self.assertEqual(row.cells.age, record["age"])
self.assertEqual(row.cells.name, row.get_cell("name"))
self.assertEqual(row.cells[0], record["name"])
self.assertEqual(row.cells[0], row.get_cell(0))
with self.assertRaises(IndexError):
row.cells[3]
with self.assertRaises(KeyError):
row.cells["gamma"]
def test_row_attrs(self):
"""
If a callable returns an empty string, do not add a space to the CSS class
attribute. (#416)
"""
counter = count()
class Table(tables.Table):
name = tables.Column()
class Meta:
row_attrs = {"class": lambda: "" if next(counter) % 2 == 0 else "bla"}
table = Table([{"name": "Brian"}, {"name": "Thomas"}, {"name": "John"}])
self.assertEqual(table.rows[0].attrs["class"], "even")
self.assertEqual(table.rows[1].attrs["class"], "bla odd")
self.assertEqual(table.rows[1].attrs["class"], "even")
def test_get_cell_display(self):
class A(models.Model):
foo = models.CharField(max_length=1, choices=(("a", "valA"), ("b", "valB")))
class Meta:
app_label = "tests"
class B(models.Model):
a = models.ForeignKey(A, on_delete=models.CASCADE)
class Meta:
app_label = "tests"
class C(models.Model):
b = models.ForeignKey(B, on_delete=models.CASCADE)
class Meta:
app_label = "tests"
class Tab(tables.Table):
a = tables.Column(accessor="b__a__foo")
class Meta:
model = C
a = A(foo="a")
b = B(a=a)
c = C(b=b)
tab = Tab([c])
row = tab.rows[0]
self.assertEqual(row.get_cell("a"), "valA")
def test_even_odd_css_class(self):
"""
Test for BoundRow.get_even_odd_css_class() method
"""
class SimpleTable(tables.Table):
foo = tables.Column()
def get_top_pinned_data(self):
return [{"foo": "top-pinned"}]
def get_bottom_pinned_data(self):
return [{"foo": "bottom-pinned"}]
data = [{"foo", "bar"}, {"foo", "bas"}, {"foo", "baz"}]
simple_table = SimpleTable(data)
count = 0
prev = None
for row in simple_table.rows:
if prev:
self.assertNotEqual(row.get_even_odd_css_class(), prev.get_even_odd_css_class())
prev = row
count += 1
# count should be 5 because:
# - First row is a top pinned row.
# - Three defaults rows with data.
# - Last row is a bottom pinned row.
self.assertEqual(count, 5)
# Important!
# Length of data is five because pinned rows are added to data list.
# If pinned rows are added only in the iteration on BoundRows,
# then nothing will display if there are *only* pinned rows
self.assertEqual(len(simple_table.rows), 5)
|