import os
import pytest
from werkzeug.datastructures import FileStorage

from atst.domain.csp.files import RackspaceFileProvider
from atst.domain.exceptions import UploadError

from tests.mocks import PDF_FILENAME


@pytest.fixture
def uploader(app):
    return RackspaceFileProvider(app)


NONPDF_FILENAME = "tests/fixtures/disa-pki.html"


def test_upload(app, uploader, pdf_upload):
    object_name = uploader.upload(pdf_upload)
    upload_dir = app.config["STORAGE_CONTAINER"]
    assert os.path.isfile(os.path.join(upload_dir, object_name))


def test_upload_fails_for_non_pdfs(uploader):
    with open(NONPDF_FILENAME, "rb") as fp:
        fs = FileStorage(fp, content_type="text/plain")
        with pytest.raises(UploadError):
            uploader.upload(fs)


def test_download(app, uploader, pdf_upload):
    # write pdf content to upload file storage and make sure it is flushed to
    # disk
    pdf_upload.seek(0)
    pdf_content = pdf_upload.read()
    pdf_upload.close()
    upload_dir = app.config["STORAGE_CONTAINER"]
    full_path = os.path.join(upload_dir, "abc")
    with open(full_path, "wb") as output_file:
        output_file.write(pdf_content)
        output_file.flush()

    stream = uploader.download("abc")
    stream_content = b"".join([b for b in stream])
    assert pdf_content == stream_content


def test_downloading_uploaded_object(uploader, pdf_upload):
    object_name = uploader.upload(pdf_upload)
    stream = uploader.download(object_name)
    stream_content = b"".join([b for b in stream])

    pdf_upload.seek(0)
    pdf_content = pdf_upload.read()

    assert stream_content == pdf_content
