def test_no_file_uploaded_should_return_400(self):
        request = testing.DummyRequest(post={})
        request.context = testing.DummyResource()
        request.session = {"email": "*****@*****.**", "username": "******"}

        response = upload_file(request.context, request)

        self.assertEqual(response.status_code, 400)
        self.assertEqual(json.loads(response.body), {"error": "Field 'file' is missing"})
    def test_invalid_file_upload_should_return_400(self):
        upload = MockFileStorage()
        upload.file = StringIO.StringIO("upload me!")
        upload.filename = "file.unvalid_extension"

        self.complete_params["file"] = upload

        request = testing.DummyRequest(post=self.complete_params)
        request.context = testing.DummyResource()
        request.session = {"email": "*****@*****.**", "username": "******"}

        response = upload_file(request.context, request)

        self.assertEqual(response.status_code, 400)
        self.assertEqual(json.loads(response.body), {"error": "File extension is invalid"})
    def test_invalid_pmids_should_return_400(self):
        upload = MockFileStorage()
        upload.file = StringIO.StringIO("upload me!")
        upload.filename = "file.txt"

        self.complete_params["file"] = upload
        self.complete_params["pmids"] = "invalid_pmid"

        request = testing.DummyRequest(post=self.complete_params)
        request.context = testing.DummyResource()
        request.session = {"email": "*****@*****.**", "username": "******"}

        response = upload_file(request.context, request)

        self.assertEqual(response.status_code, 400)
        self.assertEqual(json.loads(response.body), {"error": "PMIDs must be integer numbers. You sent: invalid_pmid"})
    def test_valid_pmids_but_inexistent_should_return_400(self, mock_search):
        upload = MockFileStorage()
        upload.file = StringIO.StringIO("upload me!")
        upload.filename = "file.txt"

        self.complete_params["file"] = upload
        self.complete_params["pmids"] = "1234"

        mock_search.return_value = MockQuery(None)

        request = testing.DummyRequest(post=self.complete_params)
        request.context = testing.DummyResource()
        request.session = {"email": "*****@*****.**", "username": "******"}

        response = upload_file(request.context, request)

        self.assertEqual(response.status_code, 400)
        self.assertEqual(json.loads(response.body), {"error": "Nonexistent PMID(s): 1234"})
    def test_file_already_upload_should_return_400(
        self, mock_filepath, mock_topic, mock_keywords, mock_references, mock_format, mock_file
    ):
        upload = MockFileStorage()
        upload.file = StringIO.StringIO("upload me!")
        upload.filename = "file.txt"

        self.complete_params["file"] = upload
        self.complete_params["display_name"] = "file.txt"

        request = testing.DummyRequest(post=self.complete_params)
        request.context = testing.DummyResource()
        request.session = {"email": "*****@*****.**", "username": "******"}

        response = upload_file(request.context, request)

        self.assertEqual(response.status_code, 400)
        self.assertEqual(json.loads(response.body), {"error": "Upload error: File file.txt already exists."})
    def test_file_should_be_saved_and_uploaded(
        self,
        mock_session,
        mock_filepath,
        mock_topic,
        mock_keywords,
        mock_references,
        mock_format,
        mock_file,
        mock_refs,
        mock_keys,
        mock_save,
        mock_tasks,
        mock_transaction,
    ):
        upload = MockFileStorage()
        upload.file = StringIO.StringIO("upload me!")
        upload.filename = "file.txt"

        topic = factory.EdamFactory.build()
        format = factory.EdamFactory.build()
        filepath = factory.FilepathFactory.build()

        mock_topic.return_value = topic
        mock_format.return_value = format
        mock_filepath.return_value = filepath

        self.complete_params["file"] = upload
        self.complete_params["display_name"] = "file.txt"
        self.complete_params["file_date"] = "2016-03-18 14:09:10"

        request = testing.DummyRequest(post=self.complete_params)
        request.context = testing.DummyResource()
        request.session = {"email": "*****@*****.**", "username": "******"}

        response = upload_file(request.context, request)

        fdb = Filedbentity(
            md5sum=None,
            previous_file_name=self.complete_params["previous_file_name"],
            topic_id=topic.edam_id,
            format_id=format.edam_id,
            file_date=self.complete_params["file_date"],
            is_public=self.complete_params["is_public"],
            is_in_spell=self.complete_params["for_spell"],
            is_in_browser=self.complete_params["for_browser"],
            filepath_id=filepath.filepath_id,
            readme_url=self.complete_params["readme_name"],
            file_extension=self.complete_params["extension"],
            # DBentity params
            format_name=self.complete_params["display_name"],
            display_name=self.complete_params["display_name"],
            s3_url=None,
            source_id=339,
            dbentity_status=self.complete_params["status"],
        )

        self.assertTrue(mock_session.add.called_with(fdb))
        self.assertTrue(mock_session.flush.called)
        self.assertTrue(mock_session.refresh.called_with(fdb))
        self.assertTrue(mock_transaction.commit.called)
        self.assertTrue(mock_save.called)

        mock_tasks.assert_called_with(
            os.path.join("/tmp", upload.filename),
            None,
            self.complete_params["extension"],
            os.environ["S3_ACCESS_KEY"],
            os.environ["S3_SECRET_KEY"],
            os.environ["S3_BUCKET"],
        )

        self.assertEqual(response.status_code, 200)