Skip to content

Commit f29793d

Browse files
authored
Merge pull request #223 from taketo1113/api-upload
Add Upload Reports API
2 parents 74ab981 + cdee33e commit f29793d

3 files changed

Lines changed: 37 additions & 2 deletions

File tree

src/tram/urls.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,13 @@
4141
path("api/", include(router.urls)),
4242
path("api/token/", TokenObtainPairView.as_view(), name="token_obtain_pair"),
4343
path("api/token/refresh/", TokenRefreshView.as_view(), name="token_refresh"),
44+
path("api/upload/", views.upload_api),
4445
path("api/download/<int:doc_id>", views.download_document),
4546
path("api/train-model/<name>", views.train_model),
4647
path("docs/", TemplateView.as_view(template_name="tram_documentation.html")),
4748
path("login/", auth_views.LoginView.as_view()),
4849
path("logout/", auth_views.LogoutView.as_view()),
49-
path("upload/", views.upload),
50+
path("upload/", views.upload_web),
5051
path("admin/", admin.site.urls),
5152
path("ml/", views.ml_home),
5253
path("ml/techniques/<str:attack_id>", views.ml_technique_sentences),

src/tram/views.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,15 @@ def index(request):
130130

131131
@login_required
132132
@require_POST
133+
def upload_web(request):
134+
return upload(request)
135+
136+
137+
@api_view(["POST"])
138+
def upload_api(request):
139+
return upload(request)
140+
141+
133142
def upload(request):
134143
"""Places a file into ml-pipeline for analysis"""
135144
# Initialize the processing job.
@@ -138,6 +147,9 @@ def upload(request):
138147
# Initialize response.
139148
response = {"message": "File saved for processing."}
140149

150+
if request.FILES.get("file") is None:
151+
return HttpResponseBadRequest("'file' field is required but was not provided")
152+
141153
file_content_type = request.FILES["file"].content_type
142154
if file_content_type in (
143155
"application/pdf", # .pdf files
@@ -165,7 +177,6 @@ def upload(request):
165177

166178
return JsonResponse(response)
167179

168-
169180
@login_required
170181
def ml_home(request):
171182
techniques = AttackObject.get_sentence_counts()

tests/tram/test_views.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,29 @@ def test_upload_unsupported_file_type_causes_bad_request(self, logged_in_client)
180180
assert response.content == b"Unsupported file type"
181181

182182

183+
@pytest.mark.django_db
184+
class TestUploadApi:
185+
def test_upload_api(self, logged_in_client):
186+
# Arrange
187+
f = SimpleUploadedFile(
188+
"test-report.pdf", b"test file content", content_type="application/pdf"
189+
)
190+
data = {"file": f}
191+
192+
# Act
193+
response = logged_in_client.post("/api/upload/", data)
194+
195+
# Assert
196+
assert response.status_code == 200 # HTTP 200 Ok
197+
198+
def test_upload_api_404(self, logged_in_client):
199+
# Act
200+
response = logged_in_client.post("/api/upload/")
201+
202+
# Assert
203+
assert response.status_code == 400 # HTTP 400 Bad Request
204+
205+
183206
@pytest.mark.django_db
184207
class TestMappingViewSet:
185208
def test_get_mappings(self, logged_in_client):

0 commit comments

Comments
 (0)