import pytest

from mock import Mock
from io import BytesIO

from data.userfiles import DelegateUserfiles, Userfiles
from test.fixtures import *


@pytest.mark.parametrize('prefix,path,expected', [
  ('test', 'foo', 'test/foo'),
  ('test', 'bar', 'test/bar'),
  ('test', '/bar', 'test/bar'),
  ('test', '../foo', 'test/foo'),
  ('test', 'foo/bar/baz', 'test/baz'),
  ('test', 'foo/../baz', 'test/baz'),

  (None, 'foo', 'foo'),
  (None, 'foo/bar/baz', 'baz'),
])
def test_filepath(prefix, path, expected):
  userfiles = DelegateUserfiles(None, None, 'local_us', prefix)
  assert userfiles.get_file_id_path(path) == expected


def test_lookup_userfile(app, client):
  uuid = 'deadbeef-dead-beef-dead-beefdeadbeef'
  bad_uuid = 'deadduck-dead-duck-dead-duckdeadduck'
  upper_uuid = 'DEADBEEF-DEAD-BEEF-DEAD-BEEFDEADBEEF'

  def _stream_read_file(locations, path):
    if path.find(uuid) > 0 or path.find(upper_uuid) > 0:
      return BytesIO("hello world")

    raise IOError('Not found!')

  storage_mock = Mock()
  storage_mock.stream_read_file = _stream_read_file

  app.config['USERFILES_PATH'] = 'foo'
  Userfiles(app, distributed_storage=storage_mock)

  rv = client.open('/userfiles/' + uuid, method='GET')
  assert rv.status_code == 200

  rv = client.open('/userfiles/' + upper_uuid, method='GET')
  assert rv.status_code == 200

  rv = client.open('/userfiles/' + bad_uuid, method='GET')
  assert rv.status_code == 404

  rv = client.open('/userfiles/foo/bar/baz', method='GET')
  assert rv.status_code == 404