import pytest

from config_app.config_util.tar import tarinfo_filter_partial

from util.config.validator import EXTRA_CA_DIRECTORY

from test.fixtures import *


class MockTarInfo:
  def __init__(self, name, isdir):
    self.name = name
    self.isdir = lambda: isdir

  def __eq__(self, other):
    return other is not None and self.name == other.name


@pytest.mark.parametrize('prefix,tarinfo,expected', [
  # It should handle simple files
  ('Users/sam/', MockTarInfo('Users/sam/config.yaml', False), MockTarInfo('config.yaml', False)),
  # It should allow the extra CA dir
  ('Users/sam/', MockTarInfo('Users/sam/%s' % EXTRA_CA_DIRECTORY, True), MockTarInfo('%s' % EXTRA_CA_DIRECTORY, True)),
  # it should allow a file in that extra dir
  ('Users/sam/', MockTarInfo('Users/sam/%s/cert.crt' % EXTRA_CA_DIRECTORY, False),
   MockTarInfo('%s/cert.crt' % EXTRA_CA_DIRECTORY, False)),
  # it should not allow a directory that isn't the CA dir
  ('Users/sam/', MockTarInfo('Users/sam/dirignore', True), None),
])
def test_tarinfo_filter(prefix, tarinfo, expected):
  partial = tarinfo_filter_partial(prefix)
  assert partial(tarinfo) == expected