Skip to content

Commit

Permalink
Handle old-style index-only field in message store event migrator.
Browse files Browse the repository at this point in the history
  • Loading branch information
jerith committed Dec 17, 2014
1 parent f6ea7a5 commit 724a630
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 0 deletions.
5 changes: 5 additions & 0 deletions vumi/components/message_store_migrators.py
Expand Up @@ -22,6 +22,11 @@ class EventMigrator(MessageMigratorBase):
def migrate_from_unversioned(self, mdata):
mdata.set_value('$VERSION', 1)

if 'message' not in mdata.old_data:
# We have an old-style index-only field here, so add the data.
[message_id] = mdata.old_index['message_bin']
mdata.old_data['message'] = message_id

self._copy_msg_field('event', mdata)
mdata.copy_values('message')
mdata.copy_indexes('message_bin')
Expand Down
36 changes: 36 additions & 0 deletions vumi/components/tests/test_message_store_migrators.py
Expand Up @@ -117,6 +117,42 @@ def test_reverse_migrate_v1_vnone(self):
self.assertEqual(old_record.event, event)
self.assertEqual(old_record.message.key, msg_id)

@inlineCallbacks
def test_migrate_vnone_to_v1_index_only_foreign_key(self):
"""
A vNone model can be migrated to v1 even if it's old enough to still
have index-only foreign keys.
"""
msg = self.msg_helper.make_outbound("outbound")
msg_id = msg["message_id"]
event = self.msg_helper.make_ack(msg)
old_record = self.event_vnone(
event["event_id"], event=event, message=msg_id)

# Remove the foreign key field from the data before saving it.
old_record._riak_object.delete_data_field("message")
yield old_record.save()

new_record = yield self.event_v1.load(old_record.key)
self.assertEqual(new_record.event, event)
self.assertEqual(new_record.message.key, msg_id)

# The migration doesn't set the new fields and indexes, that only
# happens at save time.

self.assertEqual(new_record.message_with_status, None)
self.assertEqual(new_record._riak_object.get_indexes(), set([
("message_bin", msg_id),
]))

yield new_record.save()
self.assertEqual(
new_record.message_with_status, mws_value(msg_id, event, "ack"))
self.assertEqual(new_record._riak_object.get_indexes(), set([
("message_bin", msg_id),
("message_with_status_bin", mws_value(msg_id, event, "ack")),
]))


class TestOutboundMessageMigrator(TestMigratorBase):
@inlineCallbacks
Expand Down

0 comments on commit 724a630

Please sign in to comment.