Our task list API should be able to work with an entity called Goal
.
Goals are entities that describe a task a user wants to complete.
They contain a title to name the goal.
Our goal for this wave is to be able to create, read, update, and delete different goals.
This wave requires you to complete four tests.
- The tests you need to write are scaffolded in the
test_wave_05.py
file.- These tests are currently skipped with
@pytest.mark.skip(reason="test to be completed by student")
and the function body haspass
in it. Once you implement these tests you should remove theskip
decorator and thepass
.
- These tests are currently skipped with
- For the tests you write, use the requirements in this document to guide your test writing.
- Pay attention to the exact shape of the expected JSON. Double-check nested data structures and the names of the keys for any mispellings.
- You can model your tests off of the Wave 01 tests for Tasks.
- Some tests use a fixture named
one_goal
that is defined intests/conftest.py
. This fixture saves a specific goal to the test database.
There should be a Goal
model that lives in app/models/goal.py
.
Goals should contain these attributes. Feel free to change the name of the goal_id
column if you would like. The tests require the title column to be named exactly as title
.
goal_id
: a primary key for each goaltitle
: text to name the goal
- Don't forget to run:
flask db migrate
every time there's a change in models, in order to generate migrationsflask db upgrade
to run all generated migrations
The following are required routes for wave 5. Feel free to implement the routes in any order within this wave.
As a client, I want to be able to make a POST
request to /goals
with the following HTTP request body
{
"title": "My New Goal"
}
and get this response:
201 CREATED
{
"goal": {
"id": 1,
"title": "My New Goal"
}
}
so that I know I successfully created a goal that is saved in the database.
As a client, I want to be able to make a GET
request to /goals
when there is at least one saved goal and get this response:
200 OK
[
{
"id": 1,
"title": "Example Goal Title 1"
},
{
"id": 2,
"title": "Example Goal Title 2"
}
]
As a client, I want to be able to make a GET
request to /goals
when there are zero saved goals and get this response:
200 OK
[]
This feature requires you to write a test.
As a client, I want to be able to make a GET
request to /goals/1
when there is at least one saved goal and get this response:
200 OK
{
"goal": {
"id": 1,
"title": "Build a habit of going outside daily"
}
}
This feature requires you to write a test.
As a client, I want to be able to make a GET
request to /goals/1
when there are no matching goals and get this response:
404 Not Found
No response body.
This feature requires you to write a test.
As a client, I want to be able to make a PUT
request to /goals/1
when there is at least one saved goal with this request body:
{
"title": "Updated Goal Title"
}
and get this response:
200 OK
{
"goal": {
"id": 1,
"title": "Updated Goal Title"
}
}
As a client, I want to be able to make a PUT
request to /goals/1
when there are no matching goals with this request body:
{
"title": "Updated Goal Title"
}
and get this response:
404 Not Found
No response body
As a client, I want to be able to make a DELETE
request to /goals/1
when there is at least one saved goal and get this response:
200 OK
{
"details": "Goal 1 \"Build a habit of going outside daily\" successfully deleted"
}
As a client, I want to be able to make a DELETE
request to /goals/1
when there are no matching goals and get this response:
404 Not Found
No response body.
As a client, I want to be able to make a POST
request to /goals
with the following HTTP request body
{}
and get this response:
400 Bad Request
{
"details": "Invalid data"
}
so that I know I did not create a Goal that is saved in the database.