def test_indexing_on_delete():
    # erase previously created tiddler by blanking its tags
    tiddler = UserDict()
    tiddler.title = 'HelloWorld'
    tiddler.bag = 'alpha'
    tiddler.tags = []
    hooks.tiddler_put_hook(STORE, tiddler)

    tiddler.bag = 'bravo'
    tiddler.tags = ['aaa', 'bbb', 'ccc']
    hooks.tiddler_put_hook(STORE, tiddler)

    tiddler = UserDict()
    tiddler.title = 'LoremIpsum'
    tiddler.bag = 'bravo'
    tiddler.tags = ['...', 'bbb']
    hooks.tiddler_put_hook(STORE, tiddler)

    tids, tags, rels = _retrieve_all()
    assert len(tids) == 2
    assert len(tags) == 4
    assert len(rels) == 5

    hooks.tiddler_delete_hook(STORE, tiddler)

    tids, tags, rels = _retrieve_all()
    assert len(tids) == 1
    assert tids[0][1] == 'HelloWorld'
    assert len(tags) == 3
    assert [tag[1] for tag in tags] == ['aaa', 'bbb', 'ccc']
    assert len(rels) == 3
def test_key_on_title_and_bag():
    tiddler = UserDict()
    tiddler.title = 'HelloWorld'
    tiddler.bag = 'alpha'
    tiddler.tags = ['foo', 'bar']
    hooks.tiddler_put_hook(STORE, tiddler)

    tids, tags, rels = _retrieve_all()
    assert len(tids) == 1
    assert len(tags) == 2
    assert len(rels) == 2

    tiddler.bag = 'bravo'
    hooks.tiddler_put_hook(STORE, tiddler)

    tids, tags, rels = _retrieve_all()
    assert len(tids) == 2
    assert len(tags) == 2
    assert len(rels) == 4
def test_indexing_on_create_and_modify():
    tiddler = UserDict()
    tiddler.title = 'HelloWorld'
    tiddler.bag = 'alpha'
    tiddler.tags = ['foo', 'bar']

    for i in xrange(2): # ensures dupes are ignored
        hooks.tiddler_put_hook(STORE, tiddler)

        tids, tags, rels = _retrieve_all()
        assert len(tids) == 1
        assert tids[0][1:] == ('HelloWorld', 'alpha')
        assert len(tags) == 2
        assert tags[0][1:] == ('foo',)
        assert tags[1][1:] == ('bar',)
        assert len(rels) == 2
        assert (tids[0][0], tags[0][0]) in rels
        assert (tids[0][0], tags[1][0]) in rels

    tiddler.tags = ['baz']
    hooks.tiddler_put_hook(STORE, tiddler)

    tids, tags, rels = _retrieve_all()
    assert len(tids) == 1
    assert tids[0][1:] == ('HelloWorld', 'alpha')
    assert len(tags) == 1
    assert tags[0][1:] == ('baz',)
    assert len(rels) == 1
    assert (tids[0][0], tags[0][0]) in rels

    tiddler.tags = []
    hooks.tiddler_put_hook(STORE, tiddler)

    tids, tags, rels = _retrieve_all()
    assert len(tids) == 0
    assert len(tags) == 0
    assert len(rels) == 0
def test_tags_and_tagged():
    cmd = COMMANDS['tags']

    cmd([])
    sys.stdout.pos = 0
    stdout = sys.stdout.read()
    assert stdout == '\n'

    tiddler = UserDict()
    tiddler.title = 'HelloWorld'
    tiddler.bag = 'alpha'
    tiddler.tags = ['foo', 'bar']
    hooks.tiddler_put_hook(STORE, tiddler)

    tiddler = UserDict()
    tiddler.title = 'HelloWorld'
    tiddler.bag = 'bravo'
    tiddler.tags = ['foo', 'bar']
    hooks.tiddler_put_hook(STORE, tiddler)

    tiddler = UserDict()
    tiddler.title = 'Lipsum'
    tiddler.bag = 'alpha'
    tiddler.tags = ['bar', 'baz']
    hooks.tiddler_put_hook(STORE, tiddler)

    sys.stdout.truncate(0) # reset

    cmd([])
    sys.stdout.pos = 0
    stdout = sys.stdout.read()
    assert stdout == 'foo\nbar\nbaz\n'

    sys.stdout.truncate(0) # reset

    cmd(['foo'])
    sys.stdout.pos = 0
    stdout = sys.stdout.read()
    assert stdout == 'tag: bar\ntiddler: alpha/HelloWorld\ntiddler: bravo/HelloWorld\n'

    sys.stdout.truncate(0) # reset

    cmd(['bar'])
    sys.stdout.pos = 0
    stdout = sys.stdout.read()
    assert stdout == 'tag: foo\ntag: baz\ntiddler: alpha/HelloWorld\ntiddler: bravo/HelloWorld\ntiddler: alpha/Lipsum\n'

    sys.stdout.truncate(0) # reset

    cmd(['foo', 'bar'])
    sys.stdout.pos = 0
    stdout = sys.stdout.read()
    assert stdout == 'tiddler: alpha/HelloWorld\ntiddler: bravo/HelloWorld\n'

    sys.stdout.truncate(0) # reset

    cmd(['foo', 'baz'])
    sys.stdout.pos = 0
    stdout = sys.stdout.read()
    assert stdout == '\n'

    sys.stdout.truncate(0) # reset

    cmd(['foo', 'bar', 'baz'])
    sys.stdout.pos = 0
    stdout = sys.stdout.read()
    assert stdout == '\n'