Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/todo controller #8

Merged
merged 21 commits into from
Sep 23, 2024
51 changes: 51 additions & 0 deletions todo_backend/app/controllers/todo_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
class TodoController < ApplicationController
before_action :set_todo, only: [ :show, :update, :destroy ]

# GET /todo?group_id
def index
@todos = ToDo.where(group_id: todo_params_index[:group_id]).select(:id, :title, :priority, :date_planning)
json_response(@todos)
end

# GET /todo/:id
def show
json_response(@todo)
end

# POST /todo
def create
@todo = ToDo.create!(todo_params_create) # status: 0, date_creation: DateTime.now
json_response(@todo, :created)
end

# PUT /todo/:id
def update
@todo.update(todo_params_update)
end

# DELETE /todo/:id
def destroy
@todo.destroy
head :no_content
end

# Helpers

def todo_params_index
params
.permit(:group_id)
end
def todo_params_create
params
.permit(:group_id, :priority, :date_planning, :title, :description)
.merge(date_creation: DateTime.now, status: 0)
end
def todo_params_update
params
.permit(:status, :group_id, :priority, :date_planning, :title, :description)
end

def set_todo
@todo = ToDo.find(params[:id])
end
end
1 change: 1 addition & 0 deletions todo_backend/config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@
# Defines the root path route ("/")
# root "posts#index"
resources :group
resources :todo
end
3 changes: 3 additions & 0 deletions todo_backend/run_test.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
$container_id = docker ps | ?{$_ -match 'todo_backend-web'} | % { ($_ -split " ")[0] }
cls
docker exec $container_id bundle exec rspec
11 changes: 11 additions & 0 deletions todo_backend/spec/factories/todo.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
FactoryBot.define do
factory :to_do do
status { Faker::Number.between(from: 0, to: 3) }
group
priority { Faker::Number.between(from: 1, to: 5) }
date_creation { Faker::Time.between(from: DateTime.now - 10, to: DateTime.now) }
date_planning { Faker::Time.between(from: DateTime.now - 10, to: DateTime.now + 10) }
title { Faker::Lorem.sentence(word_count: 1, random_words_to_add: 4) }
description { Faker::Lorem.paragraph(sentence_count: 2, random_sentences_to_add: 4) }
end
end
1 change: 1 addition & 0 deletions todo_backend/spec/rails_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@
end

config.around(:each) do |example|
Faker::UniqueGenerator.clear
DatabaseCleaner.cleaning do
example.run
end
Expand Down
159 changes: 159 additions & 0 deletions todo_backend/spec/requests/todo_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
require 'rails_helper'

RSpec.describe "Todos", type: :request do
let(:group_id) { create(:group).id }

let!(:todos) { create_list(:to_do, 10) }
let(:todo_id) { todos.first.id.to_s }

# Get list of todos
describe "GET /todo?group_id" do
it "returns properly count each group" do
@groups = ToDo.group(:group_id).count
@groups.each do |key, value|
get '/todo?group_id=' + key.to_s
expect(json).not_to be_empty
expect(json.size).to eq(value)
expect(response).to have_http_status(200)
end
end
end

# Get data of todo
describe "GET /todo/:id" do
context "id is valid =>" do
let(:todo_test) { todos.first }
before { get '/todo/' + todo_id }

it "returns data" do
expect(json['status']).to eq(todo_test[:status])
expect(json['group_id']).to eq(todo_test[:group_id])
expect(json['priority']).to eq(todo_test[:priority])
expect(json['date_creation']).to eq(todo_test[:date_creation].utc.iso8601(3))
expect(json['date_planning']).to eq(todo_test[:date_planning].utc.iso8601(3))
expect(json['title']).to eq(todo_test[:title])
expect(json['description']).to eq(todo_test[:description])
end

it "returns status code 200" do
expect(response).to have_http_status(200)
end
end

context "id is invalid =>" do
before { get '/todo/-1' }

it "returns cannot find" do
expect(response.body)
.to match("{\"message\":\"Couldn't find ToDo with 'id'=" + (-1).to_s + "\"}")
end

it "returns status code 404" do
expect(response).to have_http_status(404)
end
end
end

# Create new todo
describe "POST /todo" do
let(:valid_attributes) {
{
group_id: group_id,
priority: Faker::Number.between(from: 1, to: 5),
date_planning: Faker::Time.between(from: DateTime.now - 10, to: DateTime.now + 10),
title: Faker::Lorem.sentence(word_count: 1, random_words_to_add: 4),
description: Faker::Lorem.paragraph(sentence_count: 2, random_sentences_to_add: 4)
}
}

context "request is valid =>" do
before {
@todos_count = ToDo.count
post '/todo', params: valid_attributes
}

it "created has default values" do
expect(json['status']).to eq(0)
expect(json['date_creation']).to be > (DateTime.now - 1).utc.iso8601(3) # eq(DateTime.now.utc.iso8601(3))
end

it "created has user defined values" do
expect(json['group_id']).to eq(valid_attributes[:group_id])
expect(json['priority']).to eq(valid_attributes[:priority])
expect(json['date_planning']).to eq(valid_attributes[:date_planning].change(sec: valid_attributes[:date_planning].sec).utc.iso8601(3))
expect(json['title']).to eq(valid_attributes[:title])
expect(json['description']).to eq(valid_attributes[:description])
end

it "changes count of todos" do
expect(ToDo.count).to eq(@todos_count + 1)
end

it "returns status code 201" do
expect(response).to have_http_status(201)
end
end

context "request is invalid =>" do
let(:todos_count) { ToDo.count }
before { post '/todo', params: {} }

it "same count of todos" do
expect(ToDo.count).to eq(todos_count)
end

it "returns status code 422" do
expect(response).to have_http_status(422)
end
end
end

# Update existing todo
describe "PUT /todo/:id" do
let(:valid_attributes) {
{
status: Faker::Number.between(from: 0, to: 3),
group_id: group_id,
priority: Faker::Number.between(from: 1, to: 5),
date_planning: Faker::Time.between(from: DateTime.now - 10, to: DateTime.now + 10),
title: Faker::Lorem.sentence(word_count: 1, random_words_to_add: 4),
description: Faker::Lorem.paragraph(sentence_count: 2, random_sentences_to_add: 4)
}
}

context "record exists" do
before {
@todos_count = ToDo.count
put '/todo/' + todo_id, params: valid_attributes
}

it "updates record" do
expect(response.body).to be_empty
end

it "same count of todos" do
expect(ToDo.count).to eq(@todos_count)
end

it "returns status code 204" do
expect(response).to have_http_status(204)
end
end
end

# Delete todo
describe "DELETE /todo/:id" do
before {
@todos_count = ToDo.count
delete '/todo/' + todo_id
}

it "returns status code 204" do
expect(response).to have_http_status 204
end

it "changes count of todos" do
expect(ToDo.count).to eq(@todos_count - 1)
end
end
end
Loading