def test_export_then_import_with_options(self): block = self.parse_xml_to_block( textwrap.dedent("""\ <?xml version='1.0' encoding='utf-8'?> <leafwithoption xmlns:option="http://code.edx.org/xblock/option" data1="child1" data2='with a dict'> <option:data3> child: 1 with custom option: True </option:data3> <option:data4> - 1.23 - true - some string </option:data4> </leafwithoption> """)) xml = self.export_xml_for_block(block) block_imported = self.parse_xml_to_block(xml) self.assertEqual(block_imported.data3, { "child": 1, "with custom option": True }) self.assertEqual(block_imported.data4, [1.23, True, "some string"]) self.assertEqual(xml.count("child1"), 1) self.assertTrue(blocks_are_equivalent(block, block_imported))
def test_export_then_import(self): block = self.parse_xml_to_block( textwrap.dedent("""\ <?xml version='1.0' encoding='utf-8'?> <container> <leaf data1='child1' data2='I'm also child1' /> <leaf data2="me too!" data1='child2' ></leaf> <container> <leaf data1='ʇxǝʇ uʍop-ǝpısdn' data2='whoa'> ᵾnɨȼøđɇ ȼȺn ƀɇ ŧɍɨȼꝁɏ! </leaf> </container> <leaf>Some text content.</leaf> </container> """)) xml = self.export_xml_for_block(block) block_imported = self.parse_xml_to_block(xml) # Crude checks that the XML is correct. The exact form of the XML # isn't important. self.assertEqual(xml.count("container"), 4) self.assertEqual(xml.count("child1"), 2) self.assertEqual(xml.count("child2"), 1) self.assertEqual(xml.count("ʇxǝʇ uʍop-ǝpısdn"), 1) self.assertEqual(xml.count("ᵾnɨȼøđɇ ȼȺn ƀɇ ŧɍɨȼꝁɏ!"), 1) # The important part: exporting then importing a block should give # you an equivalent block. self.assertTrue(blocks_are_equivalent(block, block_imported))
def test_export_then_import_with_options(self): block = self.parse_xml_to_block(textwrap.dedent("""\ <?xml version='1.0' encoding='utf-8'?> <leafwithoption xmlns:option="http://code.edx.org/xblock/option" data1="child1" data2='with a dict'> <option:data3> child: 1 with custom option: True </option:data3> <option:data4> - 1.23 - true - some string </option:data4> </leafwithoption> """).encode('utf-8')) xml = self.export_xml_for_block(block) block_imported = self.parse_xml_to_block(xml) self.assertEqual(block_imported.data3, {"child": 1, "with custom option": True}) self.assertEqual(block_imported.data4, [1.23, True, "some string"]) self.assertEqual(xml.count(b"child1"), 1) self.assertTrue(blocks_are_equivalent(block, block_imported))
def test_export_then_import(self): block_body = """\ <?xml version='1.0' encoding='utf-8'?> <container> <leaf data1='child1' data2='I'm also child1' /> <leaf data2="me too!" data1='child2' ></leaf> <container> <leaf data1='ʇxǝʇ uʍop-ǝpısdn' data2='whoa'> ᵾnɨȼøđɇ ȼȺn ƀɇ ŧɍɨȼꝁɏ! </leaf> </container> <leaf>Some text content.</leaf> </container> """ block = self.parse_xml_to_block(textwrap.dedent(block_body).encode('utf-8')) xml = self.export_xml_for_block(block) block_imported = self.parse_xml_to_block(xml) # Crude checks that the XML is correct. The exact form of the XML # isn't important. xml = xml.decode('utf-8') self.assertEqual(xml.count("container"), 4) self.assertEqual(xml.count("child1"), 2) self.assertEqual(xml.count("child2"), 1) self.assertEqual(xml.count("ʇxǝʇ uʍop-ǝpısdn"), 1) self.assertEqual(xml.count("ᵾnɨȼøđɇ ȼȺn ƀɇ ŧɍɨȼꝁɏ!"), 1) # The important part: exporting then importing a block should give # you an equivalent block. self.assertTrue(blocks_are_equivalent(block, block_imported))
def test_export_roundtrip(self, course_dir, mock_get): # Patch network calls to retrieve the textbook TOC mock_get.return_value.text = dedent(""" <?xml version="1.0"?><table_of_contents> <entry page="5" page_label="ii" name="Table of Contents"/> </table_of_contents> """).strip() root_dir = path(self.temp_dir) print "Copying test course to temp dir {0}".format(root_dir) data_dir = path(DATA_DIR) shutil.copytree(data_dir / course_dir, root_dir / course_dir) print "Starting import" initial_import = XMLModuleStore(root_dir, source_dirs=[course_dir], xblock_mixins=(XModuleMixin, )) courses = initial_import.get_courses() self.assertEquals(len(courses), 1) initial_course = courses[0] # export to the same directory--that way things like the custom_tags/ folder # will still be there. print "Starting export" file_system = OSFS(root_dir) initial_course.runtime.export_fs = file_system.makedir(course_dir, recreate=True) root = lxml.etree.Element('root') initial_course.add_xml_to_node(root) with initial_course.runtime.export_fs.open('course.xml', 'wb') as course_xml: lxml.etree.ElementTree(root).write(course_xml, encoding='utf-8') print "Starting second import" second_import = XMLModuleStore(root_dir, source_dirs=[course_dir], xblock_mixins=(XModuleMixin, )) courses2 = second_import.get_courses() self.assertEquals(len(courses2), 1) exported_course = courses2[0] print "Checking course equality" # HACK: filenames change when changing file formats # during imports from old-style courses. Ignore them. strip_filenames(initial_course) strip_filenames(exported_course) self.assertTrue(blocks_are_equivalent(initial_course, exported_course)) self.assertEquals(initial_course.id, exported_course.id) course_id = initial_course.id print "Checking key equality" self.assertItemsEqual(initial_import.modules[course_id].keys(), second_import.modules[course_id].keys()) print "Checking module equality" for location in initial_import.modules[course_id].keys(): print("Checking", location) self.assertTrue( blocks_are_equivalent( initial_import.modules[course_id][location], second_import.modules[course_id][location]))
def test_export_roundtrip(self, course_dir, mock_get): # Patch network calls to retrieve the textbook TOC mock_get.return_value.text = dedent(""" <?xml version="1.0"?><table_of_contents> <entry page="5" page_label="ii" name="Table of Contents"/> </table_of_contents> """).strip() root_dir = path(self.temp_dir) print "Copying test course to temp dir {0}".format(root_dir) data_dir = path(DATA_DIR) shutil.copytree(data_dir / course_dir, root_dir / course_dir) print "Starting import" initial_import = XMLModuleStore(root_dir, source_dirs=[course_dir], xblock_mixins=(XModuleMixin,)) courses = initial_import.get_courses() self.assertEquals(len(courses), 1) initial_course = courses[0] # export to the same directory--that way things like the custom_tags/ folder # will still be there. print "Starting export" file_system = OSFS(root_dir) initial_course.runtime.export_fs = file_system.makeopendir(course_dir) root = lxml.etree.Element('root') initial_course.add_xml_to_node(root) with initial_course.runtime.export_fs.open('course.xml', 'w') as course_xml: lxml.etree.ElementTree(root).write(course_xml) print "Starting second import" second_import = XMLModuleStore(root_dir, source_dirs=[course_dir], xblock_mixins=(XModuleMixin,)) courses2 = second_import.get_courses() self.assertEquals(len(courses2), 1) exported_course = courses2[0] print "Checking course equality" # HACK: filenames change when changing file formats # during imports from old-style courses. Ignore them. strip_filenames(initial_course) strip_filenames(exported_course) self.assertTrue(blocks_are_equivalent(initial_course, exported_course)) self.assertEquals(initial_course.id, exported_course.id) course_id = initial_course.id print "Checking key equality" self.assertItemsEqual( initial_import.modules[course_id].keys(), second_import.modules[course_id].keys() ) print "Checking module equality" for location in initial_import.modules[course_id].keys(): print("Checking", location) self.assertTrue(blocks_are_equivalent( initial_import.modules[course_id][location], second_import.modules[course_id][location] ))