def test_yeast(self): model.Recipe(name='American IPA', author=model.User.get(1)) model.Yeast(name='Wyeast 1056 - American Ale', form='LIQUID', attenuation=.75) model.commit() data = { u'mash': { u'additions': [{ u'use': u'MASH', u'amount': 1, u'use': 'PRIMARY', u'ingredient': { u'id': 1, u'class': u'Yeast' } }] } } self.post('/recipes/1/american-ipa/builder?_method=PUT', params={'recipe': dumps(data)}) assert model.RecipeAddition.query.count() == 1 a = model.RecipeAddition.get(1) assert a.recipe == model.Recipe.get(1) assert a.amount == 1 assert a.use == 'PRIMARY' assert a.yeast == model.Yeast.get(1)
def test_hop(self): model.Recipe(name='American IPA', author=model.User.get(1)) model.Hop(name='Cascade', origin='US') model.commit() data = { u'fermentation': { u'additions': [{ u'use': u'SECONDARY', u'form': u'PELLET', u'alpha_acid': 8, u'amount': 16, u'unit': u'OUNCE', u'ingredient': { u'id': 1, u'class': u'Hop' } }] } } self.post('/recipes/1/american-ipa/builder?_method=PUT', params={'recipe': dumps(data)}) assert model.HopAddition.query.count() == 1 a = model.HopAddition.get(1) assert a.recipe == model.Recipe.get(1) assert a.amount == 16 assert a.use == 'SECONDARY' assert a.unit == 'OUNCE' assert a.form == 'PELLET' assert a.alpha_acid == 8 assert a.hop == model.Hop.get(1)
def test_draft_merge_style(self): model.Recipe(name='Rocky Mountain River IPA', style=model.Style(name='American IPA'), state=u'PUBLISHED') model.commit() # Make a new draft of the recipe model.Recipe.query.first().draft() model.commit() assert model.Recipe.query.count() == 2 # Change the style of the draft draft = model.Recipe.query.filter( model.Recipe.state == 'DRAFT').first() draft.style = model.Style(name='Baltic Porter') model.commit() # Merge the draft back into its origin recipe. draft = model.Recipe.query.filter( model.Recipe.state == 'DRAFT').first() draft.publish() model.commit() # Make sure the remaining version is the (newly saved) draft assert model.Recipe.query.count() == 1 assert model.Style.query.count() == 2 published = model.Recipe.query.first() assert published.style == model.Style.get_by(name='Baltic Porter')
def test_copy_multiple_slugs(self): r = model.Recipe(type='MASH', name='Rocky Mountain River IPA', gallons=5, boil_minutes=60, notes=u'This is my favorite recipe.') model.RecipeSlug(slug='secondary-slug', recipe=r) model.commit() recipe = model.Recipe.query.first() recipe.duplicate() model.commit() assert model.Recipe.query.count() == 2 assert model.RecipeSlug.query.count() == 4 r1, r2 = model.Recipe.get(1), model.Recipe.get(2) assert r1.type == r2.type == 'MASH' assert r1.name == r2.name == 'Rocky Mountain River IPA' assert r1.gallons == r2.gallons == 5 assert r1.boil_minutes == r2.boil_minutes == 60 assert r1.notes == r2.notes == u'This is my favorite recipe.' assert len(r1.slugs) == len(r2.slugs) == 2 assert r1.slugs[0] != r2.slugs[0] assert r1.slugs[0].slug == r2.slugs[ 0].slug == 'rocky-mountain-river-ipa' assert r1.slugs[1] != r2.slugs[1] assert r1.slugs[1].slug == r2.slugs[1].slug == 'secondary-slug'
def test_fermentable(self): model.Recipe(name='American IPA', author=model.User.get(1)) model.Fermentable(name='2-Row', origin='US', ppg=36, lovibond=2) model.commit() data = { u'boil': { u'additions': [{ u'amount': 5, u'use': 'BOIL', u'duration': 15, u'unit': u'POUND', u'ingredient': { u'id': 1, u'class': 'Fermentable' } }] } } self.post('/recipes/1/american-ipa/builder?_method=PUT', params={'recipe': dumps(data)}) assert model.RecipeAddition.query.count() == 1 a = model.RecipeAddition.get(1) assert a.recipe == model.Recipe.get(1) assert a.amount == 5 assert a.use == 'BOIL' assert a.duration == timedelta(minutes=15) assert a.unit == 'POUND' assert a.fermentable == model.Fermentable.get(1)
def test_simple_copy_with_overrides(self): model.Recipe(type='MASH', name='Rocky Mountain River IPA', gallons=5, boil_minutes=60, notes=u'This is my favorite recipe.') model.commit() recipe = model.Recipe.query.first() recipe.duplicate({ 'type': 'EXTRACT', 'name': 'Simcoe IPA', 'gallons': 10, 'boil_minutes': 90, 'notes': u'This is a duplicate.' }) model.commit() assert model.Recipe.query.count() == 2 assert model.RecipeSlug.query.count() == 2 r1, r2 = model.Recipe.get(1), model.Recipe.get(2) assert r2.type == 'EXTRACT' assert r2.name == 'Simcoe IPA' assert r2.gallons == 10 assert r2.boil_minutes == 90 assert r2.notes == u'This is a duplicate.'
def test_ibu_formula_selection_no_author(self): """ If a recipe has no author, it should fall back to Tinseth's formula. """ recipe = model.Recipe( name='Rocky Mountain River IPA', gallons=5 ) model.HopAddition( recipe=recipe, hop=model.Hop(name='Cascade'), amount=.0625, # 1 oz unit='POUND', duration=timedelta(minutes=30), alpha_acid=5.5, form='LEAF', use='BOIL' ) model.HopAddition( recipe=recipe, hop=model.Hop(name='Centennial'), amount=.0625, # 1 oz unit='POUND', duration=timedelta(minutes=60), alpha_acid=5.5, form='LEAF', use='BOIL' ) assert recipe.calculations.ibu == recipe.calculations.tinseth
def test_url_is_hex(self): for i in range(128): recipe = model.Recipe(id=i, name=u'Rocky Mountain River IPA') assert recipe.url() == '/recipes/%s/rocky-mountain-river-ipa/' % ( '%x' % i) assert recipe.url(False) == \ '/recipes/%s/rocky-mountain-river-ipa/builder' % ('%x' % i)
def test_draft_creation(self): model.Recipe(type='MASH', name='Rocky Mountain River IPA', gallons=5, boil_minutes=60, notes=u'This is my favorite recipe.', state=u'PUBLISHED') model.commit() model.Recipe.query.first().draft() model.commit() assert model.Recipe.query.count() == 2 source = model.Recipe.query.filter( model.Recipe.published_version == null()).first() # noqa draft = model.Recipe.query.filter( model.Recipe.published_version != null()).first() # noqa assert source != draft assert source.type == draft.type == 'MASH' assert source.name == draft.name == 'Rocky Mountain River IPA' assert source.state != draft.state assert draft.state == 'DRAFT' assert draft.published_version == source assert source.current_draft == draft
def test_ingredient_partition(self): recipe = model.Recipe() recipe.additions = [ model.RecipeAddition(use='MASH', fermentable=model.Fermentable()), model.RecipeAddition(use='MASH', hop=model.Hop()) ] partitions = recipe._partition(recipe.additions) assert len(partitions[model.Fermentable]) == 1 assert len(partitions[model.Hop]) == 1 recipe.additions = [ model.RecipeAddition(use='FIRST WORT', hop=model.Hop()), model.RecipeAddition(use='BOIL', hop=model.Hop()), model.RecipeAddition(use='POST-BOIL', hop=model.Hop()), model.RecipeAddition(use='FLAME OUT', hop=model.Hop()) ] partitions = recipe._partition(recipe.additions) assert len(partitions[model.Hop]) == 4 recipe.additions = [ model.RecipeAddition(use='PRIMARY', yeast=model.Yeast()), model.RecipeAddition(use='SECONDARY', yeast=model.Yeast()) ] partitions = recipe._partition(recipe.additions) assert len(partitions[model.Yeast]) == 2
def test_percentage(self): recipe = model.Recipe() a1 = model.RecipeAddition(use='MASH', amount=6, unit='POUND', fermentable=model.Fermentable()) a2 = model.RecipeAddition(use='MASH', amount=2, unit='POUND', fermentable=model.Fermentable()) a3 = model.RecipeAddition( use='BOIL', amount=.046875, # .75 oz unit='POUND', hop=model.Hop()) a4 = model.RecipeAddition( use='BOIL', amount=.015625, # .25 oz unit='POUND', hop=model.Hop()) recipe.additions = [a1, a2, a3, a4] assert a1.percentage == .75 assert a2.percentage == .25 assert a3.percentage == .75 assert a4.percentage == .25
def test_fermentation_steps_copy(self): model.Recipe(name='Rocky Mountain River IPA', fermentation_steps=[ model.FermentationStep(step='PRIMARY', days=14, fahrenheit=65), model.FermentationStep(step='SECONDARY', days=90, fahrenheit=45) ]) model.commit() recipe = model.Recipe.query.first() recipe.duplicate() model.commit() assert model.Recipe.query.count() == 2 assert model.FermentationStep.query.count() == 4 r1, r2 = model.Recipe.get(1), model.Recipe.get(2) assert len(r1.fermentation_steps) == len(r2.fermentation_steps) == 2 assert r1.fermentation_steps[0].step == r2.fermentation_steps[ 0].step == 'PRIMARY' assert r1.fermentation_steps[0].days == r2.fermentation_steps[ 0].days == 14 assert r1.fermentation_steps[0].fahrenheit == r2.fermentation_steps[ 0].fahrenheit == 65 assert r1.fermentation_steps[1].step == r2.fermentation_steps[ 1].step == 'SECONDARY' assert r1.fermentation_steps[1].days == r2.fermentation_steps[ 1].days == 90 assert r1.fermentation_steps[1].fahrenheit == r2.fermentation_steps[ 1].fahrenheit == 45
def test_views(self): recipe = model.Recipe() for i in range(5): model.RecipeView(recipe=recipe) model.commit() assert len(model.Recipe.query.first().views) == 5
def test_secondary_slug(self): source = model.Recipe(type='MASH', name='Rocky Mountain River IPA', gallons=5, boil_minutes=60, notes=u'This is my favorite recipe.', state=u'DRAFT') source.flush() primary_key = source.id model.commit() assert len(model.Recipe.query.first().slugs) == 1 model.Recipe.query.first().name = 'Cascade IPA' model.commit() model.Recipe.query.first().publish() model.commit() assert model.Recipe.query.count() == 1 assert model.Recipe.query.first().id == primary_key assert model.Recipe.query.first().state == "PUBLISHED" assert len(model.Recipe.query.first().slugs) == 2 recipe = model.Recipe.query.first() assert recipe.slugs[0].slug == 'rocky-mountain-river-ipa' assert recipe.slugs[1].slug == 'cascade-ipa' assert 'cascade-ipa' in recipe.url()
def test_fermentation_steps_copy_with_override(self): model.Recipe(name='Rocky Mountain River IPA', fermentation_steps=[ model.FermentationStep(step='PRIMARY', days=14, fahrenheit=65), model.FermentationStep(step='SECONDARY', days=90, fahrenheit=45) ]) model.commit() recipe = model.Recipe.query.first() recipe.duplicate({ 'fermentation_steps': [model.FermentationStep(step='PRIMARY', days=21, fahrenheit=75)] }) model.commit() assert model.Recipe.query.count() == 2 assert model.FermentationStep.query.count() == 3 r1, r2 = model.Recipe.get(1), model.Recipe.get(2) assert len(r1.fermentation_steps) == 2 assert len(r2.fermentation_steps) == 1 assert r2.fermentation_steps[0].step == 'PRIMARY' assert r2.fermentation_steps[0].days == 21 assert r2.fermentation_steps[0].fahrenheit == 75
def test_ingredient_percent(self): recipe = model.Recipe() a1 = model.RecipeAddition(use='MASH', amount=6, unit='POUND', fermentable=model.Fermentable()) a2 = model.RecipeAddition(use='MASH', amount=2, unit='POUND', fermentable=model.Fermentable()) a3 = model.RecipeAddition( use='MASH', amount=.046875, # .75 oz unit='POUND', hop=model.Hop()) a4 = model.RecipeAddition( use='MASH', amount=.015625, # .25 oz unit='POUND', hop=model.Hop()) percent = recipe._percent({'Fermentable': [a1, a2], 'Hop': [a3, a4]}) assert percent[a1] == .75 assert percent[a2] == .25 assert percent[a3] == .75 assert percent[a4] == .25
def test_international_printable_ounce_conversion(self): pecan.core.state.request = Request.blank('/') pecan.request.context = {'metric': True} r = model.Recipe() addition = model.RecipeAddition(amount=5, unit='OUNCE', recipe=r) assert addition.printable_amount == '141.748 g'
def test_international_printable_gallon_conversion(self): pecan.core.state.request = Request.blank('/') pecan.request.context = {'metric': True} r = model.Recipe() addition = model.RecipeAddition(amount=5, unit='GALLON', recipe=r) assert addition.printable_amount == '18.927 L'
def test_simple_publish(self): model.Recipe(name='Rocky Mountain River IPA', author=model.User.get(1)) model.Fermentable(name='2-Row', origin='US', ppg=36, lovibond=2) model.commit() assert model.Recipe.query.first().state == "DRAFT" self.post('/recipes/1/rocky-mountain-river-ipa/builder/publish/') assert model.Recipe.query.first().state == "PUBLISHED"
def test_view_draft_recipe_async(self): model.Recipe(name='Rocky Mountain River IPA', author=model.User(first_name='Ryan', last_name='Petrello'), state="DRAFT") model.commit() response = self.get('/recipes/1/rocky-mountain-river-ipa/', status=404) assert response.status_int == 404
def test_recipe_international_volume(self): recipe = model.Recipe(gallons=5) recipe.liters = 10 assert recipe.gallons == 2.6417205199999998 assert recipe.liters == 10 # 0, 0.25, 0.50, ... 99.50, 99.75, 100.00 for i in [x * 0.25 for x in range(0, 401)]: recipe.liters = i assert recipe.liters == i
def test_metric_false(self): """ When request.context['metric'] == False, model.Recipe.metric == False """ pecan.core.state.request = Request.blank('/') pecan.request.context = {'metric': False} recipe = model.Recipe() assert recipe.metric is False
def test_fg_cache(self): recipe = model.Recipe( name='Rocky Mountain River IPA', gallons=5, _fg=1.050 ) assert recipe.fg == 1.050 with self.assertRaises(AttributeError): recipe.fg = 1.080 assert recipe.fg == 1.050
def test_ibu_cache(self): recipe = model.Recipe( name='Rocky Mountain River IPA', gallons=5, _ibu=30 ) assert recipe.ibu == 30 with self.assertRaises(AttributeError): recipe.ibu = 40 assert recipe.ibu == 30
def test_srm_cache(self): recipe = model.Recipe( name='Rocky Mountain River IPA', gallons=5, _srm=10 ) assert recipe.srm == 10 with self.assertRaises(AttributeError): recipe.srm = 20 assert recipe.srm == 10
def test_abv_cache(self): recipe = model.Recipe( name='Rocky Mountain River IPA', gallons=5, _abv=8.0 ) assert recipe.abv == 8.0 with self.assertRaises(AttributeError): recipe.abv = 6.0 assert recipe.abv == 8.0
def test_additions_copy(self): recipe = model.Recipe(name=u'Sample Recipe') grain = model.Fermentable() primary_hop = model.Hop() bittering_hop = model.Hop() yeast = model.Yeast() recipe.additions = [ model.RecipeAddition(use='MASH', fermentable=grain), model.RecipeAddition(use='MASH', hop=primary_hop), model.RecipeAddition(use='FIRST WORT', hop=primary_hop), model.RecipeAddition( use='BOIL', hop=primary_hop, ), model.RecipeAddition(use='POST-BOIL', hop=primary_hop), model.RecipeAddition(use='FLAME OUT', hop=bittering_hop), model.RecipeAddition(use='PRIMARY', yeast=yeast), model.RecipeAddition(use='SECONDARY', yeast=yeast) ] model.commit() assert model.Recipe.query.count() == 1 assert model.RecipeAddition.query.count() == 8 assert model.Fermentable.query.count() == 1 assert model.Hop.query.count() == 2 assert model.Yeast.query.count() == 1 recipe = model.Recipe.query.first() recipe.duplicate() model.commit() assert model.Recipe.query.count() == 2 assert model.RecipeAddition.query.count() == 16 assert model.Fermentable.query.count() == 1 assert model.Hop.query.count() == 2 assert model.Yeast.query.count() == 1 r1, r2 = model.Recipe.get(1), model.Recipe.get(2) assert len(r1.additions) == len(r2.additions) == 8 for f in model.Fermentable.query.all(): assert f in [a.ingredient for a in r1.additions] assert f in [a.ingredient for a in r2.additions] assert len(set([a.recipe for a in f.additions])) == 2 for h in model.Hop.query.all(): assert h in [a.ingredient for a in r1.additions] assert h in [a.ingredient for a in r2.additions] assert len(set([a.recipe for a in h.additions])) == 2 for y in model.Yeast.query.all(): assert y in [a.ingredient for a in r1.additions] assert y in [a.ingredient for a in r2.additions] assert len(set([a.recipe for a in y.additions])) == 2
def test_unauthorized_lookup_trial_recipe(self): """ If the recipe has no author, and we're logged in as any user, we should *not* have access to edit the recipe. """ model.Recipe(name='American IPA', slugs=[model.RecipeSlug(name='American IPA')]) model.commit() response = self.get('/recipes/1/american-ipa/builder', status=401) assert response.status_int == 401
def test_unauthorized_lookup_trial_other_user(self): """ If the recipe is a trial recipe, but is not *our* trial recipe, we should *not* have access to edit the recipe. """ model.Recipe(name='American IPA', slugs=[model.RecipeSlug(name='American IPA')]) model.commit() response = self.get('/recipes/1/american-ipa/builder', status=401) assert response.status_int == 401
def test_eta(self): r = model.Recipe(boil_minutes=60) a = model.HopAddition(recipe=r, duration=timedelta(seconds=3600)) assert a.eta == '0m' a = model.HopAddition(recipe=r, duration=timedelta(seconds=1800)) assert a.eta == '30m' a = model.HopAddition(recipe=r, duration=timedelta(seconds=0)) assert a.eta == '60m'