def test_valid_existing_geometries(self): shapefile = BytesIO(VALID_SHAPEFILE) validation_errors = UploadShapefileValidator.validate( shapefile, None, False) self.assertEqual(len(validation_errors.errors), 0)
def test_too_many_extents_in_total(self, bytes_collection_mock): mock_shape_collection = [] for i in range(0, 498): mock_shape_collection.append({'geometry': 'a geometry'}) geometry_session_obj = { 'features': [{ 'geometry': 'a geometry' }, { 'geometry': 'another geometry' }, { 'geometry': 'a third geometry' }] } shapefile = BytesIO() bytes_collection_mock.return_value.__enter__.return_value = mock_shape_collection validation_errors = UploadShapefileValidator.validate( shapefile, geometry_session_obj, False) self.assertEqual(len(validation_errors.errors), 1) self.assertEqual( validation_errors.errors['shapefile-input'].inline_message, "Too many extents") self.assertEqual( validation_errors.errors['shapefile-input'].summary_message, "Number of extents must be 500 (or fewer)")
def test_valid_no_existing_geometries(self): geometry_session_obj = {'features': []} shapefile = BytesIO(VALID_SHAPEFILE) validation_errors = UploadShapefileValidator.validate( shapefile, geometry_session_obj, False) self.assertEqual(len(validation_errors.errors), 0)
def test_upload_required(self): validation_errors = UploadShapefileValidator.validate( None, None, False) self.assertEqual(len(validation_errors.errors), 1) self.assertEqual( validation_errors.errors['shapefile-input'].inline_message, "Upload a file") self.assertEqual( validation_errors.errors['shapefile-input'].summary_message, "Upload a file")
def test_filesize_too_big(self): shapefile = BytesIO(b'a' * 1000001) validation_errors = UploadShapefileValidator.validate( shapefile, None, False) self.assertEqual(len(validation_errors.errors), 1) self.assertEqual( validation_errors.errors['shapefile-input'].inline_message, "Upload a smaller file") self.assertEqual( validation_errors.errors['shapefile-input'].summary_message, "File is bigger than 1MB")
def test_invalid_shapefile(self): shapefile = BytesIO() validation_errors = UploadShapefileValidator.validate( shapefile, None, False) self.assertEqual(len(validation_errors.errors), 1) self.assertEqual( validation_errors.errors['shapefile-input'].inline_message, "Upload a different file") self.assertEqual( validation_errors.errors['shapefile-input'].summary_message, "File not uploaded")
def test_shapefile_contents_required(self, bytes_collection_mock): mock_shape_collection = [] shapefile = BytesIO() bytes_collection_mock.return_value.__enter__.return_value = mock_shape_collection validation_errors = UploadShapefileValidator.validate( shapefile, None, False) self.assertEqual(len(validation_errors.errors), 1) self.assertEqual( validation_errors.errors['shapefile-input'].inline_message, "Upload a different file") self.assertEqual( validation_errors.errors['shapefile-input'].summary_message, "File not uploaded")
def test_too_many_extents_in_shapefile(self, bytes_collection_mock): mock_shape_collection = [] for i in range(0, 501): mock_shape_collection.append({'geometry': 'a geometry'}) shapefile = BytesIO() bytes_collection_mock.return_value.__enter__.return_value = mock_shape_collection validation_errors = UploadShapefileValidator.validate( shapefile, None, False) self.assertEqual(len(validation_errors.errors), 1) self.assertEqual( validation_errors.errors['shapefile-input'].inline_message, "Too many extents") self.assertEqual( validation_errors.errors['shapefile-input'].summary_message, "Number of extents must be 500 (or fewer)")
def post_upload_shapefile(): current_app.logger.info('Endpoint called') if g.session.add_charge_state is None: current_app.logger.info('Redirecting to: {}'.format( url_for('add_land_charge.new'))) return redirect(url_for('add_land_charge.new')) file = request.files.get('shapefile-input') submit_token = request.form.get('csrf_token') unique_request = submit_token != g.session.submit_token already_uploaded = ( not unique_request) and g.session.upload_shapefile_processed validation_errors = UploadShapefileValidator.validate( file, g.session.add_charge_state.geometry, already_uploaded) if validation_errors.errors: current_app.logger.error('Validation errors when uploading shapefile') return render_template( "upload_shapefile.html", validation_errors=validation_errors.errors, validation_summary_heading=validation_errors.summary_heading_text) if unique_request and not already_uploaded: g.session.submit_token = submit_token g.session.commit() geometries = parse_upload(file) if g.session.add_charge_state.geometry: g.session.add_charge_state.geometry['features'].extend(geometries) else: g.session.add_charge_state.geometry = { "type": "FeatureCollection", "features": geometries } g.session.upload_shapefile_processed = True g.session.commit() return redirect(url_for('add_land_charge.get_location', upload=True))
def test_too_many_extents_validation_when_already_uploaded( self, bytes_collection_mock): mock_shape_collection = [{ 'geometry': 'a geometry' }, { 'geometry': 'another geometry' }] geometry_session_obj = {'features': []} for i in range(0, 499): geometry_session_obj['features'].append( {'geometry': 'some geometry'}) shapefile = BytesIO() bytes_collection_mock.return_value.__enter__.return_value = mock_shape_collection validation_errors = UploadShapefileValidator.validate( shapefile, None, True) self.assertEqual(len(validation_errors.errors), 0)