# coding=utf-8

import pytest

import osex

import os

def test_local_db_files(tmpdir):
    test_dir_path = tmpdir.strpath
    os.chdir(test_dir_path)
    # prepare dir
    open('file1', 'w').close()
    open('file2', 'w').close()
    os.makedirs(os.path.join('dir', 'subdir1'))
    os.makedirs(os.path.join('dir', 'subdir2'))
    # update db
    database_path = os.path.join(test_dir_path, 'db')
    osex.update_locate_database(database_path = database_path, root_path = test_dir_path, require_visibility = False)
    # locate
    results = osex.locate(
        [test_dir_path + '*file*'],
        database_path = database_path
        )
    assert results == [os.path.join(test_dir_path, p) for p in [
        'file1',
        'file2',
        ]]

def test_local_db_files_unicode(tmpdir):
    test_dir_path = tmpdir.strpath
    os.chdir(test_dir_path)
    # prepare dir
    open(u'file-ä', 'w').close()
    open(u'file-Ö', 'w').close()
    open(u'file-ß', 'w').close()
    # update db
    database_path = os.path.join(test_dir_path, 'db')
    osex.update_locate_database(database_path = database_path, root_path = test_dir_path, require_visibility = False)
    # locate
    results = osex.locate(
        [test_dir_path + '*file*'],
        database_path = database_path
        )
    expected_results = [os.path.join(test_dir_path, p) for p in [
        u'file-ä',
        u'file-Ö',
        u'file-ß',
        ]]
    assert results.sort() == expected_results.sort()

def test_local_db_dirs(tmpdir):
    test_dir_path = tmpdir.strpath
    os.chdir(test_dir_path)
    # prepare dir
    open('file1', 'w').close()
    open('file2', 'w').close()
    os.makedirs(os.path.join('dir', 'subdir1'))
    os.makedirs(os.path.join('dir', 'subdir2'))
    # update db
    database_path = os.path.join(test_dir_path, 'db')
    osex.update_locate_database(database_path = database_path, root_path = test_dir_path, require_visibility = False)
    # locate
    results = osex.locate(
        [test_dir_path + '*dir*'],
        database_path = database_path
        )
    assert results == [os.path.join(test_dir_path, p) for p in [
        'dir',
        os.path.join('dir', 'subdir1'),
        os.path.join('dir', 'subdir2'),
        ]]

def test_local_db_subtree(tmpdir):
    test_dir_path = tmpdir.strpath
    os.chdir(test_dir_path)
    # prepare dir
    os.makedirs(os.path.join('dir1', 'subdir1'))
    os.makedirs(os.path.join('dir1', 'subdir2'))
    os.makedirs(os.path.join('dir2', 'subdir3'))
    os.makedirs(os.path.join('dir2', 'subdir4'))
    # update db
    database_path = os.path.join(test_dir_path, 'db')
    osex.update_locate_database(
            database_path = database_path,
            root_path = os.path.join(test_dir_path, 'dir2'),
            require_visibility = False
            )
    # locate
    results = osex.locate(
        [test_dir_path + '*subdir*'],
        database_path = database_path
        )
    assert results == [os.path.join(test_dir_path, p) for p in [
        os.path.join('dir2', 'subdir3'),
        os.path.join('dir2', 'subdir4'),
        ]]