aboutsummaryrefslogtreecommitdiff
path: root/src/test/java/webui/pages/components/AddItemComponent.java
blob: ba799fdd9756da3ce9b198944859816dedc8beea (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package webui.pages.components;

import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;

import com.microsoft.playwright.Locator;

import dev.submelon.model.PantryItem;
import webui.pages.IndexPage;

/**
 * A component to add an item to the pantry on the index page
 */
public class AddItemComponent {

    private Locator nameInput;
    private Locator descriptionInput;
    private Locator quantityInput;
    private Locator quantityTypeInput;
    private Locator submitButton;
    private Locator cancelButton;

    /**
     * Opens the add item component on the index page and creates the instance
     * of the AddItemComponent.
     */
    public static AddItemComponent open(final IndexPage page) {

        // Check button is visible and enabled
        Locator addButton = page.getAddItemButton();
        assertThat(addButton).isVisible();
        assertThat(addButton).isEnabled();

        // make available add item component
        addButton.click();

        // verify initial state of inputs and buttons
        assertThat(addButton).isHidden();

        // find and assign inputs for the component
        AddItemComponent component = new AddItemComponent();
        component.nameInput = page.getItemNameInput();
        component.descriptionInput = page.getItemDescriptionInput();
        component.quantityInput = page.getItemQuantityInput();
        component.quantityTypeInput = page.getQuantityTypeInput();

        // find and assign buttons for the component
        component.submitButton = page.getSubmitItemButton();
        component.cancelButton = page.getCancelButton();

        component.verifyOpen();
        
        return component;
    }

    /**
     * Enter values into the inputs based on a {@link PantryItem}
     */
    public void enterPantryItem(final PantryItem item) {
        if (item.getName() != null) {
            nameInput.fill(item.getName());
        }
        if (item.getDescription() != null) {
            descriptionInput.fill(item.getDescription());
        }
        if (item.getQuantity() != null) {
            quantityInput.fill(String.valueOf(item.getQuantity()));
        }
        if (item.getQuantityUnitType() != null) {
            quantityTypeInput.fill(item.getQuantityUnitType());
        }
    }

    /**
     * Submits the item to the API and closes the add item component
     */
    public void submit() {
        submitButton.click();

        verifyClosed();
    }

    /**
     * Closes the add item component without saving
     */
    public void cancel() {
        cancelButton.click();

        verifyClosed();
    }

    /**
     * Verify the expected inputs and buttons appear as expected on opening
     */
    public void verifyOpen() {
        assertThat(nameInput).isVisible();
        assertThat(nameInput).isEditable();
        assertThat(descriptionInput).isVisible();
        assertThat(descriptionInput).isEditable();
        assertThat(quantityInput).isVisible();
        assertThat(quantityInput).isEditable();
        assertThat(quantityTypeInput).isVisible();
        assertThat(quantityTypeInput).isEditable();
        assertThat(submitButton).isVisible();
        assertThat(submitButton).isDisabled();
        assertThat(cancelButton).isVisible();
        assertThat(cancelButton).isEnabled();
    }

    /**
     * Verify all of the expected inputs and buttons no longer appear
     */
    public void verifyClosed() {
        assertThat(nameInput).isHidden();
        assertThat(descriptionInput).isHidden();
        assertThat(quantityInput).isHidden();
        assertThat(quantityTypeInput).isHidden();
        assertThat(submitButton).isHidden();
        assertThat(cancelButton).isHidden();
    }

}