Merge pull request #566 from dod-ccpo/upload-csp-estimate
Upload proof of CSP estimate
This commit is contained in:
@@ -44,3 +44,14 @@ def test_download(app, uploader, pdf_upload):
|
||||
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
|
||||
|
@@ -2,6 +2,7 @@ import pytest
|
||||
|
||||
from atst.domain.task_orders import TaskOrders, TaskOrderError
|
||||
from atst.domain.exceptions import UnauthorizedError
|
||||
from atst.models.attachment import Attachment
|
||||
|
||||
from tests.factories import (
|
||||
TaskOrderFactory,
|
||||
@@ -26,10 +27,18 @@ def test_is_section_complete():
|
||||
|
||||
def test_all_sections_complete():
|
||||
task_order = TaskOrderFactory.create()
|
||||
attachment = Attachment(
|
||||
filename="sample_attachment",
|
||||
object_name="sample",
|
||||
resource="task_order",
|
||||
resource_id=task_order.id,
|
||||
)
|
||||
|
||||
custom_attrs = {"csp_estimate": attachment}
|
||||
for attr_list in TaskOrders.SECTIONS.values():
|
||||
for attr in attr_list:
|
||||
if not getattr(task_order, attr):
|
||||
setattr(task_order, attr, "str12345")
|
||||
setattr(task_order, attr, custom_attrs.get(attr, "str12345"))
|
||||
|
||||
task_order.scope = None
|
||||
assert not TaskOrders.all_sections_complete(task_order)
|
||||
|
@@ -7,6 +7,7 @@ import datetime
|
||||
from faker import Faker as _Faker
|
||||
|
||||
from atst.forms import data
|
||||
from atst.models.attachment import Attachment
|
||||
from atst.models.environment import Environment
|
||||
from atst.models.request import Request
|
||||
from atst.models.request_revision import RequestRevision
|
||||
@@ -375,6 +376,14 @@ class InvitationFactory(Base):
|
||||
expiration_time = Invitations.current_expiration_time()
|
||||
|
||||
|
||||
class AttachmentFactory(Base):
|
||||
class Meta:
|
||||
model = Attachment
|
||||
|
||||
filename = factory.Faker("domain_word")
|
||||
object_name = factory.Faker("domain_word")
|
||||
|
||||
|
||||
class TaskOrderFactory(Base):
|
||||
class Meta:
|
||||
model = TaskOrder
|
||||
@@ -401,6 +410,7 @@ class TaskOrderFactory(Base):
|
||||
lambda *args: random_future_date(year_min=2, year_max=5)
|
||||
)
|
||||
performance_length = random.randint(1, 24)
|
||||
csp_estimate = factory.SubFactory(AttachmentFactory)
|
||||
|
||||
ko_first_name = factory.Faker("first_name")
|
||||
ko_last_name = factory.Faker("last_name")
|
||||
|
BIN
tests/fixtures/sample.png
vendored
Normal file
BIN
tests/fixtures/sample.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
@@ -1,6 +1,11 @@
|
||||
from werkzeug.datastructures import FileStorage
|
||||
import pytest
|
||||
|
||||
from atst.models.attachment import Attachment
|
||||
from atst.models.task_order import TaskOrder, Status
|
||||
|
||||
from tests.factories import random_future_date, random_past_date
|
||||
from tests.mocks import PDF_FILENAME
|
||||
|
||||
|
||||
class TestTaskOrderStatus:
|
||||
@@ -30,3 +35,34 @@ def test_is_submitted():
|
||||
|
||||
to = TaskOrder(number="42")
|
||||
assert to.is_submitted
|
||||
|
||||
|
||||
class TestCSPEstimate:
|
||||
def test_setting_estimate_with_attachment(self):
|
||||
to = TaskOrder()
|
||||
attachment = Attachment(filename="sample.pdf", object_name="sample")
|
||||
to.csp_estimate = attachment
|
||||
|
||||
assert to.attachment_id == attachment.id
|
||||
|
||||
def test_setting_estimate_with_file_storage(self):
|
||||
to = TaskOrder()
|
||||
with open(PDF_FILENAME, "rb") as fp:
|
||||
fs = FileStorage(fp, content_type="application/pdf")
|
||||
to.csp_estimate = fs
|
||||
|
||||
assert to.csp_estimate is not None
|
||||
assert to.csp_estimate.filename == PDF_FILENAME
|
||||
|
||||
def test_setting_estimate_with_invalid_object(self):
|
||||
to = TaskOrder()
|
||||
with pytest.raises(TypeError):
|
||||
to.csp_estimate = "invalid"
|
||||
|
||||
def test_removing_estimate(self):
|
||||
attachment = Attachment(filename="sample.pdf", object_name="sample")
|
||||
to = TaskOrder(csp_estimate=attachment)
|
||||
assert to.csp_estimate is not None
|
||||
|
||||
to.csp_estimate = ""
|
||||
assert to.csp_estimate is None
|
||||
|
@@ -28,3 +28,46 @@ def test_download_summary(client, user_session):
|
||||
for attr, val in task_order.to_dictionary().items():
|
||||
assert attr in doc
|
||||
assert xml_translated(val) in doc
|
||||
|
||||
|
||||
class TestDownloadCSPEstimate:
|
||||
def setup(self):
|
||||
self.user = UserFactory.create()
|
||||
self.portfolio = PortfolioFactory.create(owner=self.user)
|
||||
self.task_order = TaskOrderFactory.create(
|
||||
creator=self.user, portfolio=self.portfolio
|
||||
)
|
||||
|
||||
def test_successful_download(self, client, user_session, pdf_upload):
|
||||
self.task_order.csp_estimate = pdf_upload
|
||||
user_session(self.user)
|
||||
response = client.get(
|
||||
url_for(
|
||||
"task_orders.download_csp_estimate", task_order_id=self.task_order.id
|
||||
)
|
||||
)
|
||||
assert response.status_code == 200
|
||||
|
||||
pdf_upload.seek(0)
|
||||
expected_contents = pdf_upload.read()
|
||||
assert expected_contents == response.data
|
||||
|
||||
def test_download_without_attachment(self, client, user_session):
|
||||
self.task_order.attachment_id = None
|
||||
user_session(self.user)
|
||||
response = client.get(
|
||||
url_for(
|
||||
"task_orders.download_csp_estimate", task_order_id=self.task_order.id
|
||||
)
|
||||
)
|
||||
assert response.status_code == 404
|
||||
|
||||
def test_download_with_wrong_user(self, client, user_session):
|
||||
other_user = UserFactory.create()
|
||||
user_session(other_user)
|
||||
response = client.get(
|
||||
url_for(
|
||||
"task_orders.download_csp_estimate", task_order_id=self.task_order.id
|
||||
)
|
||||
)
|
||||
assert response.status_code == 404
|
||||
|
@@ -2,6 +2,7 @@ import pytest
|
||||
from flask import url_for
|
||||
|
||||
from atst.domain.task_orders import TaskOrders
|
||||
from atst.models.attachment import Attachment
|
||||
from atst.routes.task_orders.new import ShowTaskOrderWorkflow, UpdateTaskOrderWorkflow
|
||||
|
||||
from tests.factories import UserFactory, TaskOrderFactory, PortfolioFactory
|
||||
@@ -42,7 +43,7 @@ def serialize_dates(data):
|
||||
|
||||
# TODO: this test will need to be more complicated when we add validation to
|
||||
# the forms
|
||||
def test_create_new_task_order(client, user_session):
|
||||
def test_create_new_task_order(client, user_session, pdf_upload):
|
||||
creator = UserFactory.create()
|
||||
user_session(creator)
|
||||
|
||||
@@ -65,6 +66,7 @@ def test_create_new_task_order(client, user_session):
|
||||
|
||||
funding_data = slice_data_for_section(task_order_data, "funding")
|
||||
funding_data = serialize_dates(funding_data)
|
||||
funding_data["csp_estimate"] = pdf_upload
|
||||
response = client.post(
|
||||
response.headers["Location"], data=funding_data, follow_redirects=False
|
||||
)
|
||||
@@ -124,8 +126,11 @@ def test_task_order_form_shows_errors(client, user_session):
|
||||
def task_order():
|
||||
user = UserFactory.create()
|
||||
portfolio = PortfolioFactory.create(owner=user)
|
||||
attachment = Attachment(filename="sample_attachment", object_name="sample")
|
||||
|
||||
return TaskOrderFactory.create(creator=user, portfolio=portfolio)
|
||||
return TaskOrderFactory.create(
|
||||
creator=user, portfolio=portfolio, csp_estimate=attachment
|
||||
)
|
||||
|
||||
|
||||
def test_show_task_order(task_order):
|
||||
|
Reference in New Issue
Block a user