def get_bundle_draft_direct_links_cached(bundle_uuid, draft_name): """ Get the direct links in the specified bundle draft. Cached using BundleCache so we get automatic cache invalidation when the draft is updated. """ bundle_cache = BundleCache(bundle_uuid, draft_name) cache_key = ('bundle_draft_direct_links', ) result = bundle_cache.get(cache_key) if result is None: links = blockstore_api.get_bundle_links(bundle_uuid, use_draft=draft_name).values() result = {link.name: link.direct for link in links} bundle_cache.set(cache_key, result) return result
def test_links(self): """ Test operations involving bundle links. """ coll = api.create_collection("Test Collection") # Create two library bundles and a course bundle: lib1_bundle = api.create_bundle(coll.uuid, title="Library 1", slug="lib1") lib1_draft = api.get_or_create_bundle_draft(lib1_bundle.uuid, draft_name="test-draft") lib2_bundle = api.create_bundle(coll.uuid, title="Library 1", slug="lib2") lib2_draft = api.get_or_create_bundle_draft(lib2_bundle.uuid, draft_name="other-draft") course_bundle = api.create_bundle(coll.uuid, title="Library 1", slug="course") course_draft = api.get_or_create_bundle_draft(course_bundle.uuid, draft_name="test-draft") # To create links, we need valid BundleVersions, which requires having committed at least one change: api.write_draft_file(lib1_draft.uuid, "lib1-data.txt", "hello world") api.commit_draft(lib1_draft.uuid) # Creates version 1 api.write_draft_file(lib2_draft.uuid, "lib2-data.txt", "hello world") api.commit_draft(lib2_draft.uuid) # Creates version 1 # Lib2 has no links: self.assertFalse(api.get_bundle_links(lib2_bundle.uuid)) # Create a link from lib2 to lib1 link1_name = "lib2_to_lib1" api.set_draft_link(lib2_draft.uuid, link1_name, lib1_bundle.uuid, version=1) # Now confirm the link exists in the draft: lib2_draft_links = api.get_bundle_links(lib2_bundle.uuid, use_draft=lib2_draft.name) self.assertIn(link1_name, lib2_draft_links) self.assertEqual(lib2_draft_links[link1_name].direct.bundle_uuid, lib1_bundle.uuid) self.assertEqual(lib2_draft_links[link1_name].direct.version, 1) # Now commit the change to lib2: api.commit_draft(lib2_draft.uuid) # Creates version 2 # Now create a link from course to lib2 link2_name = "course_to_lib2" api.set_draft_link(course_draft.uuid, link2_name, lib2_bundle.uuid, version=2) api.commit_draft(course_draft.uuid) # And confirm the link exists in the resulting bundle version: course_links = api.get_bundle_links(course_bundle.uuid) self.assertIn(link2_name, course_links) self.assertEqual(course_links[link2_name].direct.bundle_uuid, lib2_bundle.uuid) self.assertEqual(course_links[link2_name].direct.version, 2) # And since the links go course->lib2->lib1, course has an indirect link to lib1: self.assertEqual(course_links[link2_name].indirect[0].bundle_uuid, lib1_bundle.uuid) self.assertEqual(course_links[link2_name].indirect[0].version, 1) # Finally, test deleting a link from course's draft: api.set_draft_link(course_draft.uuid, link2_name, None, None) self.assertFalse( api.get_bundle_links(course_bundle.uuid, use_draft=course_draft.name))