def test_migrate_boolean_attributes_missing_attribute(ddb_url): class LBAModel(Model): class Meta: table_name = 'migration_test_lba_to_ba' host = ddb_url id = UnicodeAttribute(hash_key=True) flag = LegacyBooleanAttribute(null=True) LBAModel.create_table(read_capacity_units=1, write_capacity_units=1, wait=True) LBAModel('pkey', flag=True).save() with pytest.raises(ValueError) as e: migrate_boolean_attributes(LBAModel, ['flag', 'bogus'], allow_rate_limited_scan_without_consumed_capacity=True) assert str(e.value).find('does not exist on model') != -1
def test_migrate_boolean_attributes_missing_attribute(ddb_url): class LBAModel(Model): class Meta: table_name = 'migration_test_lba_to_ba' host = ddb_url id = UnicodeAttribute(hash_key=True) flag = LegacyBooleanAttribute(null=True) LBAModel.create_table(read_capacity_units=1, write_capacity_units=1) LBAModel('pkey', flag=True).save() with pytest.raises(ValueError) as e: migrate_boolean_attributes( LBAModel, ['flag', 'bogus'], allow_rate_limited_scan_without_consumed_capacity=True) assert str(e.value).find('does not exist on model') != -1
def test_migrate_boolean_attributes_upgrade_path(ddb_url): class BAModel(Model): class Meta: table_name = 'migration_test_lba_to_ba' host = ddb_url id = UnicodeAttribute(hash_key=True) flag = BooleanAttribute(null=True) class LBAModel(Model): class Meta: table_name = 'migration_test_lba_to_ba' host = ddb_url id = UnicodeAttribute(hash_key=True) flag = LegacyBooleanAttribute(null=True) LBAModel.create_table(read_capacity_units=1, write_capacity_units=1, wait=True) # Create one "offending" object written as an integer using LBA. LBAModel('pkey', flag=True).save() assert 1 == len([_ for _ in LBAModel.query('pkey', LBAModel.flag == True)]) # We should NOT be able to read it using BA. assert 0 == len([_ for _ in BAModel.query('pkey', BAModel.flag == True)]) # ... unless we jump through hoops using Path assert 1 == len([_ for _ in BAModel.query('pkey', Path('flag') == 1)]) # Migrate the object to being stored as Boolean. assert (1, 0) == migrate_boolean_attributes(BAModel, ['flag'], allow_rate_limited_scan_without_consumed_capacity=True) # We should now be able to read it using BA. assert 1 == len([_ for _ in BAModel.query('pkey', BAModel.flag == True)]) # ... or through the hoop jumping. assert 1 == len([_ for _ in BAModel.query('pkey', Path('flag') == True)])
def test_migrate_boolean_attributes_skip_native_booleans(ddb_url): class BAModel(Model): class Meta: table_name = 'migration_test_lba_to_ba' host = ddb_url id = UnicodeAttribute(hash_key=True) flag = BooleanAttribute(null=True) BAModel.create_table(read_capacity_units=1, write_capacity_units=1, wait=True) BAModel('pkey', flag=True).save() assert (0, 0) == migrate_boolean_attributes(BAModel, ['flag'], allow_rate_limited_scan_without_consumed_capacity=True)
def test_migrate_boolean_attributes_none_okay(ddb_url): """Ensure migration works for attributes whose value is None.""" class LBAModel(Model): class Meta: table_name = 'migration_test_lba_to_ba' host = ddb_url id = UnicodeAttribute(hash_key=True) flag = LegacyBooleanAttribute(null=True) LBAModel.create_table(read_capacity_units=1, write_capacity_units=1, wait=True) LBAModel('pkey', flag=None).save() assert (0, 0) == migrate_boolean_attributes(LBAModel, ['flag'], allow_rate_limited_scan_without_consumed_capacity=True)
def test_migrate_boolean_attributes_multiple_attributes(ddb_url): class LBAModel(Model): class Meta: table_name = 'migration_test_lba_to_ba' host = ddb_url id = UnicodeAttribute(hash_key=True) flag = LegacyBooleanAttribute(null=True) flag2 = LegacyBooleanAttribute(null=True) LBAModel.create_table(read_capacity_units=1, write_capacity_units=1, wait=True) # specifically use None and True here rather than two Trues LBAModel('pkey', flag=None, flag2=True).save() assert (1, 0) == migrate_boolean_attributes(LBAModel, ['flag', 'flag2'], allow_rate_limited_scan_without_consumed_capacity=True)
def test_migrate_two_or_more_boolean_attributes_upgrade_path(ddb_url): class BAModel(Model): class Meta: table_name = 'migration_test_lba_to_ba_two_or_more_attrs' host = ddb_url id = UnicodeAttribute(hash_key=True) flag = BooleanAttribute(null=True) second_flag = BooleanAttribute(null=True) class LBAModel(Model): class Meta: table_name = 'migration_test_lba_to_ba_two_or_more_attrs' host = ddb_url id = UnicodeAttribute(hash_key=True) flag = LegacyBooleanAttribute(null=True) second_flag = LegacyBooleanAttribute(null=True) LBAModel.create_table(read_capacity_units=1, write_capacity_units=1, wait=True) # Create one "offending" object written as an integer using LBA. LBAModel('pkey', flag=True, second_flag=True).save() assert 1 == len([_ for _ in LBAModel.query('pkey', LBAModel.flag == True)]) assert LBAModel.get('pkey').second_flag == True # We should NOT be able to read it using BA. assert 0 == len([_ for _ in BAModel.query('pkey', BAModel.flag == True)]) # ... unless we jump through hoops using Path assert 1 == len([_ for _ in BAModel.query('pkey', Path('flag') == 1)]) # Migrate the object to being stored as Boolean. assert (1, 0) == migrate_boolean_attributes( BAModel, ['flag', 'second_flag'], allow_rate_limited_scan_without_consumed_capacity=True) # We should now be able to read it using BA. assert 1 == len([_ for _ in BAModel.query('pkey', BAModel.flag == True)]) # ... or through the hoop jumping. assert 1 == len([_ for _ in BAModel.query('pkey', Path('flag') == True)]) # checking that both attributes are changed the_item = BAModel.get('pkey') assert the_item.flag == True assert the_item.second_flag == True LBAModel.delete_table()
def test_migrate_boolean_attributes_skip_native_booleans(ddb_url): class BAModel(Model): class Meta: table_name = 'migration_test_lba_to_ba' host = ddb_url id = UnicodeAttribute(hash_key=True) flag = BooleanAttribute(null=True) BAModel.create_table(read_capacity_units=1, write_capacity_units=1) BAModel('pkey', flag=True).save() assert (0, 0) == migrate_boolean_attributes( BAModel, ['flag'], allow_rate_limited_scan_without_consumed_capacity=True)
def test_migrate_boolean_attributes_none_okay(ddb_url): """Ensure migration works for attributes whose value is None.""" class LBAModel(Model): class Meta: table_name = 'migration_test_lba_to_ba' host = ddb_url id = UnicodeAttribute(hash_key=True) flag = LegacyBooleanAttribute(null=True) LBAModel.create_table(read_capacity_units=1, write_capacity_units=1) LBAModel('pkey', flag=None).save() assert (0, 0) == migrate_boolean_attributes( LBAModel, ['flag'], allow_rate_limited_scan_without_consumed_capacity=True)
def test_migrate_boolean_attributes_multiple_attributes(ddb_url): class LBAModel(Model): class Meta: table_name = 'migration_test_lba_to_ba' host = ddb_url id = UnicodeAttribute(hash_key=True) flag = LegacyBooleanAttribute(null=True) flag2 = LegacyBooleanAttribute(null=True) LBAModel.create_table(read_capacity_units=1, write_capacity_units=1) # specifically use None and True here rather than two Trues LBAModel('pkey', flag=None, flag2=True).save() assert (1, 0) == migrate_boolean_attributes( LBAModel, ['flag', 'flag2'], allow_rate_limited_scan_without_consumed_capacity=True)