Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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')
Ejemplo n.º 4
0
    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'
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
    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.'
Ejemplo n.º 7
0
    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
Ejemplo n.º 8
0
 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)
Ejemplo n.º 9
0
    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
Ejemplo n.º 10
0
    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
Ejemplo n.º 11
0
    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
Ejemplo n.º 12
0
    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
Ejemplo n.º 13
0
    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
Ejemplo n.º 14
0
    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()
Ejemplo n.º 15
0
    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
Ejemplo n.º 16
0
    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
Ejemplo n.º 17
0
    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'
Ejemplo n.º 18
0
    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'
Ejemplo n.º 19
0
    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"
Ejemplo n.º 20
0
    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
Ejemplo n.º 21
0
    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
Ejemplo n.º 22
0
    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
Ejemplo n.º 23
0
 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
Ejemplo n.º 24
0
 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
Ejemplo n.º 25
0
 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
Ejemplo n.º 26
0
 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
Ejemplo n.º 27
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
Ejemplo n.º 28
0
    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
Ejemplo n.º 29
0
    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
Ejemplo n.º 30
0
    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'