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 self.filename = self.file.name
super(Document, self).save(*args, **kwargs) 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 %} {% block content %}
<h1><small>Proof of Concept:</small>File storage</h1> <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 %} {% csrf_token %}
<div class="question-well"> <div class="question-well">
@ -32,11 +32,12 @@
<div class="question-well"> <div class="question-well">
<h3>Stored documents</h3> <h3>Stored documents</h3>
<table class="table table-bordered">
<table class="table">
<thead> <thead>
<tr> <tr>
<th>File name</th> <th>File name</th>
<th>Redis key</th> <th>Redis key</th>
<th></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -48,6 +49,7 @@
</a> </a>
</td> </td>
<td class="fact-sheet-question">{{ document.file.name }}</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> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
@ -55,7 +57,6 @@
</div> </div>
</form> </form>
{% endblock %} {% endblock %}
{% block formbuttons %} {% block formbuttons %}


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

@ -5,6 +5,7 @@ from ..core.decorators import bceid_required
urlpatterns = [ urlpatterns = [
url(r'scan', bceid_required(views.UploadScan.as_view()), name="poc-scan"), 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"), 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.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 import forms
from django.http import HttpResponse from django.http import HttpResponse
@ -36,6 +36,11 @@ class UploadStorage(CreateView):
return super(UploadStorage, self).get_context_data(**kwargs) return super(UploadStorage, self).get_context_data(**kwargs)
class UploadStorageDelete(DeleteView):
model = Document
success_url = '/poc/storage'
def view_document_file(request, document_id): def view_document_file(request, document_id):
doc = Document.objects.get(id=document_id) doc = Document.objects.get(id=document_id)


Loading…
Cancel
Save