114 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
 | 
						|
import os
 | 
						|
import shutil
 | 
						|
import tempfile
 | 
						|
import unittest
 | 
						|
 | 
						|
import mock
 | 
						|
from mock import MagicMock, sentinel
 | 
						|
 | 
						|
import AnkiServer
 | 
						|
from AnkiServer.importer import get_importer_class, import_file
 | 
						|
 | 
						|
import anki.storage
 | 
						|
 | 
						|
# TODO: refactor into some kind of utility
 | 
						|
def add_note(col, data):
 | 
						|
    from anki.notes import Note
 | 
						|
 | 
						|
    model = col.models.byName(data['model'])
 | 
						|
 | 
						|
    note = Note(col, model)
 | 
						|
    for name, value in data['fields'].items():
 | 
						|
        note[name] = value
 | 
						|
 | 
						|
    if data.has_key('tags'):
 | 
						|
        note.setTagsFromStr(data['tags'])
 | 
						|
 | 
						|
    col.addNote(note)
 | 
						|
 | 
						|
class ImporterTest(unittest.TestCase):
 | 
						|
    def setUp(self):
 | 
						|
        self.temp_dir = tempfile.mkdtemp()
 | 
						|
        self.collection_path = os.path.join(self.temp_dir, 'collection.anki2')
 | 
						|
        self.collection = anki.storage.Collection(self.collection_path)
 | 
						|
 | 
						|
    def tearDown(self):
 | 
						|
        self.collection.close()
 | 
						|
        self.collection = None
 | 
						|
        shutil.rmtree(self.temp_dir)
 | 
						|
 
 | 
						|
 | 
						|
    # TODO: refactor into a parent class
 | 
						|
    def add_default_note(self, count=1):
 | 
						|
        data = {
 | 
						|
            'model': 'Basic',
 | 
						|
            'fields': {
 | 
						|
                'Front': 'The front',
 | 
						|
                'Back': 'The back',
 | 
						|
            },
 | 
						|
            'tags': "Tag1 Tag2",
 | 
						|
        }
 | 
						|
        for idx in range(0, count):
 | 
						|
            add_note(self.collection, data)
 | 
						|
            self.add_note(data)
 | 
						|
 | 
						|
    def test_resync(self):
 | 
						|
        from anki.exporting import AnkiPackageExporter
 | 
						|
        from anki.utils import intTime
 | 
						|
 | 
						|
        # create a new collection with a single note
 | 
						|
        src_collection = anki.storage.Collection(os.path.join(self.temp_dir, 'src_collection.anki2'))
 | 
						|
        add_note(src_collection, {
 | 
						|
            'model': 'Basic',
 | 
						|
            'fields': {
 | 
						|
              'Front': 'The front',
 | 
						|
              'Back': 'The back',
 | 
						|
            },
 | 
						|
            'tags': 'Tag1 Tag2',
 | 
						|
        })
 | 
						|
        note_id = src_collection.findNotes('')[0]
 | 
						|
        note = src_collection.getNote(note_id)
 | 
						|
        self.assertEqual(note.id, note_id)
 | 
						|
        self.assertEqual(note['Front'], 'The front')
 | 
						|
        self.assertEqual(note['Back'], 'The back')
 | 
						|
 | 
						|
        # export to an .apkg file
 | 
						|
        dst1_path = os.path.join(self.temp_dir, 'export1.apkg')
 | 
						|
        exporter = AnkiPackageExporter(src_collection)
 | 
						|
        exporter.exportInto(dst1_path)
 | 
						|
 | 
						|
        # import it into the main collection
 | 
						|
        import_file(get_importer_class('apkg'), self.collection, dst1_path)
 | 
						|
 | 
						|
        # make sure the note exists
 | 
						|
        note = self.collection.getNote(note_id)
 | 
						|
        self.assertEqual(note.id, note_id)
 | 
						|
        self.assertEqual(note['Front'], 'The front')
 | 
						|
        self.assertEqual(note['Back'], 'The back')
 | 
						|
 | 
						|
        # now we change the source collection and re-export it
 | 
						|
        note = src_collection.getNote(note_id)
 | 
						|
        note['Front'] = 'The new front'
 | 
						|
        note.tags.append('Tag3')
 | 
						|
        note.flush(intTime()+1)
 | 
						|
        dst2_path = os.path.join(self.temp_dir, 'export2.apkg')
 | 
						|
        exporter = AnkiPackageExporter(src_collection)
 | 
						|
        exporter.exportInto(dst2_path)
 | 
						|
 | 
						|
        # first, import it without allow_update - no change should happen
 | 
						|
        import_file(get_importer_class('apkg'), self.collection, dst2_path)
 | 
						|
        note = self.collection.getNote(note_id)
 | 
						|
        self.assertEqual(note['Front'], 'The front')
 | 
						|
        self.assertEqual(note.tags, ['Tag1', 'Tag2'])
 | 
						|
 | 
						|
        # now, import it with allow_update=True, so the note should change
 | 
						|
        import_file(get_importer_class('apkg'), self.collection, dst2_path, allow_update=True)
 | 
						|
        note = self.collection.getNote(note_id)
 | 
						|
        self.assertEqual(note['Front'], 'The new front')
 | 
						|
        self.assertEqual(note.tags, ['Tag1', 'Tag2', 'Tag3'])
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
    unittest.main()
 | 
						|
 |