예제 #1
0
    def test_export_csv(self):
        guest1 = save_guest(EXAMPLE_GUEST_1)
        guest2 = save_guest(EXAMPLE_GUEST_2)
        exported = self.handler.export_csv().getvalue().split("\r\n")
        exploded_exported_list = [list(filter(lambda x:x != '', exp.split(","))) for exp in exported]   # explode each line to items, remove empty strings

        self.assertCountEqual(list(guest1.get_attributes().keys()), exploded_exported_list[0])
        self.assertCountEqual([str(guest_attr) for guest_attr in guest1.attribute_values.values()], exploded_exported_list[1])
        self.assertCountEqual([str(guest_attr) for guest_attr in guest2.attribute_values.values()], exploded_exported_list[2])
예제 #2
0
    def test_list_guests(self):
        save_guest(EXAMPLE_GUEST_1)

        response = self.client.get("/admin/guest/list")

        self.assert200(response)
        self.assert_template_used("guest_list.html")
        self.assertIn(EXAMPLE_GUEST_1["name"], response.data.decode("utf-8"))
        self.assertNotIn("FakeUser", response.data.decode("utf-8"))
예제 #3
0
    def test_different_user_id_in_session_and_url(self):
        guest = save_guest(EXAMPLE_GUEST_1)
        guest2 = save_guest(EXAMPLE_GUEST_2)
        self.client.get(f"/rsvp/{str(guest.id)}", follow_redirects=True)      # user logs in
        response = self.client.get(f"/rsvp/")                                  # user_id from session

        self.assert200(response)
        self.assert_template_used("rsvp.html")
        self.assertIn(EXAMPLE_GUEST_1["name"], response.data.decode("utf-8"))

        response = self.client.get(f"/rsvp/{guest2.id}")
        self.assertNotIn(EXAMPLE_GUEST_2["name"], response.data.decode("utf-8"))

        self.assert404(response)
        self.assert_template_used("errors/404.html")
    def test_export_guests(self):
        guest1 = save_guest(EXAMPLE_GUEST_1)
        guest2 = save_guest(EXAMPLE_GUEST_2)
        response = self.client.get("/admin/guest/export")

        content_lines = response.data.decode("utf-8").split("\r\n")
        self.assertIn("text/csv", response.content_type)

        for header_name in guest1.get_attributes().keys():
            self.assertIn(header_name, content_lines[0])

        for table_member in guest1.attribute_values.values():
            self.assertIn(str(table_member), content_lines[1])

        for table_member in guest2.attribute_values.values():
            self.assertIn(str(table_member), content_lines[2])
예제 #5
0
    def test_delete_guest_no_such_guest(self):
        guest_data = EXAMPLE_GUEST_1
        guest_id = save_guest(guest_data).id
        response = self.client.post(f"/admin/guest/delete/{guest_id}XXX")

        self.assert404(response)
        self.assert_template_used("errors/404.html")
예제 #6
0
    def test_login_to_admin_after_guest(self):
        username = "******"
        guest_id = save_guest(dict(name=username, email="*****@*****.**")).id

        # Admin visits it's owwn guest page
        self.browser.get(f"{self.get_server_url()}/rsvp/{guest_id}")
        self.assertEqual(f"Wedding RSVP | {username}", self.browser.title)

        # now that he has a session cookie, he gets recognized even without the user id in the URL
        self.browser.get(f"{self.get_server_url()}/rsvp")
        self.assertEqual(f"Wedding RSVP | {username}", self.browser.title)

        # He want's to login to the admin page
        self.browser.get(f"{self.get_server_url()}/admin")
        password_field = self.browser.find_element_by_id("password")
        password_field.send_keys(Keys.BACKSPACE)
        password_field.send_keys('password')
        password_field.send_keys(Keys.ENTER)

        # He is redirected to the admin page
        WebDriverWait(self.browser, 5, ignored_exceptions=(NoSuchElementException,)) \
            .until(expected_conditions.staleness_of(password_field))

        self.assertEqual("Admin page", self.browser.title)

        # He goes to the Guest list page
        link = self.browser.find_element_by_link_text('Guest list')
        link.click()

        WebDriverWait(self.browser, 5, ignored_exceptions=(NoSuchElementException,)) \
            .until(expected_conditions.staleness_of(password_field))

        self.assertEqual("Guest list", self.browser.title)
예제 #7
0
    def test_existing_user_found(self):
        guest_id = save_guest(EXAMPLE_GUEST_1).id

        response = self.client.get(f"/rsvp/{guest_id}", follow_redirects=True)

        self.assert200(response)
        self.assert_template_used("rsvp.html")
        self.assertIn(EXAMPLE_GUEST_1["name"], response.data.decode("utf-8"))
예제 #8
0
    def test_unsubscribe(self):
        guest = save_guest(EXAMPLE_GUEST_1)
        response = self.client.get(f"/rsvp/unsubscribe/{guest.id}?email={guest.email}", follow_redirects=True)

        guests = list_guests()
        self.assertNotIn(guest, guests)
        self.assert200(response)
        self.assert_template_used("unsubscribe.html")
예제 #9
0
    def test_userpage_with_extra_url_parameter(self):
        guest_id = save_guest(EXAMPLE_GUEST_1).id

        response = self.client.get(f"/rsvp/{guest_id}?fbcid=XXXXXXXXXXXX", follow_redirects=True)

        self.assert200(response)
        self.assert_template_used("rsvp.html")
        self.assertIn(EXAMPLE_GUEST_1["name"], response.data.decode("utf-8"))
예제 #10
0
    def test_delete_guest(self):
        guest_data = EXAMPLE_GUEST_1
        guest_id = save_guest(guest_data).id
        response = self.client.post(f"/admin/guest/delete/{guest_id}")
        guests = list_guests()

        self.assert_redirects(response, "/admin/guest/list")
        self.assertMessageFlashed(f"Guest {EXAMPLE_GUEST_1['name']} removed")
        self.assertEqual(len(guests), 0)
예제 #11
0
    def test_form_descriptions(self):
        from tests import context
        guest = save_guest(EXAMPLE_GUEST_1)
        form = context.app.rsvp.forms.GuestForm()

        response = self.client.get(f"/rsvp/{guest.id}", follow_redirects=True)

        for key in form.data.keys():
            if form[key].description:
                self.assertIn(str(form[key].description), response.data.decode("utf-8"))
예제 #12
0
 def test_edit_guest_page(self):
     guest_data = EXAMPLE_GUEST_1
     guest_id = save_guest(guest_data).id
     response = self.client.get(f"/admin/guest/edit/{guest_id}")
     self.assert200(response)
     self.assert_template_used("guest_form.html")
     for key, value in guest_data.items():
         self.assertIn(f"name=\"{key}\"", html.unescape(response.data.decode("utf-8")))
         if type(value) is not bool:
             self.assertIn(str(value), html.unescape(response.data.decode("utf-8")))
         else:
             string_val = "y" if value else "n"
             self.assertIn(f"value=\"{string_val}\"", html.unescape(response.data.decode("utf-8")))
예제 #13
0
    def test_rsvp_fill_form_validators(self):
        self.app.config["USE_RECAPTCHA_FOR_GUEST"] = False
        guest_data = dict(EXAMPLE_GUEST_1)
        edited_guest_data = {"food_allergies": "Kartoffel",
                             "number_of_guests": -1,
                             "notes": "blahblah",
                             "favourite_music": "Pink Floyd"}
        guest_id = save_guest(guest_data).id
        self.client.get(f"/rsvp/{str(guest_id)}", follow_redirects=True)      # user logs in
        response = self.client.post(f"/rsvp/{guest_id}", data=edited_guest_data)
        edited_guest = get_guest(guest_id)

        self.assertIn("Number must be between", response.data.decode("utf-8"))
        self.assertEqual(edited_guest.number_of_guests, EXAMPLE_GUEST_1["number_of_guests"])
예제 #14
0
    def test_edit_guest(self):
        guest_data = dict(EXAMPLE_GUEST_1)
        edited_guest_data = dict(EXAMPLE_GUEST_2)
        edited_guest_data.pop("will_attend")
        guest_id = save_guest(guest_data).id
        response = self.client.post(f"/admin/guest/edit/{guest_id}", data=edited_guest_data)
        guests = list_guests()

        self.assert_redirects(response, "/admin/guest/list")
        self.assertEqual(len(guests), 1)
        edited_guest_data["filled_by_admin"] = True
        edited_guest_data["id"] = guests[0].id
        edited_guest_data["will_attend"] = False
        edited_guest_data["notes"] = ''
        self.assertDictEqual(guests[0].__dict__["attribute_values"], edited_guest_data)
예제 #15
0
    def test_rsvp_auth(self):
        username = "******"
        guest_id = save_guest(dict(name=username, email="*****@*****.**")).id

        # testuser goes to the rsvp page, but gets rejected
        self.browser.get(f"{self.get_server_url()}/rsvp")
        self.assertEqual("404 - Not found", self.browser.title)

        # now he goes to hos special link - he is recognized and accepted
        self.browser.get(f"{self.get_server_url()}/rsvp/{guest_id}")
        self.assertEqual(f"Wedding RSVP | {username}", self.browser.title)

        # now that he has a session cookie, he gets recognized even without the user id in the URL
        self.browser.get(f"{self.get_server_url()}/rsvp")
        self.assertEqual(f"Wedding RSVP | {username}", self.browser.title)
예제 #16
0
    def test_rsvp_page(self):
        edit_allowed = ["will_attend", "favourite_music", "food_allergies", "number_of_guests", "notes"]

        guest = save_guest(EXAMPLE_GUEST_1)
        response = self.client.get(f"/rsvp/{guest.id}", follow_redirects=True)

        self.assert200(response)
        self.assert_template_used("rsvp.html")
        for key, value in EXAMPLE_GUEST_1.items():
            if key in edit_allowed:
                if type(value) is str:
                    self.assertIn(value, html.unescape(response.data.decode("utf-8")))
                if type(value) is bool and value is True:
                    self.assertIn("checked", response.data.decode("utf-8"))
                if type(value) is bool and value is False:
                    self.assertNotIn("checked", response.data.decode("utf-8"))
예제 #17
0
    def test_personalized_data_is_present(self):
        self.app.config["USE_RECAPTCHA_FOR_GUEST"] = False
        guest_data = dict(EXAMPLE_GUEST_1)
        guest_id = save_guest(guest_data).id
        response = self.client.get(f"/rsvp/{str(guest_id)}", follow_redirects=True)      # user logs in

        with open(os.getenv('PERSONALIZE_SRC_FILE'), 'r') as stream:
            try:
                personalized_data = yaml.safe_load(stream)
            except yaml.YAMLError as exc:
                print(exc)
        self.assertIn(personalized_data["basic_data"]["bride"], response.data.decode("utf-8"))
        self.assertIn(personalized_data["basic_data"]["groom"], response.data.decode("utf-8"))
        self.assertIn(personalized_data["main_message"], response.data.decode("utf-8"))
        for _event in personalized_data["wedding_events"]:
            self.assertIn(_event['name'], response.data.decode("utf-8"))
            self.assertIn(_event['description'], response.data.decode("utf-8"))
예제 #18
0
    def test_rsvp_fill_form(self):
        self.app.config["USE_RECAPTCHA_FOR_GUEST"] = False
        guest_data = dict(EXAMPLE_GUEST_1)
        edited_guest_data = {"food_allergies": "Kartoffel",
                             "number_of_guests": 2,
                             "notes": "blahblah",
                             "favourite_music": "Pink Floyd"}
        guest_id = save_guest(guest_data).id
        self.client.get(f"/rsvp/{str(guest_id)}", follow_redirects=True)      # user logs in
        self.client.post(f"/rsvp/{guest_id}", data=edited_guest_data)
        edited_guest = get_guest(guest_id)

        edited_guest_data["filled_by_admin"] = False
        edited_guest_data["id"] = guest_id
        edited_guest_data["will_attend"] = False
        edited_guest_data["last_responded"] = edited_guest.last_responded
        edited_guest_data["last_viewed"] = edited_guest.last_viewed
        self.assertDictEqual(edited_guest.__dict__["attribute_values"], {**EXAMPLE_GUEST_1, **edited_guest_data})
예제 #19
0
 def test_rsvp_last_viewed_updated(self):
     guest = save_guest(EXAMPLE_GUEST_1)
     self.client.get(f"/rsvp/{guest.id}", follow_redirects=True)
     edited_guest = get_guest(guest.id)
     self.assertAlmostEqual(edited_guest.last_viewed, datetime.datetime.now(tzutc()),
                            delta=datetime.timedelta(seconds=5))
예제 #20
0
    def test_rsvp_page(self):
        guest_data = dict(EXAMPLE_GUEST_1)
        edit_allowed = [
            "will_attend", "favourite_music", "food_allergies",
            "number_of_guests", "notes"
        ]

        guest_id = save_guest(guest_data).id

        # testuser goes to the link he received by e-mail
        self.browser.get(f"{self.get_server_url()}/rsvp/{guest_id}")
        self.assertEqual(f"Wedding RSVP | {guest_data['name']}",
                         self.browser.title)

        # Verifies that there is no login required message left
        page_text = self.browser.find_element_by_tag_name('body').text
        self.assertNotIn("Please log in to access this page.", page_text)

        # He finds that every value is the same as he left it last time
        for key, value in guest_data.items():
            if key in edit_allowed:
                if type(value) is str or type(value) is int:
                    self.assertEqual(
                        str(value),
                        self.browser.find_element_by_id(key).get_attribute(
                            "value"))
                if type(value) is bool:
                    self.assertEqual(
                        "true" if value else None,
                        self.browser.find_element_by_id(key).get_attribute(
                            "checked"))

        # It occurs to him that he just divorced, so that the ex-wife won't come
        number_of_guests = self.browser.find_element_by_id("number_of_guests")
        number_of_guests.clear()
        number_of_guests.send_keys('4')
        number_of_guests.send_keys(Keys.ENTER)

        # wait for the refresh to finish
        WebDriverWait(self.browser, 5, ignored_exceptions=(NoSuchElementException,)) \
            .until(expected_conditions.staleness_of(number_of_guests))

        self.wait_for(lambda: self.assertEqual(
            self.browser.find_element_by_id("number_of_guests").get_attribute(
                "value"), "4"))
        self.assertEqual(get_guest(guest_id).number_of_guests,
                         4)  # to the database as well

        # But wait! He became vegan since..
        food_allergies = WebDriverWait(self.browser, 5,
                                       ignored_exceptions=(NoSuchElementException,StaleElementReferenceException,)) \
            .until(expected_conditions.presence_of_element_located((By.ID, "food_allergies")))

        food_allergies.clear()
        food_allergies.send_keys('I a\'m vegan')
        self.browser.find_element_by_id("submit").click()

        # issue a browser refresh to make sure, the change is saved
        self.browser.get(f"{self.get_server_url()}/rsvp/{guest_id}")
        self.wait_for(lambda: self.assertEqual(
            self.browser.find_element_by_id("food_allergies").get_attribute(
                "value"), 'I a\'m vegan'))
        self.assertEqual(get_guest(guest_id).food_allergies,
                         'I a\'m vegan')  # to the database as well
예제 #21
0
 def setUp(self) -> None:
     self.guest1 = save_guest(EXAMPLE_GUEST_1)
     self.guest2 = save_guest(EXAMPLE_GUEST_2)