예제 #1
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
예제 #2
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
예제 #3
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
예제 #4
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
예제 #5
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
예제 #6
0
    def test_draft_merge_additions(self):
        recipe = model.Recipe(name='Rocky Mountain River IPA',
                              state=u'PUBLISHED')

        # Add some ingredients
        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()

        # Make a new draft of the recipe
        model.Recipe.query.first().draft()
        model.commit()

        assert model.Recipe.query.count() == 2

        # Change the ingredients of the draft
        draft = model.Recipe.query.filter(
            model.Recipe.state == 'DRAFT').first()
        draft.additions = [
            model.RecipeAddition(use='MASH',
                                 fermentable=model.Fermentable.query.first())
        ]
        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.RecipeAddition.query.count() == 1
        published = model.Recipe.query.first()

        assert published.additions[
            0].fermentable == model.Fermentable.query.first()
예제 #7
0
    def test_printed_name(self):
        assert model.Fermentable(name='2-Row',
                                 origin='US').printed_name == u'2-Row (US)'

        assert model.Fermentable(
            name='2-Row', origin='BELGIAN').printed_name == u'2-Row (Belgian)'

        assert model.Hop(name='Cascade',
                         origin='US').printed_name == u'Cascade (US)'

        assert model.Hop(name='Cascade',
                         origin='BELGIAN').printed_name == u'Cascade (Belgian)'

        assert model.Yeast(name='Wyeast 1056 - American Ale'
                           ).printed_name == u'Wyeast 1056 - American Ale'
예제 #8
0
    def test_additions_copy_with_overrides(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({
            'additions': [
                model.RecipeAddition(
                    use='MASH', fermentable=model.Fermentable.query.first())
            ]
        })
        model.commit()

        assert model.Recipe.query.count() == 2
        assert model.RecipeAddition.query.count() == 9
        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) == 8
        assert len(r2.additions) == 1

        assert r2.additions[0].fermentable == model.Fermentable.query.first()
예제 #9
0
    def test_hop_ingredient(self):
        addition = model.RecipeAddition()
        hop = model.Hop()

        addition.hop = hop

        assert addition.ingredient == hop
예제 #10
0
    def test_change_hop_aa(self):
        model.Hop(name="Simcoe",
                  origin='US',
                  alpha_acid=13,
                  description='Sample Description')
        model.commit()
        self.b.refresh()

        for step in ('Mash', 'Boil', 'Ferment'):
            self.b.find_element_by_link_text(step).click()

            label = 'Add Dry Hops...' if step == 'Ferment' else 'Add Hops...'
            self.b.find_element_by_link_text(label).click()
            self.b.find_element_by_link_text("Simcoe (US)").click()

            i = self.b.find_element_by_css_selector(
                '.%s .addition .unit input' % step.lower())
            i.clear()
            i.send_keys('12')
            self.blur()
            time.sleep(2)

            self.b.refresh()

            i = self.b.find_element_by_css_selector(
                '.%s .addition .unit input' % step.lower())
            assert i.get_attribute('value') == '12'
예제 #11
0
    def test_change_hop_form(self):
        model.Hop(name="Simcoe",
                  origin='US',
                  alpha_acid=13,
                  description='Sample Description')
        model.commit()
        self.b.refresh()

        for step in ('Mash', 'Boil', 'Ferment'):
            self.b.find_element_by_link_text(step).click()

            label = 'Add Dry Hops...' if step == 'Ferment' else 'Add Hops...'
            self.b.find_element_by_link_text(label).click()
            self.b.find_element_by_link_text("Simcoe (US)").click()

            s = Select(
                self.b.find_element_by_css_selector(
                    '.%s .addition .form select' % step.lower()))
            s.select_by_visible_text('Pellet')
            self.blur()
            time.sleep(2)

            self.b.refresh()

            s = self.b.find_element_by_css_selector(
                '.%s .addition .form select' % step.lower())
            assert s.get_attribute('value') == 'PELLET'
예제 #12
0
    def test_remove_addition(self):
        model.Hop(name="Simcoe",
                  origin='US',
                  alpha_acid=13,
                  description='Sample Description')
        model.commit()
        self.b.refresh()

        for step in ('Mash', 'Boil', 'Ferment'):
            self.b.find_element_by_link_text(step).click()

            assert len(
                self.b.find_elements_by_css_selector(
                    '.%s .ingredient-list .addition' % step.lower())) == 0

            label = 'Add Dry Hops...' if step == 'Ferment' else 'Add Hops...'
            self.b.find_element_by_link_text(label).click()
            self.b.find_element_by_link_text("Simcoe (US)").click()
            time.sleep(2)

            assert len(
                self.b.find_elements_by_css_selector(
                    '.%s .ingredient-list .addition:not(:empty)' %
                    step.lower())) == 1

            self.b.find_element_by_css_selector(
                '.%s .ingredient-list .addition .close a' %
                step.lower()).click()
            time.sleep(2)
            self.b.refresh()

            assert len(
                self.b.find_elements_by_css_selector(
                    '.%s .ingredient-list .addition' % step.lower())) == 0
예제 #13
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)
예제 #14
0
    def test_recipe_components(self):
        recipe = model.Recipe()

        recipe.additions = [
            model.RecipeAddition(use='MASH', fermentable=model.Fermentable()),
            model.RecipeAddition(use='MASH', hop=model.Hop()),
            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()),
            model.RecipeAddition(use='PRIMARY', yeast=model.Yeast()),
            model.RecipeAddition(use='SECONDARY', yeast=model.Yeast())
        ]

        assert len(recipe.mash[model.Fermentable]) == 1
        assert len(recipe.mash[model.Hop]) == 1
        assert len(recipe.boil[model.Hop]) == 4
        assert len(recipe.fermentation[model.Yeast]) == 2
예제 #15
0
    def test_ibu_formula_selection_with_author(self):
        """
        The IBU calculation formula used should be whatever the recipe's
        author has specified.
        """
        user = model.User()
        recipe = model.Recipe(
            name='Rocky Mountain River IPA',
            gallons=5,
            author=user
        )
        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 user.settings['default_ibu_formula'] == 'tinseth'
        assert recipe.calculations.ibu == recipe.calculations.tinseth

        user.settings['default_ibu_formula'] = 'rager'
        assert recipe.calculations.ibu == recipe.calculations.rager

        user.settings['default_ibu_formula'] = 'daniels'
        assert recipe.calculations.ibu == recipe.calculations.daniels
예제 #16
0
    def test_change_hop_flameout(self):
        model.Hop(name="Simcoe",
                  origin='US',
                  alpha_acid=13,
                  description='Sample Description')
        model.commit()
        self.b.refresh()

        self.b.find_element_by_link_text('Boil').click()

        self.b.find_element_by_link_text('Add Hops...').click()
        self.b.find_element_by_link_text("Simcoe (US)").click()

        selects = self.b.find_elements_by_css_selector(
            '.boil .addition .time select')
        Select(selects[0]).select_by_visible_text('Flame Out')
        assert not selects[1].is_displayed()
예제 #17
0
    def test_change_hop_boil_time(self):
        model.Hop(name="Simcoe",
                  origin='US',
                  alpha_acid=13,
                  description='Sample Description')
        model.commit()
        self.b.refresh()

        self.b.find_element_by_link_text('Boil').click()

        self.b.find_element_by_link_text('Add Hops...').click()
        self.b.find_element_by_link_text("Simcoe (US)").click()

        selects = self.b.find_elements_by_css_selector(
            '.boil .addition .time select')
        Select(selects[1]).select_by_visible_text('45 min')
        self.blur()
        time.sleep(2)

        self.b.refresh()

        selects = self.b.find_elements_by_css_selector(
            '.boil .addition .time select')
        assert selects[1].get_attribute('value') == '45'
예제 #18
0
    def test_recipe_contains(self):
        recipe = model.Recipe()

        f1 = model.Fermentable()
        h1 = model.Hop()
        h2 = model.Hop()
        h3 = model.Hop()
        h4 = model.Hop()
        h5 = model.Hop()
        y1 = model.Yeast()
        y2 = model.Yeast()

        recipe.additions = [
            model.RecipeAddition(use='MASH', fermentable=f1),
            model.RecipeAddition(use='MASH', hop=h1),
            model.RecipeAddition(use='FIRST WORT', hop=h2),
            model.RecipeAddition(use='BOIL', hop=h3),
            model.RecipeAddition(use='POST-BOIL', hop=h4),
            model.RecipeAddition(use='FLAME OUT', hop=h5),
            model.RecipeAddition(use='PRIMARY', yeast=y1),
            model.RecipeAddition(use='SECONDARY', yeast=y2)
        ]

        assert recipe.contains(f1, 'mash')
        assert recipe.contains(f1, 'boil') is False
        assert recipe.contains(f1, 'fermentation') is False

        assert recipe.contains(h1, 'mash')
        assert recipe.contains(h1, 'boil') is False
        assert recipe.contains(h1, 'fermentation') is False

        assert recipe.contains(h2, 'mash') is False
        assert recipe.contains(h2, 'boil')
        assert recipe.contains(h2, 'fermentation') is False

        assert recipe.contains(h3, 'mash') is False
        assert recipe.contains(h3, 'boil')
        assert recipe.contains(h3, 'fermentation') is False

        assert recipe.contains(h4, 'mash') is False
        assert recipe.contains(h4, 'boil')
        assert recipe.contains(h4, 'fermentation') is False

        assert recipe.contains(h5, 'mash') is False
        assert recipe.contains(h5, 'boil')
        assert recipe.contains(h5, 'fermentation') is False

        assert recipe.contains(y1, 'mash') is False
        assert recipe.contains(y1, 'boil') is False
        assert recipe.contains(y1, 'fermentation')

        assert recipe.contains(y2, 'mash') is False
        assert recipe.contains(y2, 'boil') is False
        assert recipe.contains(y2, 'fermentation')

        assert recipe.contains(f1, 'invalid') is False
        assert recipe.contains(h1, 'invalid') is False
        assert recipe.contains(h2, 'invalid') is False
        assert recipe.contains(h3, 'invalid') is False
        assert recipe.contains(h4, 'invalid') is False
        assert recipe.contains(h5, 'invalid') is False
        assert recipe.contains(y1, 'invalid') is False
        assert recipe.contains(y2, 'invalid') is False