Beispiel #1
0
class DocumentCreateTest(TestCase):
    def setUp(self):
        self.category = CategoryFactory()
        self.user = UserFactory(
            email='*****@*****.**',
            password='******',
            is_superuser=True,
            category=self.category,
        )
        self.create_url = reverse('document_create', args=[
            self.category.organisation.slug,
            self.category.slug,
        ])
        self.client.login(email=self.user.email, password='******')
        self.sample_path = join(settings.DJANGO_ROOT, 'documents', 'tests')

    def tearDown(self):
        """Wipe the media root directory after each test."""
        media_root = settings.MEDIA_ROOT
        if os.path.exists(media_root):
            for f in os.listdir(media_root):
                file_path = os.path.join(media_root, f)
                if os.path.isfile(file_path) and file_path.startswith('/tmp/'):
                    os.unlink(file_path)

    def test_creation_errors(self):
        """
        Tests that a document can't be created without required fields.
        """
        required_error = 'This field is required.'
        c = self.client
        r = c.get(self.create_url)
        self.assertEqual(r.status_code, 200)

        r = c.post(self.create_url, {})
        self.assertEqual(r.status_code, 200)
        self.assertEqual(r.context['form'].errors, {
            'title': [required_error],
        })

    def test_creation_errors_with_files(self):
        """
        Tests that a document can't be created with wrong files.
        """
        extension_error = 'A PDF file is not allowed in this field.'
        c = self.client
        with open(join(self.sample_path, 'sample_doc_native.docx'), mode='rb') as native_file:
            with open(join(self.sample_path, 'sample_doc_pdf.pdf'), mode='rb') as pdf_file:
                r = c.post(self.create_url, {
                    'title': 'a title',
                    'native_file': pdf_file,
                    'pdf_file': native_file,
                    'docclass': 1,
                    'created_on': '2015-10-10',
                    'received_date': '2015-10-10',
                })
                self.assertEqual(r.status_code, 200)
                self.assertEqual(r.context['revision_form'].errors, {
                    'native_file': [extension_error],
                })

    def test_creation_success(self):
        """
        Tests that a document can be created with required fields.
        """
        original_number_of_document = Document.objects.all().count()
        c = self.client
        r = c.post(self.create_url, {
            'title': 'a title',
        })
        if r.status_code == 302:
            self.assertEqual(
                original_number_of_document + 1,
                Document.objects.all().count()
            )
        else:
            # Debug purpose
            self.assertEqual(r.context['form'].errors, {})

    def test_creation_with_empty_document_key(self):
        """
        Tests that a document can be created with required fields.
        """
        c = self.client
        doc_title = 'a glorious title'
        c.post(self.create_url, {
            'title': doc_title,
            'docclass': 1,
            'created_on': '2015-10-10',
            'received_date': '2015-10-10',
        }, follow=True)
        doc = Document.objects.all().order_by('-id')[0]
        self.assertEqual(doc.document_number, 'a-glorious-title')
        self.assertEqual(doc.document_key, 'a-glorious-title')

        self.assertIsNotNone(doc.created_by)

        # Check that creation was logged in audit trail
        activity = Activity.objects.latest('created_on')
        self.assertEqual(activity.verb, Activity.VERB_CREATED)
        self.assertEqual(activity.action_object.title, doc_title)
        self.assertEqual(activity.actor, self.user)

    def test_create_with_document_key(self):
        c = self.client
        doc_title = 'another title'
        c.post(self.create_url, {
            'title': doc_title,
            'document_number': 'Gloubi Boulga',
            'docclass': 1,
            'created_on': '2015-10-10',
            'received_date': '2015-10-10',
        }, follow=True)
        doc = Document.objects.all().order_by('-id')[0]
        self.assertEqual(doc.document_number, 'Gloubi Boulga')
        self.assertEqual(doc.document_key, 'GLOUBI-BOULGA')

        # Check audit trail
        activity = Activity.objects.latest('created_on')
        self.assertEqual(activity.verb, Activity.VERB_CREATED)
        self.assertEqual(activity.action_object.title, doc_title)
        self.assertEqual(activity.actor, self.user)

    def test_creation_success_with_files(self):
        """
        Tests that a document can be created with files.
        """
        original_number_of_document = Document.objects.all().count()
        c = self.client
        with open(join(self.sample_path, 'sample_doc_native.docx'), mode='rb') as native_file:
            with open(join(self.sample_path, 'sample_doc_pdf.pdf'), mode='rb') as pdf_file:
                r = c.post(self.create_url, {
                    'title': 'a title',
                    'native_file': native_file,
                    'pdf_file': pdf_file,
                })
                if r.status_code == 302:
                    self.assertEqual(
                        original_number_of_document + 1,
                        Document.objects.all().count()
                    )
                else:
                    # Debug purpose
                    self.assertEqual(r.context['form'].errors, {})

    def test_creation_redirect(self):
        """
        Tests that a document creation is redirected to the item
        or another creation form (django-admin like).
        """
        c = self.client
        r = c.post(self.create_url, {
            'title': 'a title',
            'docclass': 1,
            'created_on': '2015-10-10',
            'received_date': '2015-10-10',
            'save-create': None,
        }, follow=True)
        self.assertEqual(r.redirect_chain, [(self.create_url, 302)])

        r = c.post(self.create_url, {
            'title': 'another title',
            'docclass': 1,
            'created_on': '2015-10-10',
            'received_date': '2015-10-10',
        }, follow=True)
        self.assertEqual(r.redirect_chain, [
            (self.category.get_absolute_url(), 302)]
        )

    def test_document_related_documents(self):
        c = self.client
        related = [
            DocumentFactory(
                category=self.category,
                document_key='FAC09001-FWF-000-HSE-REP-0004',
                metadata={
                    'title': 'HAZOP related 1',
                },
                revision={
                    'status': 'STD',
                }
            ),
            DocumentFactory(
                category=self.category,
                document_key='FAC09001-FWF-000-HSE-REP-0005',
                metadata={
                    'title': 'HAZOP related 2',
                },
                revision={
                    'status': 'STD',
                }
            )
        ]
        c.post(self.create_url, {
            'document_number': 'FAC09001-FWF-000-HSE-REP-0006',
            'title': 'HAZOP report',
            'docclass': 1,
            'created_on': '2015-10-10',
            'received_date': '2015-10-10',
            'related_documents': [doc.pk for doc in related]
        })
        document = Document.objects.get(
            document_key='FAC09001-FWF-000-HSE-REP-0006')
        metadata = document.metadata
        related = list(metadata.related_documents.all())
        self.assertEqual(len(related), 2)
        related_titles = (related[0].metadata.title, related[1].metadata.title)
        self.assertTrue("HAZOP related 1" in related_titles)
        self.assertTrue("HAZOP related 2" in related_titles)
Beispiel #2
0
class DocumentEditTest(TestCase):
    def setUp(self):
        self.category = CategoryFactory()
        self.user = UserFactory(
            email='*****@*****.**',
            password='******',
            is_superuser=True,
            category=self.category,
        )
        self.create_url = reverse('document_create', args=[
            self.category.organisation.slug,
            self.category.slug,
        ])
        self.client.login(email=self.user.email, password='******')
        self.sample_path = join(settings.DJANGO_ROOT, 'documents', 'tests')

    def test_edition_errors(self):
        """
        Tests that a document can't be edited without required fields.
        """
        required_error = 'This field is required.'
        doc = DocumentFactory(
            category=self.category,
            document_key='FAC09001-FWF-000-HSE-REP-0004',
            metadata={
                'title': 'HAZOP related 1',
            },
            revision={
                'status': 'STD',
            }
        )
        c = self.client
        edit_url = doc.get_edit_url()
        r = c.get(edit_url)
        self.assertEqual(r.status_code, 200)

        r = c.post(edit_url, {'document_number': doc.document_key})
        self.assertEqual(r.status_code, 200)
        self.assertEqual(r.context['form'].errors, {
            'title': [required_error],
        })

    def test_edition_success(self):
        """
        Tests that a document can be created with required fields.
        """
        original_number_of_document = Document.objects.all().count()
        doc = DocumentFactory(
            category=self.category,
            document_key='FAC09001-FWF-000-HSE-REP-0004',
            metadata={
                'title': 'HAZOP related 1',
            },
            revision={
                'status': 'STD',
            }
        )
        c = self.client
        r = c.post(doc.get_edit_url(), {
            'document_number': doc.document_key,
            'title': 'a new title',
        })
        if r.status_code == 302:
            self.assertEqual(
                original_number_of_document + 1,
                Document.objects.all().count()
            )
        else:
            # Debug purpose
            self.assertEqual(r.context['form'].errors, {})

    def test_edition_redirect(self):
        """
        Tests that a document edition is redirected to the item
        or the list.
        """
        doc = DocumentFactory(
            category=self.category,
            document_key='FAC09001-FWF-000-HSE-REP-0004',
            metadata={
                'title': 'HAZOP related 1',
            },
            revision={
                'status': 'STD',
            }
        )
        c = self.client
        r = c.post(doc.get_edit_url(), {
            'document_number': doc.document_key,
            'title': 'a new title',
            'docclass': 1,
            'created_on': '2015-10-10',
            'received_date': '2015-10-10',
            'save-view': 'View',
        }, follow=True)
        self.assertEqual(r.redirect_chain, [(doc.get_absolute_url(), 302)])

        r = c.post(doc.get_edit_url(), {
            'document_number': doc.document_key,
            'title': 'a new new title',
            'docclass': 1,
            'created_on': '2015-10-10',
            'received_date': '2015-10-10',
        }, follow=True)
        self.assertEqual(r.redirect_chain, [
            (self.category.get_absolute_url(), 302)])
        # Check that update was logged in audit trail
        activity = Activity.objects.latest('created_on')
        self.assertEqual(activity.verb, Activity.VERB_EDITED)
        self.assertEqual(activity.target.title, 'a new new title')
        self.assertEqual(activity.actor, self.user)

    def test_edition_updates_document_key(self):
        doc = DocumentFactory(
            category=self.category,
            document_key='FAC09001-FWF-000-HSE-REP-0004',
            metadata={
                'title': 'HAZOP related 1',
            },
            revision={
                'status': 'STD',
            }
        )
        c = self.client
        c.post(doc.get_edit_url(), {
            'document_number': 'New Document Number',
            'title': 'a new title',
            'docclass': 1,
            'created_on': '2015-10-10',
            'received_date': '2015-10-10',
            'save-view': 'View',
        }, follow=True)

        doc.refresh_from_db()
        self.assertEqual(doc.document_number, 'New Document Number')
        self.assertEqual(doc.document_key, 'NEW-DOCUMENT-NUMBER')

        metadata = doc.get_metadata()
        self.assertEqual(metadata.document_number, 'New Document Number')
        self.assertEqual(metadata.document_key, 'NEW-DOCUMENT-NUMBER')
Beispiel #3
0
class DocumentDeleteTests(TestCase):
    def setUp(self):
        self.category = CategoryFactory()
        self.user = UserFactory(
            email='*****@*****.**',
            password='******',
            is_superuser=True,
            category=self.category,
        )
        self.client.login(email=self.user.email, password='******')
        self.doc_list_url = self.category.get_absolute_url()

    def test_delete_page_only_post(self):
        document = DocumentFactory(category=self.category)
        delete_url = reverse('document_delete',
                             args=[
                                 self.category.organisation.slug,
                                 self.category.slug, document.document_key
                             ])
        res = self.client.get(delete_url)
        self.assertEqual(res.status_code, 405)

    def test_delete_document(self):
        document = DocumentFactory(category=self.category)
        document_str = str(document)
        delete_url = reverse('document_delete',
                             args=[
                                 self.category.organisation.slug,
                                 self.category.slug, document.document_key
                             ])
        res = self.client.post(delete_url)
        self.assertRedirects(res, self.category.get_absolute_url())

        # Check that deletion was logged in audit trail
        activity = Activity.objects.latest('created_on')
        self.assertEqual(activity.verb, Activity.VERB_DELETED)
        self.assertEqual(activity.action_object_str, document_str)
        self.assertEqual(activity.actor, self.user)

        res = self.client.post(delete_url)
        self.assertEqual(res.status_code, 404)

        metadata = DemoMetadata.objects.filter(document=document)
        self.assertEqual(metadata.count(), 0)

        revisions = DemoMetadataRevision.objects.filter(metadata=metadata)
        self.assertEqual(revisions.count(), 0)

    def test_cannot_revise_document_in_review(self):
        document = DocumentFactory(
            category=self.category,
            document_key='FAC09001-FWF-000-HSE-REP-0004',
            revision={
                'status': 'STD',
                'review_start_date': '2014-04-04'
            })
        delete_url = reverse('document_delete',
                             args=[
                                 self.category.organisation.slug,
                                 self.category.slug, document.document_key
                             ])

        revision = document.latest_revision
        self.assertTrue(revision.is_under_review)

        res = self.client.post(delete_url)
        self.assertEqual(res.status_code, 403)

        try:
            document = Document.objects.get(document_key=document.document_key)
        except:
            self.fail('Document was deleted')

    def test_simple_user_cannot_delete_document(self):
        user = UserFactory(
            email='*****@*****.**',
            password='******',
            is_superuser=False,
            category=self.category,
        )

        self.client.login(email=user.email, password='******')
        document = DocumentFactory(category=self.category)
        delete_url = reverse('document_delete',
                             args=[
                                 self.category.organisation.slug,
                                 self.category.slug, document.document_key
                             ])

        res = self.client.post(delete_url)

        self.assertEqual(res.status_code, 403)
Beispiel #4
0
class DocumentRevisionDeleteTests(TestCase):
    def create_doc(self, nb_revisions=1):
        doc = DocumentFactory(category=self.category)
        meta = doc.get_metadata()
        for rev in range(2, nb_revisions + 1):
            MetadataRevisionFactory(metadata=meta, revision=rev)
        url = reverse('document_revision_delete',
                      args=[
                          self.category.organisation.slug, self.category.slug,
                          doc.document_key
                      ])
        return doc, url

    def setUp(self):
        self.category = CategoryFactory()
        self.user = UserFactory(
            email='*****@*****.**',
            password='******',
            is_superuser=True,
            category=self.category,
        )
        self.client.login(email=self.user.email, password='******')
        self.doc_list_url = self.category.get_absolute_url()

    def test_delete_page_only_accepts_post_requests(self):
        doc, url = self.create_doc()
        res = self.client.get(url)
        self.assertEqual(res.status_code, 405)

    def test_delete_single_revision_is_not_allowed(self):
        """Latest revision cannot be delete if this is the only revision."""
        doc, url = self.create_doc()
        res = self.client.post(url)
        self.assertEqual(res.status_code, 403)

    def test_cannot_delete_revision_in_review(self):
        doc, url = self.create_doc(nb_revisions=5)
        rev = doc.get_latest_revision()
        rev.leader = self.user
        rev.start_review()

        self.assertTrue(rev.is_under_review)

        res = self.client.post(url)
        self.assertEqual(res.status_code, 403)

    def test_delete_latest_revision(self):
        doc, url = self.create_doc(nb_revisions=5)
        doc.refresh_from_db()
        self.assertEqual(doc.get_all_revisions().count(), 5)
        self.assertEqual(doc.current_revision, 5)

        self.client.post(url)
        doc.refresh_from_db()
        self.assertEqual(doc.get_all_revisions().count(), 4)
        self.assertEqual(doc.current_revision, 4)

        self.client.post(url)
        doc.refresh_from_db()
        self.assertEqual(doc.get_all_revisions().count(), 3)
        self.assertEqual(doc.current_revision, 3)
Beispiel #5
0
class DocumentEditTest(TestCase):
    def setUp(self):
        self.category = CategoryFactory()
        self.user = UserFactory(
            email='*****@*****.**',
            password='******',
            is_superuser=True,
            category=self.category,
        )
        self.create_url = reverse('document_create',
                                  args=[
                                      self.category.organisation.slug,
                                      self.category.slug,
                                  ])
        self.client.login(email=self.user.email, password='******')
        self.sample_path = join(settings.DJANGO_ROOT, 'documents', 'tests')

    def test_edition_errors(self):
        """
        Tests that a document can't be edited without required fields.
        """
        required_error = u'This field is required.'
        doc = DocumentFactory(category=self.category,
                              document_key='FAC09001-FWF-000-HSE-REP-0004',
                              metadata={
                                  'title': u'HAZOP related 1',
                              },
                              revision={
                                  'status': 'STD',
                              })
        c = self.client
        edit_url = doc.get_edit_url()
        r = c.get(edit_url)
        self.assertEqual(r.status_code, 200)

        r = c.post(edit_url, {'document_number': doc.document_key})
        self.assertEqual(r.status_code, 200)
        self.assertEqual(r.context['form'].errors, {
            'title': [required_error],
        })

    def test_edition_success(self):
        """
        Tests that a document can be created with required fields.
        """
        original_number_of_document = Document.objects.all().count()
        doc = DocumentFactory(category=self.category,
                              document_key='FAC09001-FWF-000-HSE-REP-0004',
                              metadata={
                                  'title': u'HAZOP related 1',
                              },
                              revision={
                                  'status': 'STD',
                              })
        c = self.client
        r = c.post(doc.get_edit_url(), {
            'document_number': doc.document_key,
            'title': u'a new title',
        })
        if r.status_code == 302:
            self.assertEqual(original_number_of_document + 1,
                             Document.objects.all().count())
        else:
            # Debug purpose
            self.assertEqual(r.context['form'].errors, {})

    def test_edition_redirect(self):
        """
        Tests that a document edition is redirected to the item
        or the list.
        """
        doc = DocumentFactory(category=self.category,
                              document_key='FAC09001-FWF-000-HSE-REP-0004',
                              metadata={
                                  'title': u'HAZOP related 1',
                              },
                              revision={
                                  'status': 'STD',
                              })
        c = self.client
        r = c.post(doc.get_edit_url(), {
            'document_number': doc.document_key,
            'title': u'a new title',
            'docclass': 1,
            'created_on': '2015-10-10',
            'received_date': '2015-10-10',
            'save-view': 'View',
        },
                   follow=True)
        self.assertEqual(r.redirect_chain, [('http://testserver{url}'.format(
            url=doc.get_absolute_url(), ), 302)])

        r = c.post(doc.get_edit_url(), {
            'document_number': doc.document_key,
            'title': u'a new new title',
            'docclass': 1,
            'created_on': '2015-10-10',
            'received_date': '2015-10-10',
        },
                   follow=True)
        self.assertEqual(r.redirect_chain, [('http://testserver{url}'.format(
            url=self.category.get_absolute_url(), ), 302)])
        # Check that update was logged in audit trail
        activity = Activity.objects.latest('created_on')
        self.assertEqual(activity.verb, Activity.VERB_EDITED)
        self.assertEqual(activity.target.title, u'a new new title')
        self.assertEqual(activity.actor, self.user)

    def test_edition_updates_document_key(self):
        doc = DocumentFactory(category=self.category,
                              document_key='FAC09001-FWF-000-HSE-REP-0004',
                              metadata={
                                  'title': u'HAZOP related 1',
                              },
                              revision={
                                  'status': 'STD',
                              })
        c = self.client
        c.post(doc.get_edit_url(), {
            'document_number': 'New Document Number',
            'title': u'a new title',
            'docclass': 1,
            'created_on': '2015-10-10',
            'received_date': '2015-10-10',
            'save-view': 'View',
        },
               follow=True)

        doc.refresh_from_db()
        self.assertEqual(doc.document_number, 'New Document Number')
        self.assertEqual(doc.document_key, 'NEW-DOCUMENT-NUMBER')

        metadata = doc.get_metadata()
        self.assertEqual(metadata.document_number, 'New Document Number')
        self.assertEqual(metadata.document_key, 'NEW-DOCUMENT-NUMBER')
Beispiel #6
0
class DocumentCreateTest(TestCase):
    def setUp(self):
        self.category = CategoryFactory()
        self.user = UserFactory(
            email='*****@*****.**',
            password='******',
            is_superuser=True,
            category=self.category,
        )
        self.create_url = reverse('document_create',
                                  args=[
                                      self.category.organisation.slug,
                                      self.category.slug,
                                  ])
        self.client.login(email=self.user.email, password='******')
        self.sample_path = join(settings.DJANGO_ROOT, 'documents', 'tests')

    def tearDown(self):
        """Wipe the media root directory after each test."""
        media_root = settings.MEDIA_ROOT
        if os.path.exists(media_root):
            for f in os.listdir(media_root):
                file_path = os.path.join(media_root, f)
                if os.path.isfile(file_path) and file_path.startswith('/tmp/'):
                    os.unlink(file_path)

    def test_creation_errors(self):
        """
        Tests that a document can't be created without required fields.
        """
        required_error = u'This field is required.'
        c = self.client
        r = c.get(self.create_url)
        self.assertEqual(r.status_code, 200)

        r = c.post(self.create_url, {})
        self.assertEqual(r.status_code, 200)
        self.assertEqual(r.context['form'].errors, {
            'title': [required_error],
        })

    def test_creation_errors_with_files(self):
        """
        Tests that a document can't be created with wrong files.
        """
        extension_error = u'A PDF file is not allowed in this field.'
        c = self.client
        with open(join(self.sample_path,
                       'sample_doc_native.docx')) as native_file:
            with open(join(self.sample_path,
                           'sample_doc_pdf.pdf')) as pdf_file:
                r = c.post(
                    self.create_url, {
                        'title': u'a title',
                        'native_file': pdf_file,
                        'pdf_file': native_file,
                        'docclass': 1,
                        'created_on': '2015-10-10',
                        'received_date': '2015-10-10',
                    })
                self.assertEqual(r.status_code, 200)
                self.assertEqual(r.context['revision_form'].errors, {
                    'native_file': [extension_error],
                })

    def test_creation_success(self):
        """
        Tests that a document can be created with required fields.
        """
        original_number_of_document = Document.objects.all().count()
        c = self.client
        r = c.post(self.create_url, {
            'title': u'a title',
        })
        if r.status_code == 302:
            self.assertEqual(original_number_of_document + 1,
                             Document.objects.all().count())
        else:
            # Debug purpose
            self.assertEqual(r.context['form'].errors, {})

    def test_creation_with_empty_document_key(self):
        """
        Tests that a document can be created with required fields.
        """
        c = self.client
        doc_title = u'a glorious title'
        c.post(self.create_url, {
            'title': doc_title,
            'docclass': 1,
            'created_on': '2015-10-10',
            'received_date': '2015-10-10',
        },
               follow=True)
        doc = Document.objects.all().order_by('-id')[0]
        self.assertEqual(doc.document_number, 'a-glorious-title')
        self.assertEqual(doc.document_key, 'a-glorious-title')

        # Check that creation was logged in audit trail
        activity = Activity.objects.latest('created_on')
        self.assertEqual(activity.verb, Activity.VERB_CREATED)
        self.assertEqual(activity.action_object.title, doc_title)
        self.assertEqual(activity.actor, self.user)

    def test_create_with_document_key(self):
        c = self.client
        doc_title = u'another title'
        c.post(self.create_url, {
            'title': doc_title,
            'document_number': u'Gloubi Boulga',
            'docclass': 1,
            'created_on': '2015-10-10',
            'received_date': '2015-10-10',
        },
               follow=True)
        doc = Document.objects.all().order_by('-id')[0]
        self.assertEqual(doc.document_number, 'Gloubi Boulga')
        self.assertEqual(doc.document_key, 'GLOUBI-BOULGA')

        # Check audit trail
        activity = Activity.objects.latest('created_on')
        self.assertEqual(activity.verb, Activity.VERB_CREATED)
        self.assertEqual(activity.action_object.title, doc_title)
        self.assertEqual(activity.actor, self.user)

    def test_creation_success_with_files(self):
        """
        Tests that a document can be created with files.
        """
        original_number_of_document = Document.objects.all().count()
        c = self.client
        with open(join(self.sample_path,
                       'sample_doc_native.docx')) as native_file:
            with open(join(self.sample_path,
                           'sample_doc_pdf.pdf')) as pdf_file:
                r = c.post(
                    self.create_url, {
                        'title': u'a title',
                        'native_file': native_file,
                        'pdf_file': pdf_file,
                    })
                if r.status_code == 302:
                    self.assertEqual(original_number_of_document + 1,
                                     Document.objects.all().count())
                else:
                    # Debug purpose
                    self.assertEqual(r.context['form'].errors, {})

    def test_creation_redirect(self):
        """
        Tests that a document creation is redirected to the item
        or another creation form (django-admin like).
        """
        c = self.client
        r = c.post(self.create_url, {
            'title': u'a title',
            'docclass': 1,
            'created_on': '2015-10-10',
            'received_date': '2015-10-10',
            'save-create': None,
        },
                   follow=True)
        self.assertEqual(
            r.redirect_chain,
            [('http://testserver{url}'.format(url=self.create_url, ), 302)])

        r = c.post(self.create_url, {
            'title': u'another title',
            'docclass': 1,
            'created_on': '2015-10-10',
            'received_date': '2015-10-10',
        },
                   follow=True)
        self.assertEqual(r.redirect_chain, [('http://testserver{url}'.format(
            url=self.category.get_absolute_url(), ), 302)])

    def test_document_related_documents(self):
        c = self.client
        related = [
            DocumentFactory(category=self.category,
                            document_key='FAC09001-FWF-000-HSE-REP-0004',
                            metadata={
                                'title': u'HAZOP related 1',
                            },
                            revision={
                                'status': 'STD',
                            }),
            DocumentFactory(category=self.category,
                            document_key='FAC09001-FWF-000-HSE-REP-0005',
                            metadata={
                                'title': u'HAZOP related 2',
                            },
                            revision={
                                'status': 'STD',
                            })
        ]
        c.post(
            self.create_url, {
                'document_number': 'FAC09001-FWF-000-HSE-REP-0006',
                'title': u'HAZOP report',
                'docclass': 1,
                'created_on': '2015-10-10',
                'received_date': '2015-10-10',
                'related_documents': [doc.pk for doc in related]
            })
        document = Document.objects.get(
            document_key='FAC09001-FWF-000-HSE-REP-0006')
        metadata = document.metadata
        related = list(metadata.related_documents.all())
        self.assertEqual(len(related), 2)
        related_titles = (related[0].metadata.title, related[1].metadata.title)
        self.assertTrue("HAZOP related 1" in related_titles)
        self.assertTrue("HAZOP related 2" in related_titles)
Beispiel #7
0
class DocumentRevisionDeleteTests(TestCase):
    def create_doc(self, nb_revisions=1):
        doc = DocumentFactory(category=self.category)
        meta = doc.get_metadata()
        for rev in range(2, nb_revisions + 1):
            MetadataRevisionFactory(
                metadata=meta,
                revision=rev
            )
        url = reverse('document_revision_delete', args=[
            self.category.organisation.slug,
            self.category.slug,
            doc.document_key
        ])
        return doc, url

    def setUp(self):
        self.category = CategoryFactory()
        self.user = UserFactory(
            email='*****@*****.**',
            password='******',
            is_superuser=True,
            category=self.category,
        )
        self.client.login(email=self.user.email, password='******')
        self.doc_list_url = self.category.get_absolute_url()

    def test_delete_page_only_accepts_post_requests(self):
        doc, url = self.create_doc()
        res = self.client.get(url)
        self.assertEqual(res.status_code, 405)

    def test_delete_single_revision_is_not_allowed(self):
        """Latest revision cannot be delete if this is the only revision."""
        doc, url = self.create_doc()
        res = self.client.post(url)
        self.assertEqual(res.status_code, 403)

    def test_cannot_delete_revision_in_review(self):
        doc, url = self.create_doc(nb_revisions=5)
        rev = doc.get_latest_revision()
        rev.leader = self.user
        rev.start_review()

        self.assertTrue(rev.is_under_review)

        res = self.client.post(url)
        self.assertEqual(res.status_code, 403)

    def test_delete_latest_revision(self):
        doc, url = self.create_doc(nb_revisions=5)
        doc.refresh_from_db()
        self.assertEqual(doc.get_all_revisions().count(), 5)
        self.assertEqual(doc.current_revision, 5)

        self.client.post(url)
        doc.refresh_from_db()
        self.assertEqual(doc.get_all_revisions().count(), 4)
        self.assertEqual(doc.current_revision, 4)

        self.client.post(url)
        doc.refresh_from_db()
        self.assertEqual(doc.get_all_revisions().count(), 3)
        self.assertEqual(doc.current_revision, 3)

    def test_simple_user_cannot_delete_revision(self):
        doc, delete_url = self.create_doc(nb_revisions=2)
        self.assertEqual(doc.get_all_revisions().count(), 2)
        # User has not delete perms
        user = UserFactory(
            email='*****@*****.**',
            password='******',
            is_superuser=False,
            category=self.category,
        )
        self.client.logout()
        self.client.login(email=user.email, password='******')

        res = self.client.post(delete_url)

        self.assertEqual(res.status_code, 403)

        doc.refresh_from_db()
        self.assertEqual(doc.get_all_revisions().count(), 2)

    def test_user_with_delete_perms_can_delete_revision(self):
        doc, delete_url = self.create_doc(nb_revisions=2)
        self.assertEqual(doc.get_all_revisions().count(), 2)
        user = UserFactory(
            email='*****@*****.**',
            password='******',
            is_superuser=False,
            category=self.category,
        )
        delete_doc_perm = Permission.objects.get(
            codename='delete_document')
        user.user_permissions.add(delete_doc_perm)
        self.client.logout()
        self.client.login(email=user.email, password='******')

        self.client.post(delete_url)

        doc.refresh_from_db()
        self.assertEqual(doc.get_all_revisions().count(), 1)
Beispiel #8
0
class DocumentDeleteTests(TestCase):
    def setUp(self):
        self.category = CategoryFactory()
        self.user = UserFactory(
            email='*****@*****.**',
            password='******',
            is_superuser=True,
            category=self.category,
        )
        self.client.login(email=self.user.email, password='******')
        self.doc_list_url = self.category.get_absolute_url()

    def test_delete_page_only_post(self):
        document = DocumentFactory(category=self.category)
        delete_url = reverse('document_delete', args=[
            self.category.organisation.slug,
            self.category.slug,
            document.document_key
        ])
        res = self.client.get(delete_url)
        self.assertEqual(res.status_code, 405)

    def test_delete_document(self):
        document = DocumentFactory(category=self.category)
        document_str = str(document)
        delete_url = reverse('document_delete', args=[
            self.category.organisation.slug,
            self.category.slug,
            document.document_key
        ])
        res = self.client.post(delete_url)
        self.assertRedirects(res, self.category.get_absolute_url())

        # Check that deletion was logged in audit trail
        activity = Activity.objects.latest('created_on')
        self.assertEqual(activity.verb, Activity.VERB_DELETED)
        self.assertEqual(activity.action_object_str, document_str)
        self.assertEqual(activity.actor, self.user)

        res = self.client.post(delete_url)
        self.assertEqual(res.status_code, 404)

        metadata = DemoMetadata.objects.filter(document=document)
        self.assertEqual(metadata.count(), 0)

        revisions = DemoMetadataRevision.objects.filter(metadata=metadata)
        self.assertEqual(revisions.count(), 0)

    def test_cannot_revise_document_in_review(self):
        document = DocumentFactory(
            category=self.category,
            document_key='FAC09001-FWF-000-HSE-REP-0004',
            revision={
                'status': 'STD',
                'review_start_date': '2014-04-04'
            }
        )
        delete_url = reverse('document_delete', args=[
            self.category.organisation.slug,
            self.category.slug,
            document.document_key
        ])

        revision = document.latest_revision
        self.assertTrue(revision.is_under_review)

        res = self.client.post(delete_url)
        self.assertEqual(res.status_code, 403)

        try:
            document = Document.objects.get(document_key=document.document_key)
        except:
            self.fail('Document was deleted')

    def test_simple_user_cannot_delete_document(self):
        user = UserFactory(
            email='*****@*****.**',
            password='******',
            is_superuser=False,
            category=self.category,
        )

        self.client.login(email=user.email, password='******')
        document = DocumentFactory(category=self.category)
        delete_url = reverse('document_delete', args=[
            self.category.organisation.slug,
            self.category.slug,
            document.document_key
        ])

        res = self.client.post(delete_url)

        self.assertEqual(res.status_code, 403)

    def test_user_with_delete_perms_can_delete_document(self):
        user = UserFactory(
            email='*****@*****.**',
            password='******',
            is_superuser=False,
            category=self.category,
        )
        delete_doc_perm = Permission.objects.get(
            codename='delete_document')
        user.user_permissions.add(delete_doc_perm)

        self.client.login(email=user.email, password='******')
        document = DocumentFactory(category=self.category)
        delete_url = reverse('document_delete', args=[
            self.category.organisation.slug,
            self.category.slug,
            document.document_key
        ])

        res = self.client.post(delete_url)

        self.assertRedirects(res, self.category.get_absolute_url())
        self.assertFalse(Document.objects.filter(pk=document.pk).exists())
Beispiel #9
0
class DocumentDeleteTests(TestCase):

    def setUp(self):
        self.category = CategoryFactory()
        user = UserFactory(
            email='*****@*****.**',
            password='******',
            is_superuser=True,
            category=self.category,
        )
        self.client.login(email=user.email, password='******')
        self.doc_list_url = self.category.get_absolute_url()

    def test_delete_page_only_post(self):
        document = DocumentFactory(category=self.category)
        delete_url = reverse('document_delete', args=[
            self.category.organisation.slug,
            self.category.slug,
            document.document_key
        ])
        res = self.client.get(delete_url)
        self.assertEqual(res.status_code, 405)

    def test_delete_document(self):
        document = DocumentFactory(category=self.category)
        delete_url = reverse('document_delete', args=[
            self.category.organisation.slug,
            self.category.slug,
            document.document_key
        ])
        res = self.client.post(delete_url)
        self.assertRedirects(res, self.category.get_absolute_url())

        res = self.client.post(delete_url)
        self.assertEqual(res.status_code, 404)

        metadata = DemoMetadata.objects.filter(document=document)
        self.assertEqual(metadata.count(), 0)

        revisions = DemoMetadataRevision.objects.filter(document=document)
        self.assertEqual(revisions.count(), 0)

    def test_cannot_revise_document_in_review(self):
        document = DocumentFactory(
            category=self.category,
            document_key='FAC09001-FWF-000-HSE-REP-0004',
            revision={
                'status': 'STD',
                'review_start_date': '2014-04-04'
            }
        )
        delete_url = reverse('document_delete', args=[
            self.category.organisation.slug,
            self.category.slug,
            document.document_key
        ])

        revision = document.latest_revision
        self.assertTrue(revision.is_under_review)

        res = self.client.post(delete_url)
        self.assertEqual(res.status_code, 403)

        try:
            document = Document.objects.get(document_key=document.document_key)
        except:
            self.fail('Document was deleted')

    def test_simple_user_cannot_delete_document(self):
        user = UserFactory(
            email='*****@*****.**',
            password='******',
            is_superuser=False,
            category=self.category,
        )

        self.client.login(email=user.email, password='******')
        document = DocumentFactory(category=self.category)
        delete_url = reverse('document_delete', args=[
            self.category.organisation.slug,
            self.category.slug,
            document.document_key
        ])

        res = self.client.post(delete_url)

        self.assertEqual(res.status_code, 403)