Commit Graph

6051 Commits

Author SHA1 Message Date
Javi Martín
b196e83121 Fix header card factory
It was using methods which don't exist.
2021-05-29 14:18:31 +02:00
Javi Martín
f55d2ab891 Validate process dates depending on enabled phases
When configuring phases in a process, we were validating the start date
or the end date is present, the other date is present too.

However, in other parts of the application we were checking whether a
phase is enabled and then assumed its dates were present if the phase
was enabled. However, we weren't validating this behavior, so it was
possible to enable a phase and leaving its dates blank, causing the
application to crash.

So, as suggested by Alberto, we're changing the validation rule so
phase dates are mandatory when a phase is enabled.

With this rule, the old validation rules are not necessary. I've
considered leaving them in order to avoid database inconsistencies.
However, I realized records having a disabled phase with its start and
end dates have always been valid. This means applications checking for
the presence of these dates instead of checking whether the phase is
enabled have never worked properly.

We don't have to change the logic anywhere else because as mentioned we
were already checking phases are enabled before using their dates.
2021-05-29 14:13:48 +02:00
Javi Martín
5bcc70eda8 Fix proposals phase end date validation
So now it uses the same rules as the other phases.
2021-05-29 13:55:29 +02:00
Javi Martín
53c53e26a8 Add tests for draft and proposal phases dates
We had tests for other phases, but not for these ones.
2021-05-29 13:55:29 +02:00
Javi Martín
89545db3c0 Fix typos in processes dates validation specs 2021-05-29 13:55:29 +02:00
Javi Martín
fc1a0f33e7 Add draft info on unpublished budgets
Before commit 28caabecd, it was clear which budgets were in draft mode
because their phase was "drafting".

Now the phase isn't "drafting" anymore, so we have to make it clear
somehow that the budget is a draft.

I'm using styles similar to the ones we added in commit 2f636eaf7 for
completed budgets but at the same time making them slightly different so
it's easy to differenciate completed and drafting budgets.
2021-04-21 17:12:12 +02:00
Javi Martín
0eedc7b6ab Use readable texts in admin budgets test
Particularly the line with `within "tr", text: "Finished budget" do` is
now easier to read.

This way we avoid a potential pitfall. Imagine that the factory which
creates a finished budget generated a budget with the name "COMPLETED
Budget 1". Then the test:

```
within "#budget_#{finished_budget.id}" do
  expect(page).to have_content("COMPLETED")
end
```

Would pass even if we didn't add the text "COMPLETED" anywhere else,
because it would be included in the name of the budget.
2021-04-21 17:12:12 +02:00
Javi Martín
3345dd67d9 Remove unnecessary in_browser clause
We only need to define one `in_browser`, which is the one opening the
session as an administrator.

This change is done to simplify the code, although there's a small
chance it might also make the test stop failing in our CI. Sometimes in
our CI the first `visit` in the `in_browser(:admin)` block fails for
unknown reasons, rendering a blank page.
2021-04-16 14:37:58 +02:00
Javi Martín
9890571091 Use login form in tests checking expired passwords
The controller provided by the `devise-security` gem which tests
password is expired does not execute the `before_action` we have in our
application controller. That means it doesn't set the current locale.

We were having issues in the tests checking this behavior if the
previous test had set the current locale to a different one. This meant
the process running the browser had one locale while the process running
the test had a different one, which resulted in a page in English (as
expected), only the flash message notifying users their password expired
was in a different language.

To reproduce this behavior, run:

```
rspec './spec/system/welcome_spec.rb[1:1:2:2:1]' spec/system/users_auth_spec.rb:623 --order defined
```

I'm not sure whether this is a bug or it's a problem with the tests. In
theory it might be possible to reproduce a similar behavior in
production due to what we mention about the controller not executing the
`set_current_locale` method. But I haven't been able to reproduce the
situation, particularly since the password expiration seems to be
checked exclusively at login time (that is, if you stay logged in for 10
years, your password doesn't seem to expire).

So for now I'm just making the tests pass by using the login form
instead of using `login_as`.
2021-04-16 14:37:58 +02:00
Javi Martín
47d75b4ec5 Remove redundant click in legislation spec
The link to edit the process is already present before clicking the
"All" link, which meant the test failed sometimes because Capybara might
try to click on the "Edit" link at the same time the page is changing
due to the click on the "All" link".

Due to this issue, this test has failed at least one in our CI [1].

[1] https://github.com/consul/consul/runs/2324773853
2021-04-16 14:37:58 +02:00
Javi Martín
8a2e159805 Simplify tests for investments tag cloud
It's true that previously we didn't display the tag cloud on all phases
and so we added a test checking we did on all phases.

However, doing so makes tests really slow and prone to database
inconsistencies because the alter the database after the process running
the browser has started.

So now we're using a random phase in these tests to solve this issue.

We're also removing the `login_as(admin) if budget.drafting?` line
because we removed the drafting phase in commit 28caabecd.
2021-04-16 14:37:58 +02:00
Javi Martín
42bc8eb4da Test the user experience in organization creation
So we check the message with the verification link is present and
administrators see the organization in the admin section.
2021-04-16 14:37:58 +02:00
Javi Martín
aff102325a Fix expectations for already existing content
We were checking content which was already present/absent before making
a certain request, so the expectations were not checking the request had
already finished. Our intention here is to check the page contents after
the request has finished.
2021-04-16 14:37:46 +02:00
Javi Martín
74ca332989 Add expectations to check requests are complete
We want to make sure the request is finished after clicking a button and
before visiting a different page, so we need to check the page has
changed.

Usually this shouldn't be a problem because most of our forms are sent
with regular HTTP requests instead of AJAX ones, so the `visit` method
wouldn't be called before the request is finished.

However, we're experiencing problems with certain version of
Chromedriver, and in general it's a good practice because we might send
forms using AJAX/Turbolinks in the future.
2021-04-16 14:35:03 +02:00
Javi Martín
2732c08f3d Simplify calls to have_current_path
In general, we shold check the contents of the page instead of the
current path, since the contents of the page are what users experience.

In one test, the only reason we check the current path additionally to
the contents of the page is to make sure we're still in the management
section.

Checking just that we avoid querying the database after starting the
browser.
2021-04-16 14:33:26 +02:00
Javi Martín
a7664ad817 Query the database before visiting a page in tests
We can assign query results to variables and so we avoid querying the
database after starting the browser.
2021-04-16 14:33:26 +02:00
Javi Martín
994745839b Simplify tests checking dates are present
When we create a record like a debate or an event and we check the page
content, we want to make sure that today's date is present, since it's
the date where the record is supposed to have been created.

This way we avoid querying the database after the browser has been
started.
2021-04-16 14:33:26 +02:00
Javi Martín
a8c4676240 Simplify system tests re-fetching records
It's strange to create records without assigning them to a variable and
then query the database to fetch the very same records. Assigning them
to a variable makes the tests easier to understand.

Besides, this way we avoid querying the database after the browser has
started.
2021-04-16 14:33:26 +02:00
Javi Martín
fc32c767dd Split independent blocks of tests
This way we avoid modifying the database in the middle of a system test
(after we've started the browser), which can lead to database
inconsistencies.

In the case of the reclassification specs we're simply removing part of
the test because that part is already tested by other specs.
2021-04-16 14:33:26 +02:00
Javi Martín
405c6e6d14 Test data introduced from the user's point of view
Users don't care about database content; they care about what they see
on the screen.

Writing tests this way we also avoid potencial database inconsistencies
due to accessing the database after starting the browser.
2021-04-16 14:33:26 +02:00
Javi Martín
7b15cc290d Use human labels to fill in proposal form in tests
This way we make sure the label is correctly associated with a field.
2021-04-16 14:33:26 +02:00
Javi Martín
386771f2df Remove duplicate line 2021-04-16 14:33:26 +02:00
Javi Martín
5f6c9852c7 Check table rows content instead of database
Checking the database with methods like Activity.last does not test that
the record is present where it should be (first record of the table in
this case). In these tests there's only one record, though, so the order
doesn't matter that match.

However, calling methods like Activity.last generates a database query
after the process running the browser has been started, and this might
lead to inconsistent data.
2021-04-16 14:33:25 +02:00
Javi Martín
9f926de54e Refactor method to reply to comment in tests
We take the comment as a parameter instead of the user, since usually
people reply to comments and not to users.

We also remove one database query after the browser has started, since
we can use `debate_path(debate)`. It's also more clear why we're using
`debate_path` in the test; before these changes, we had to enter the
`reply_to` method to realize that we were replying on a debate.
2021-04-16 14:25:34 +02:00
Javi Martín
2458ca22c5 Use a more descriptive parameter name 2021-04-16 14:25:34 +02:00
Javi Martín
9db4fb593c Simplify tests switching to a new window 2021-04-16 14:25:34 +02:00
Javi Martín
73992b2c82 Test erased reason from the user's point of view
What users care about isn't the database; they care about that reason
being displayed when administrators check the reason.

This way we also avoid accessing the database after the process running
the browser has been started.
2021-04-16 14:25:34 +02:00
Javi Martín
c8df5e3af2 Remove redundant delete account test
This scenario is already tested in the management users spec: ""Delete a
level 2 user account from document verification page".
2021-04-16 14:25:34 +02:00
Javi Martín
b55f2ab85c Test slugs from the user's point of view
System tests are about user experience, so instead of checking the slug
has been updated in the database, we check whether the page can be
accessed using the slug.

Note the budget group test is a bit different because the name of the
group isn't present in the budget group page.
2021-04-16 14:25:34 +02:00
Javi Martín
dbf7de5787 Simplify accessing the valuation page
We already test the navigation in the valuation spec file.
2021-04-16 14:25:34 +02:00
Javi Martín
a586ba8069 Test restoring data from the user's point of view
We were checking the database, but users don't care about what's inside
the database; they care about what happens when they visit the page of a
record they've just restored.

This way we also avoid data inconsistency due to the process running the
test accessing the database after the process running the browser has
started.
2021-04-16 14:25:34 +02:00
Javi Martín
fcb5f71ff2 Reload the page instead of checking the database 2021-04-16 14:25:34 +02:00
Javi Martín
559f842e68 Make account recommendations spec more robust
We check the changes have been saved and we check recommendations have
been disabled after visiting the debates and proposals pages. The
latter helps us avoid accessing the database after the process running
the browser has been started.
2021-04-16 14:25:34 +02:00
Javi Martín
21c715bb2a Remove unnecessary "reload" method calls in tests
Using "reload" might cause issues if the process running the browser has
already been started, and it isn't necessary in these cases.
2021-04-16 14:25:34 +02:00
Javi Martín
907c0fc679 Remove redundant database checks in system tests
These tests check what happens from the user's point of view. For
instance, we check that after disabling recommendations, they are not
shown. What happens in the database is not related to the user
experience.

Furthermore, checking the database after the browser has started is
proving to be a major source for inconsistent data in specs.
2021-04-16 14:25:21 +02:00
Javi Martín
747da42972 Test the user's point of view in moderation specs
We were checking what happens in the database, but what's important is
what users experience after hiding content or blocking authors. Besides,
accessing the database in tests after the browser has started might lead
to database inconsistencies.
2021-04-15 16:27:19 +02:00
Javi Martín
a96bd6cd88 Fix typos in moderation tests
We were checking for a CSS ID selector but forgot to add the "#".
2021-04-15 16:27:19 +02:00
Javi Martín
16a8e97737 Explicitly use rack driver in moderation specs
Just like we mentioned in commit 5f0c422eb, the filter "Mark as viewed"
doesn't work properly, so here's a case where the test would fail with
JavaScript not because the test is wrong, but due to a bug. The test was
passing simplify because there was a typo in the CSS selector, which was
supposed to select an element by ID but didn't have the "#" prefix.

For now we're keeping the test as it was, but eventually we'll have to
fix the bug.
2021-04-15 16:27:11 +02:00
Javi Martín
89e82926cc Merge pull request #4472 from consul/visit_after_setup
Setup database before starting the browser in tests
2021-04-14 18:18:35 +02:00
Javi Martín
16fdffdf96 Reduce number of requests in user tests
We were adding a `visit` in a `before` block but then we started some
tests with another `visit`.

We also destroyed records in the database in between, which increased
the risk of database inconsistency since the process running the browser
had already been started.

Besides, some tests were wrong; they were visiting a page with the
browser, then destroying records in the database, and then checking the
page without reloading the browser. Since we aren't automatically
refreshing the affected areas of the page, obviously the page content
before and after destroying records is exactly the same, and the test
was passing because it's testing content that isn't there in any
situation.
2021-04-13 21:54:26 +02:00
Javi Martín
b52d381da5 Simplify emulating last_sign_in_at
We were updating the database after starting the browser to emulate the
behavior where a user logs in a day before the current request. We can
use `current_sign_in_at` instead and devise will automatically copy that
value to `last_sign_in_at` after users visit a page.

This way we avoid setting up the database after the process runnin the
browser has been started.
2021-04-13 21:54:26 +02:00
Javi Martín
8d70c9f150 Set up data before starting the browser in tests
Changing the database after the process running the browser has started
is proving to be one of the reasons tests are failing sometimes, so
we're reducing the number of times were that happens. In this case, we
were changing a setting.
2021-04-13 21:54:26 +02:00
Javi Martín
6f5180e512 Reduce number of requests in user search specs
We were adding a `visit` in a `before` block but then we started the
search tests with another `visit`.

We also created records in the database in between, which increased the
risk of database inconsistency since the process running the browser had
already been started.
2021-04-13 21:54:26 +02:00
Javi Martín
cab750c8f1 Remove redundant request in ballots spec 2021-04-13 21:54:26 +02:00
Javi Martín
95e38448c0 Reduce number of requests in dashboard poll tests
Just like we did in commit 0ec8878db, we remove the useless initial
request in the `before` filter since most tests started by visiting a
different URL.

We also reduce the risk of database inconsistency which comes with
setting up the database after the browser has been started.
2021-04-13 21:54:26 +02:00
Javi Martín
804e513c7f Remove redundant setting resets in after blocks
We forgot to remove these lines in commit da121ebc53.
2021-04-13 21:54:26 +02:00
Julian Herrero
0698c0ff4f Allow users to delete their own comments 2021-04-13 20:04:04 +02:00
Javi Martín
fa14976cfd Merge pull request #4442 from consul/user_search
Improve user search by email/name
2021-04-13 18:31:34 +02:00
Javi Martín
d7ad1a769f Make sure users can only delete their own follows
Since we're defining abilities with cancancan and using
`load_and_authorize_resource`, we're also modifying the `create` action
for consistency.
2021-04-13 13:52:18 +02:00
Javi Martín
8a47fe3505 Avoid a brakeman security warning
Although it wasn't a real security concern because we were only calling
a `find` method based on the user input, it's a good practice to avoid
using constants based on user parameters.

Since we don't use the `find` method anymore but we still need to check
the associated record exists, we're changing the `followable` validation
in the `Follow` model to do exactly that.
2021-04-13 13:52:18 +02:00