def test_should_not_save_changes(self):
        quote_request = QuoteRequest(self.quote)
        old_date = self.quote.date
        quote_request.update_date()
        self.db.session.rollback()

        self.assertEqual(old_date, self.quote.date)
    def test_should_return_none_given_non_existent_product_name(self):
        quote_request = QuoteRequest(self.quote)
        url = url_for('quote.edit', id=self.quote.id)
        product_data = dict(
            name="Test two"
        )
        with self.request_context(url, product_data):
            product = quote_request.get_product()

        self.assertEqual(product, None)
    def test_should_duplicate_and_add_existing_product_given_product_name_exists(self):
        quote_request = QuoteRequest(self.quote)
        url = url_for('quote.edit', id=self.quote.id)
        product_data = dict(
            name="Test"
        )
        with self.request_context(url, product_data):
            quote_request.add_product()

        self.assertEqual(len(self.quote.products), 2)
    def test_should_update_address(self):
        quote_request = QuoteRequest(self.quote)
        url = url_for('quote.edit', id=self.quote.id)
        quote_data = dict(
            address="New Address"
        )
        with self.request_context(url, quote_data):
            quote_request.attempt_update_address()

        self.assertEqual(self.quote.address, "New Address")
    def test_should_not_save_changes(self):
        quote_request = QuoteRequest(self.quote)
        url = url_for('quote.edit', id=self.quote.id)
        quote_data = dict(
            address="New Address"
        )
        with self.request_context(url, quote_data):
            quote_request.attempt_update_address()
        self.db.session.rollback()

        self.assertNotEqual(self.quote.address, "New Address")
    def test_should_update_quote_given_valid_quote_data(self):
        quote_request = QuoteRequest(self.quote)
        url = url_for('quote.edit', id=self.quote.id)
        quote_data = dict(
            address="New Address"
        )
        old_date = self.quote.date
        with self.request_context(url, quote_data):
            quote_request.update_attributes()

        self.assertEqual(self.quote.address, "New Address")
        self.assertLess(old_date, self.quote.date)
    def test_should_return_product_created_using_form_data(self):
        quote_request = QuoteRequest(self.quote)
        form = dict(
            name="Test two",
            material="",
            acabado="Acabado two",
            cristal="Cristal two"
        )
        product = quote_request.make_product(form)

        self.assertEqual(product.name, "Test two")
        self.assertEqual(product.material, "")
    def test_should_not_create_and_add_new_product_given_invalid_product_data(self):
        quote_request = QuoteRequest(self.quote)
        url = url_for('quote.edit', id=self.quote.id)
        product_data = dict(
            name="Test two",
            material="",
            acabado="",
            cristal=""
        )
        with self.request_context(url, product_data):
            quote_request.add_product()

        self.assertEqual(len(self.quote.products), 1)
    def test_should_return_new_product_given_invalid_product_data(self):
        quote_request = QuoteRequest(self.quote)
        url = url_for('quote.edit', id=self.quote.id)
        product_data = dict(
            name="",
            material="",
            acabado="",
            cristal=""
        )
        with self.request_context(url, product_data):
            product = quote_request.new_product

        self.assertEqual(product.name, "")
    def test_should_not_save_changes_given_invalid_data(self):
        quote_request = QuoteRequest(self.quote)
        url = url_for('quote.edit', id=self.quote.id)
        quote_data = dict(
            customer_name="",
            email="test.email.com",
            address="New address",
            name1="",
            material1="New Material",
            acabado1="",
            cristal1="New Cristal",
            name="Test Two",
            material="",
            acabado="Acabado two",
            cristal="Cristal two"
        )
        with self.request_context(url, quote_data):
            quote_request.edit()
        self.db.session.rollback()

        self.assertEqual(self.customer.name, "Test")
        self.assertEqual(self.product.name, "Test")
        self.assertNotEqual(self.quote.address, "New address")
        self.assertEqual(len(Product.get_all()), 1)
    def test_should_not_update_address_if_no_address_is_given(self):
        quote_request = QuoteRequest(self.quote)
        quote_request.attempt_update_address()

        self.assertEqual(self.quote.address, None)
    def test_should_set_address_to_customer_address_given_no_address_has_been_set(self):
        quote_request = QuoteRequest(self.quote)
        quote_request.update_address()

        self.assertEqual(self.quote.address, self.customer.address)
    def test_should_update_date(self):
        quote_request = QuoteRequest(self.quote)
        old_date = self.quote.date
        quote_request.update_date()

        self.assertLess(old_date, self.quote.date)