|
41 | 41 | COL_FAM3: {}, # use defaults |
42 | 42 | } |
43 | 43 | ROW_KEY1 = 'row-key1' |
| 44 | +ROW_KEY2 = 'row-key2a' |
44 | 45 | COL1 = COL_FAM1 + ':qual1' |
| 46 | +COL2 = COL_FAM1 + ':qual2' |
| 47 | +COL3 = COL_FAM2 + ':qual1' |
| 48 | +COL4 = COL_FAM3 + ':qual3' |
45 | 49 |
|
46 | 50 |
|
47 | 51 | class Config(object): |
@@ -139,6 +143,95 @@ def test_families(self): |
139 | 143 | self.assertEqual(retrieved[key], value) |
140 | 144 |
|
141 | 145 |
|
| 146 | +class TestTable_row(BaseTableTest): |
| 147 | + |
| 148 | + def test_row_when_empty(self): |
| 149 | + row1 = Config.TABLE.row(ROW_KEY1) |
| 150 | + row2 = Config.TABLE.row(ROW_KEY2) |
| 151 | + |
| 152 | + self.assertEqual(row1, {}) |
| 153 | + self.assertEqual(row2, {}) |
| 154 | + |
| 155 | + def test_row_with_columns(self): |
| 156 | + table = Config.TABLE |
| 157 | + value1 = 'value1' |
| 158 | + value2 = 'value2' |
| 159 | + value3 = 'value3' |
| 160 | + value4 = 'value4' |
| 161 | + row1_data = { |
| 162 | + COL1: value1, |
| 163 | + COL2: value2, |
| 164 | + COL3: value3, |
| 165 | + COL4: value4, |
| 166 | + } |
| 167 | + |
| 168 | + # Need to clean-up row1 after. |
| 169 | + self.rows_to_delete.append(ROW_KEY1) |
| 170 | + table.put(ROW_KEY1, row1_data) |
| 171 | + |
| 172 | + # Make sure the vanilla write succeeded. |
| 173 | + row1 = table.row(ROW_KEY1) |
| 174 | + self.assertEqual(row1, row1_data) |
| 175 | + |
| 176 | + # Pick out specific columns. |
| 177 | + row1_diff_fams = table.row(ROW_KEY1, columns=[COL1, COL4]) |
| 178 | + self.assertEqual(row1_diff_fams, {COL1: value1, COL4: value4}) |
| 179 | + row1_single_col = table.row(ROW_KEY1, columns=[COL3]) |
| 180 | + self.assertEqual(row1_single_col, {COL3: value3}) |
| 181 | + row1_col_fam = table.row(ROW_KEY1, columns=[COL_FAM1]) |
| 182 | + self.assertEqual(row1_col_fam, {COL1: value1, COL2: value2}) |
| 183 | + row1_fam_qual_overlap1 = table.row(ROW_KEY1, columns=[COL1, COL_FAM1]) |
| 184 | + self.assertEqual(row1_fam_qual_overlap1, {COL1: value1, COL2: value2}) |
| 185 | + row1_fam_qual_overlap2 = table.row(ROW_KEY1, columns=[COL_FAM1, COL1]) |
| 186 | + self.assertEqual(row1_fam_qual_overlap2, |
| 187 | + {COL1: value1, COL2: value2}) |
| 188 | + row1_multiple_col_fams = table.row(ROW_KEY1, |
| 189 | + columns=[COL_FAM1, COL_FAM2]) |
| 190 | + self.assertEqual(row1_multiple_col_fams, |
| 191 | + {COL1: value1, COL2: value2, COL3: value3}) |
| 192 | + |
| 193 | + def test_row_with_timestamp(self): |
| 194 | + table = Config.TABLE |
| 195 | + value1 = 'value1' |
| 196 | + value2 = 'value2' |
| 197 | + value3 = 'value3' |
| 198 | + |
| 199 | + # Need to clean-up row1 after. |
| 200 | + self.rows_to_delete.append(ROW_KEY1) |
| 201 | + table.put(ROW_KEY1, {COL1: value1}) |
| 202 | + table.put(ROW_KEY1, {COL2: value2}) |
| 203 | + table.put(ROW_KEY1, {COL3: value3}) |
| 204 | + |
| 205 | + # Make sure the vanilla write succeeded. |
| 206 | + row1 = table.row(ROW_KEY1, include_timestamp=True) |
| 207 | + ts1 = row1[COL1][1] |
| 208 | + ts2 = row1[COL2][1] |
| 209 | + ts3 = row1[COL3][1] |
| 210 | + |
| 211 | + expected_row = { |
| 212 | + COL1: (value1, ts1), |
| 213 | + COL2: (value2, ts2), |
| 214 | + COL3: (value3, ts3), |
| 215 | + } |
| 216 | + self.assertEqual(row1, expected_row) |
| 217 | + |
| 218 | + # Make sure the timestamps are (strictly) ascending. |
| 219 | + self.assertTrue(ts1 < ts2 < ts3) |
| 220 | + |
| 221 | + # Use timestamps to retrieve row. |
| 222 | + first_two = table.row(ROW_KEY1, timestamp=ts2 + 1, |
| 223 | + include_timestamp=True) |
| 224 | + self.assertEqual(first_two, { |
| 225 | + COL1: (value1, ts1), |
| 226 | + COL2: (value2, ts2), |
| 227 | + }) |
| 228 | + first_one = table.row(ROW_KEY1, timestamp=ts2, |
| 229 | + include_timestamp=True) |
| 230 | + self.assertEqual(first_one, { |
| 231 | + COL1: (value1, ts1), |
| 232 | + }) |
| 233 | + |
| 234 | + |
142 | 235 | class TestTableCounterMethods(BaseTableTest): |
143 | 236 |
|
144 | 237 | def test_counter_get(self): |
|
0 commit comments