def test_ingredient_add(self): """ Tests the add ingredient method. """ widget = RecipeTableWidget() ingredient_name_0 = random_string() energy_value_0 = random_energy_value() ingredient_mass_0 = "100" ingredient_name_1 = random_string() energy_value_1 = random_energy_value() ingredient_mass_1 = "100" widget.add_ingredient(ingredient_name_0, energy_value_0, ingredient_mass_0) self.assertEqual(widget.rowCount(), 1) self._assert_table_row(widget, 0, ingredient_name_0, energy_value_0, ingredient_mass_0) widget.add_ingredient(ingredient_name_1, energy_value_1, ingredient_mass_1) self.assertEqual(widget.rowCount(), 2) self._assert_table_row(widget, 0, ingredient_name_0, energy_value_0, ingredient_mass_0) self._assert_table_row(widget, 1, ingredient_name_1, energy_value_1, ingredient_mass_1)
def test_energy_data_str_no_mass(self): """ Tests the energy_data_str function with no mass parameter. """ energy_value = random_energy_value() energy_value_str = energy_data_str(energy_value, None) expected_str = _build_expected_energy_data_str(energy_value, None) self.assertEqual(energy_value_str, expected_str)
def test_energy_data_str_basic(self): """ Tests the energy_data_str function. """ energy_value = random_energy_value() energy_value_str = energy_data_str(energy_value) expected_str = _build_expected_energy_data_str(energy_value, 100) self.assertEqual(energy_value_str, expected_str)
def test_energy_value(self): """ Tests energy_value method. """ recipe_builder = RecipeBuilder() energy_value = random_energy_value() recipe_builder._energy_value_per_serving = energy_value self.assertEqual(energy_value.calories, recipe_builder.energy_value().calories)
def test_set_total(self): """ Tests the set total method. """ widget = TotalEnergyValueWidget() energy_value = random_energy_value() widget.set_total(energy_value) self.assertEqual(widget.widget.text(), energy_data_str(energy_value, product_mass=None))
def test_set_energy_value(self): """ Tests the set energy value method. """ widget = EnergyValueWidget() energy_value = random_energy_value() ingredient_mass = 100 widget.set_energy_value(energy_value, ingredient_mass) self.assertEqual(widget.widget.text(), energy_data_str(energy_value, ingredient_mass))
def test_recalculate(self): """ Tests recalculate method. """ recipe_builder = RecipeBuilder() ingredient = build_ingredient("test", "g.", 100) energy_value = random_energy_value() recipe_builder._ingredients = [(ingredient, energy_value)] recipe_builder.recalculate() self.assertAlmostEqual( energy_value.calories, recipe_builder._energy_value_per_serving.calories)
def test_add_ingredient(self): """ Tests add_ingredient method. """ recipe_builder = RecipeBuilder() ingredient = build_ingredient("test", "g.", 100) energy_value = random_energy_value() recipe_builder.add_ingredient(ingredient, energy_value) self.assertEqual(recipe_builder._ingredients, [(ingredient, energy_value)]) self.assertAlmostEqual( energy_value.calories, recipe_builder._energy_value_per_serving.calories)
def test_energy_data_str_scale(self): """ Tests the energy_data_str function with scale parameter. """ energy_value = random_energy_value() ingredient_mass = 250 energy_value_str = energy_data_str(energy_value, ingredient_mass, needs_scaling=True) energy_value = scale(energy_value, ingredient_mass) expected_str = _build_expected_energy_data_str(energy_value, ingredient_mass) self.assertEqual(energy_value_str, expected_str)
def test_set_serves_changes_energy_value(self): """ Tests that after set_serves method energy value is recalculated. """ recipe_builder = RecipeBuilder() ingredient = build_ingredient("test", "g.", 100) energy_value = random_energy_value() recipe_builder.add_ingredient(ingredient, energy_value) recipe_builder.set_serves(2) # Default is 100.0, for 2 serves it will be 50.0 energy_value = scale(energy_value, 50.0) self.assertAlmostEqual( energy_value.calories, recipe_builder._energy_value_per_serving.calories)
def test_scale(self): """ Tests the scale function. """ energy_value = random_energy_value() scale_factor = 250.0 scaled = scale(energy_value, scale_factor) expected_energy_value = energy_value expected_energy_value.calories *= scale_factor / 100.0 expected_energy_value.protein *= scale_factor / 100.0 expected_energy_value.fat *= scale_factor / 100.0 expected_energy_value.carbohydrates *= scale_factor / 100.0 self.assertAlmostEqual(scaled.calories, expected_energy_value.calories) self.assertAlmostEqual(scaled.protein, expected_energy_value.protein) self.assertAlmostEqual(scaled.fat, expected_energy_value.fat) self.assertAlmostEqual(scaled.carbohydrates, expected_energy_value.carbohydrates)
def test_build(self): """ Tests build method. """ ingredient = build_ingredient("test", "g.", 100) energy_value = random_energy_value() # Nothing is set. recipe_builder = RecipeBuilder() with self.assertRaises(RuntimeError): recipe_builder.build() # Ingredients are not set. recipe_builder = RecipeBuilder() recipe_builder.set_recipe_name("Test") recipe_builder.set_recipe_text("Test") with self.assertRaises(RuntimeError): recipe_builder.build() # Recipe name is not set. recipe_builder = RecipeBuilder() recipe_builder.add_ingredient(ingredient, energy_value) recipe_builder.set_recipe_text("Test") with self.assertRaises(RuntimeError): recipe_builder.build() # Everything is set. recipe_builder = RecipeBuilder() recipe_builder.add_ingredient(ingredient, energy_value) recipe_builder.set_recipe_text("Test") recipe_builder.set_recipe_name("Test") recipe_builder.set_serves(2) recipe = recipe_builder.build() self.assertTrue(isinstance(recipe, Recipe)) self.assertEqual(recipe.name, "Test") self.assertEqual(recipe.text, "Test") self.assertEqual(recipe.serves_amount, 2) self.assertEqual(recipe.ingredients, [ingredient]) self.assertEqual(recipe.energy_value_per_serving, scale(energy_value, 50.0))
class TestRecipeBuilderWidget(UsesQApplication): """ Tests for the recipe builder widget. """ # This is a test, access to the private members is ok. # pylint: disable=protected-access CALORIES_DATA = {"test": random_energy_value()} def assert_children_type(self, widget, expected_type): """ Verifies that widget has a child with a given name and this child has expected type. """ child = widget.findChild(expected_type) self.assertIsNotNone(child, "Expected find child with type {}, got None".format(expected_type)) self.assertTrue(isinstance(child, expected_type)) def test_recipe_builder_layout(self): """ Tests the widget layout. """ widget = RecipeBuilderWidget(self.CALORIES_DATA) expected_children = [ RecipeNameWidget, ServesAmountWidget, IngredientWidget, EnergyValueWidget, RecipeTableWidget, TotalEnergyValueWidget, RecipeTextWidget, SaveButtonWidget, ] for expected_type in expected_children: self.assert_children_type(widget, expected_type) def test_recipe_builder_ingredient_entered(self): """ Tests that when ingredient entered, the energy value string is updated. """ widget = RecipeBuilderWidget(self.CALORIES_DATA) energy_value_widget = widget.findChild(EnergyValueWidget) widget._ingredient_entered("test", 100) expected_text = energy_data_str(self.CALORIES_DATA["test"], 100) self.assertEqual(energy_value_widget.widget.text(), expected_text) def test_recipe_builder_incorrected_ingredient_entered(self): """ Tests that when incorrect ingredient entered, nothing happens. """ widget = RecipeBuilderWidget(self.CALORIES_DATA) energy_value_widget = widget.findChild(EnergyValueWidget) widget._ingredient_entered("wrong_value", 100) expected_text = "" self.assertEqual(energy_value_widget.widget.text(), expected_text) def test_recipe_builder_ingredient_finalized(self): """ Tests that when ingredient finalized, child widgets are updated as expected. """ widget = RecipeBuilderWidget(self.CALORIES_DATA) total_energy_value_widget = widget.findChild(TotalEnergyValueWidget) recipe_table_widget = widget.findChild(RecipeTableWidget) widget._ingredient_finalized("test", 100) expected_text = energy_data_str(self.CALORIES_DATA["test"], None) self.assertEqual(total_energy_value_widget.widget.text(), expected_text) self.assertEqual(recipe_table_widget.rowCount(), 1) self.assertEqual(len(widget._recipe_builder._ingredients), 1) @patch("nutrition.recipe.RecipeManager.save", autospec=True) @patch(f"{IMPORT_PATH_PREFIX}.recipe_name.RecipeNameWidget.name", return_value="Test", autospec=True) @patch(f"{IMPORT_PATH_PREFIX}.recipe_text.RecipeTextWidget.get_text", return_value="Test", autospec=True) def test_recipe_builder_save(self, mock_save, _mock_name, _mock_get_text): """ Tests _on_save_button_clicked method. """ widget = RecipeBuilderWidget(self.CALORIES_DATA) widget._ingredient_finalized("test", 100) widget._on_save_button_clicked() self.assertTrue(mock_save.called)