Browse Source

DIV-1041: Add delete doc to poc and unit tests.

pull/170/head
Steven Ly 5 years ago
parent
commit
3a2531a4f4
6 changed files with 143 additions and 5 deletions
  1. +94
    -0
      edivorce/apps/core/tests/test_storage.py
  2. +10
    -0
      edivorce/apps/poc/models.py
  3. +27
    -0
      edivorce/apps/poc/templates/poc/document_confirm_delete.html
  4. +4
    -3
      edivorce/apps/poc/templates/storage.html
  5. +2
    -1
      edivorce/apps/poc/urls.py
  6. +6
    -1
      edivorce/apps/poc/views.py

+ 94
- 0
edivorce/apps/core/tests/test_storage.py View File

@ -0,0 +1,94 @@
from unittest import mock
from django.core.files.uploadedfile import SimpleUploadedFile
from django.test import TransactionTestCase
from redis.exceptions import ConnectionError
from edivorce.apps.core.redis import generate_unique_filename
from edivorce.apps.poc.models import Document
class UploadStorageTests(TransactionTestCase):
@mock.patch('redis.connection.ConnectionPool.get_connection')
def test_storage_connection_error(self, mock_redis):
mock_redis.side_effect = ConnectionError()
original_count = Document.objects.count()
connection_error = False
try:
file = SimpleUploadedFile('file.txt', b'this is some content')
test = Document()
test.file = file
test.save()
except ConnectionError:
connection_error = True
self.assertTrue(connection_error)
self.assertEqual(Document.objects.count(), original_count)
@mock.patch('edivorce.apps.core.redis.RedisStorage.get_available_name')
@mock.patch('edivorce.apps.core.redis.RedisStorage._save')
def test_storage_file_name_match(self, mock_redis_an, mock_redis_save):
mock_redis_an.return_value = 'file.txt'
mock_redis_save.return_value = 'file.txt'
file = SimpleUploadedFile('file.txt', b'this is some content')
test = Document()
test.file = file
test.save()
self.assertTrue(mock_redis_save.called)
self.assertEqual(test.filename, test.file.name)
@mock.patch('edivorce.apps.core.redis.RedisStorage.get_available_name')
@mock.patch('edivorce.apps.core.redis.RedisStorage._save')
def test_storage_redis_storage(self, mock_redis_an, mock_redis_save):
mock_redis_an.return_value = '6061bebb-f2be-4a74-8757-c4063f6f6993_file_txt'
mock_redis_save.return_value = 'file.txt'
file = SimpleUploadedFile('file.txt', b'this is some content')
test = Document()
test.file = file
test.save()
self.assertTrue(mock_redis_save.called)
self.assertEqual(Document.objects.count(), 1)
test = Document.objects.get(id=test.id)
self.assertEqual(test.filename, 'file.txt')
self.assertNotEqual(test.file.name, 'file.txt')
def test_storage_redis_key(self):
name = 'file.txt'
self.assertNotEqual(generate_unique_filename(None, name), name)
name = '../../../etc/passwd'
self.assertNotEqual(generate_unique_filename(None, name), name)
self.assertFalse('../../' in generate_unique_filename(None, name))
name = '../../../etc/passwd%00.png'
self.assertNotEqual(generate_unique_filename(None, name), name)
self.assertFalse('../../' in generate_unique_filename(None, name))
name = '..%2F..%2F..%2Fetc%2F'
self.assertNotEqual(generate_unique_filename(None, name), name)
self.assertFalse('../../' in generate_unique_filename(None, name))
@mock.patch('edivorce.apps.core.redis.RedisStorage.get_available_name')
@mock.patch('edivorce.apps.core.redis.RedisStorage._save')
@mock.patch('edivorce.apps.core.redis.RedisStorage.delete')
def test_storage_redis_delete(self, mock_redis_an, mock_redis_save, mock_redis_delete):
mock_redis_an.return_value = '6061bebb-f2be-4a74-8757-c4063f6f6993_file_txt'
mock_redis_save.return_value = 'file.txt'
mock_redis_delete.return_value = True
file = SimpleUploadedFile('file.txt', b'this is some content')
test = Document()
test.file = file
test.save()
test.delete()
self.assertTrue(mock_redis_delete.called)

+ 10
- 0
edivorce/apps/poc/models.py View File

@ -15,3 +15,13 @@ class Document(models.Model):
self.filename = self.file.name
super(Document, self).save(*args, **kwargs)
def delete(self, **kwargs):
"""
Override delete so we can delete the Redis object when this instance is deleted.
:param kwargs:
:return:
"""
self.file.delete(save=False)
super(Document, self).delete(**kwargs)

+ 27
- 0
edivorce/apps/poc/templates/poc/document_confirm_delete.html View File

@ -0,0 +1,27 @@
{% extends 'base.html' %}
{% load input_field %}
{% load step_order %}
{% load load_json %}
{% block title %}{{ block.super }}: POC{% endblock %}
{% block progress %}{% include "partials/progress.html" %}{% endblock %}
{% block content %}
<form method="post">{% csrf_token %}
<p>Are you sure you want to delete "{{ object }}"?</p>
<input type="submit" value="Confirm">
</form>
{% endblock %}
{% block formbuttons %}
{% endblock %}
{% block sidebarNav %}
<!-- no sidebar -->
{% endblock %}
{% block sidebar %}
<!-- no sidebar -->
{% endblock %}

+ 4
- 3
edivorce/apps/poc/templates/storage.html View File

@ -10,7 +10,7 @@
{% block content %}
<h1><small>Proof of Concept:</small>File storage</h1>
<form method="post" enctype="multipart/form-data">
<form id="form" method="post" enctype="multipart/form-data">
{% csrf_token %}
<div class="question-well">
@ -32,11 +32,12 @@
<div class="question-well">
<h3>Stored documents</h3>
<table class="table table-bordered">
<table class="table">
<thead>
<tr>
<th>File name</th>
<th>Redis key</th>
<th></th>
</tr>
</thead>
<tbody>
@ -48,6 +49,7 @@
</a>
</td>
<td class="fact-sheet-question">{{ document.file.name }}</td>
<td><a href="{% url "poc-storage-delete" document.id %}" class="delete-link">Delete</a></td>
</tr>
{% endfor %}
</tbody>
@ -55,7 +57,6 @@
</div>
</form>
{% endblock %}
{% block formbuttons %}


+ 2
- 1
edivorce/apps/poc/urls.py View File

@ -5,6 +5,7 @@ from ..core.decorators import bceid_required
urlpatterns = [
url(r'scan', bceid_required(views.UploadScan.as_view()), name="poc-scan"),
url(r'storage/doc/(?P<document_id>\d+)', views.view_document_file, name="poc-storage-download"),
url(r'storage/doc/(?P<document_id>\d+)', bceid_required(views.view_document_file), name="poc-storage-download"),
url(r'storage/delete/(?P<pk>\d+)', bceid_required(views.UploadStorageDelete.as_view()), name="poc-storage-delete"),
url(r'storage', bceid_required(views.UploadStorage.as_view()), name="poc-storage"),
]

+ 6
- 1
edivorce/apps/poc/views.py View File

@ -1,5 +1,5 @@
from django.shortcuts import render
from django.views.generic.edit import FormView, CreateView
from django.views.generic.edit import FormView, CreateView, DeleteView
from django import forms
from django.http import HttpResponse
@ -36,6 +36,11 @@ class UploadStorage(CreateView):
return super(UploadStorage, self).get_context_data(**kwargs)
class UploadStorageDelete(DeleteView):
model = Document
success_url = '/poc/storage'
def view_document_file(request, document_id):
doc = Document.objects.get(id=document_id)


Loading…
Cancel
Save