# Copyright 2019 Mike Shoup # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from decimal import Decimal from humulus.couch import get_db, get_doc from humulus.recipes import FermentableForm, HopForm, RecipeForm, YeastForm def test_create(client, app): """Test success in creating a recipe document.""" # Test GET response = client.get('/recipes/create') assert response.status_code == 200 # Test POST data = { 'efficiency': '65', 'name': 'Test', 'notes': 'Test', 'volume': '5.5', } response = client.post('/recipes/create', data=data) assert response.status_code == 302 with app.app_context(): doc = get_doc('test') assert doc['name'] == 'Test' assert doc['notes'] == 'Test' assert doc['volume'] == '5.5' assert doc['efficiency'] == '65' def test_update(client, app): """Test success in updating a recipe document.""" # Test GET id = 'awesome-lager' response = client.get('/recipes/update/{}'.format(id)) # Get the doc, test a change, then post the update with app.app_context(): data = get_doc(id) # Remove values that should not be posted with the data rev = data.pop('_rev') # Save the revision, will be used later data.pop('_id') # Make a change to the data data['name'] = '{} TEST'.format(data['name']) # Test valid response response = client.post('/recipes/update/{}'.format(id), query_string={'rev': rev}, data=data) assert response.status_code == 302 with client.session_transaction() as session: flash_message = dict(session['_flashes']).get('error') assert flash_message is None # Validate document update with app.app_context(): updated = get_doc(id) assert updated['name'] == data['name'] # Test response without valid/conflicted rev response = client.post('/recipes/update/{}'.format(id), query_string={'rev': ''}, data=data) assert response.status_code == 302 with client.session_transaction() as session: flash_message = dict(session['_flashes']).get('error') assert 'Update conflict' in flash_message def test_info(client): """Test success in retrieving a recipe document.""" # Validate 404 response = client.get('/recipes/info/thisdoesnotexist') assert response.status_code == 404 # Validate response for existing doc response = client.get('/recipes/info/awesome-lager') assert response.status_code == 200 assert b'Awesome Lager' in response.data def test_yeast_form_doc(app): """Evaluates conditionals in generation of doc from a yeast form.""" yeast = YeastForm() yeast.name.data = 'Test' yeast.low_attenuation.data = Decimal('60') yeast.high_attenuation.data = Decimal('75') assert yeast.doc == { 'name': 'Test', 'low_attenuation': '60', 'high_attenuation': '75' } yeast.type.data = 'Dry' yeast.code.data = 'INIS-001' yeast.lab.data = 'Inland Island' yeast.flocculation.data = 'Low' yeast.min_temperature.data = Decimal('40') yeast.max_temperature.data = Decimal('50') yeast.abv_tolerance.data = Decimal('15') assert yeast.doc == { 'name': 'Test', 'low_attenuation': '60', 'high_attenuation': '75', 'flocculation': 'Low', 'type': 'Dry', 'code': 'INIS-001', 'lab': 'Inland Island', 'min_temperature': '40', 'max_temperature': '50', 'abv_tolerance': '15' } def test_recipe_form_doc(app): """Test if a recipeform can be turned into a document. This test also tests that subforms can be turned into a document. Subforms are not tested individually since they will never be used individually. """ with app.app_context(): recipe = RecipeForm() recipe.name.data = 'Test' recipe.efficiency.data = Decimal('65') recipe.volume.data = Decimal('5.5') recipe.notes.data = 'This is a test' assert recipe.doc == { 'name': 'Test', 'efficiency': '65', 'volume': '5.5', 'notes': 'This is a test', } ferm = FermentableForm() ferm.name.data = 'Test' ferm.type.data = 'Grain' ferm.amount.data = Decimal('5.5') ferm.ppg.data = Decimal('37') ferm.color.data = Decimal('1.8') hop = HopForm() hop.name.data = 'Test' hop.use.data = 'Boil' hop.alpha.data = Decimal('12.5') hop.duration.data = Decimal('60') hop.amount.data = Decimal('0.5') yeast = YeastForm() yeast.name.data = 'Test' yeast.low_attenuation.data = '70' yeast.high_attenuation.data = '75' recipe.fermentables = [ferm] recipe.hops = [hop] recipe.yeast = yeast assert recipe.doc == { 'name': 'Test', 'efficiency': '65', 'volume': '5.5', 'notes': 'This is a test', 'fermentables': [{ 'name': 'Test', 'type': 'Grain', 'amount': '5.5', 'ppg': '37', 'color': '1.8', }], 'hops': [{ 'name': 'Test', 'use': 'Boil', 'alpha': '12.5', 'duration': '60', 'amount': '0.5' }], 'yeast': { 'name': 'Test', 'low_attenuation': '70', 'high_attenuation': '75' } } def test_recipe_delete(client): """Test success in deleting a document.""" response = client.post('/recipes/delete/awesome-lager') assert response.status_code == 302 # Try to get the doc now response = client.get('/recipes/info/awesome-lager') assert response.status_code == 404