Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
399 changes: 399 additions & 0 deletions DR_shop_manager_challenge

Large diffs are not rendered by default.

111 changes: 111 additions & 0 deletions app.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
require_relative './lib/database_connection'
require_relative './lib/item_repository'
require_relative './lib/order_repository'

class Application

# The Application class initializer
# takes four arguments:
# * The database name to call `DatabaseConnection.connect`
# * the Kernel object as `io` (so we can mock the IO in our tests)
# * the AlbumRepository object (or a double of it)
# * the ArtistRepository object (or a double of it)
def initialize(database_name, io, order_repository, item_repository)
DatabaseConnection.connect(database_name)
@io = io
@order_repository = order_repository
@item_repository = item_repository
# binding.irb
end

def print_program_menu
@io.puts 'Welcome to the shop manager!'
@io.puts ''
@io.puts 'What do you want to do?'
@io.puts ' 1 = List all shop items'
@io.puts ' 2 = Create a new item'
@io.puts ' 3 = List all orders'
@io.puts ' 4 = Create a new order'
@io.puts ' 9 = Exit'
end

def shop_manager_program
code = @io.gets.to_i
# binding.irb
case code
when 1
list_all_shop_items
when 2
create_a_new_item
when 3
list_all_orders
when 4
create_a_new_order
when 9
exit
else
@io.puts "I don't know what you meant, try again"
end
end

def list_all_shop_items
all_items = @item_repository.all
all_items.each do | data |
@io.puts "#{data.id} - #{data.name}: #{data.price}: #{data.quantity}"
end
end

def create_a_new_item
created_item = Item.new
@io.puts 'Enter name of item: '
created_item.name = @io.gets.chomp
@io.puts 'Enter price of item: '
created_item.price = @io.gets.chomp
@io.puts 'Enter quantity of item: '
created_item.quantity = @io.gets.chomp
# binding.irb

@item_repository.create(created_item)
end

def list_all_orders
all_orders = @order_repository.all
all_orders.each do | data |
@io.puts "#{data.id} - #{data.customer}: #{data.date}: #{data.order_id}"
end
end

def create_a_new_order
created_order = Order.new
@io.puts 'Enter customer order name: '
created_order.customer = @io.gets.chomp
@io.puts 'Enter order date (YYYY-MM-DD): '
created_order.date = @io.gets.chomp
@io.puts 'Enter order_id of item: '
created_order.order_id = @io.gets.chomp
# binding.irb

@order_repository.create(created_order)
end

def run
loop do
print_program
shop_manager_program
end
end
end

# Don't worry too much about this if statement. It is basically saying "only
# run the following code if this is the main file being run, instead of having
# been required or loaded by another file.
# If you want to learn more about __FILE__ and $0, see here: https://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Variables_and_Constants#Pre-defined_Variables
if __FILE__ == $0
app = Application.new(
'shop_manager',
Kernel,
OrderRepository.new,
ItemRepository.new
)
app.run
end
24 changes: 24 additions & 0 deletions lib/database_connection.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# file: lib/database_connection.rb
require 'pg'
# This class is a thin "wrapper" around the
# PG library. We'll use it in our project to interact
# with the database using SQL.
class DatabaseConnection
# This method connects to PostgreSQL using the
# PG gem. We connect to 127.0.0.1, and select
# the database name given in argument.
def self.connect(database_name)
@connection = PG.connect({ host: '127.0.0.1', dbname: database_name })
end
# This method executes an SQL query
# on the database, providing some optional parameters
# (you will learn a bit later about when to provide these parameters).
def self.exec_params(query, params)
if @connection.nil?
raise 'DatabaseConnection.exec_params: Cannot run a SQL query as the connection to'\
'the database was never opened. Did you make sure to call first the method '\
'`DatabaseConnection.connect` in your app.rb file (or in your tests spec_helper.rb)?'
end
@connection.exec_params(query, params)
end
end
3 changes: 3 additions & 0 deletions lib/item.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class Item
attr_accessor :id, :name, :price, :quantity
end
43 changes: 43 additions & 0 deletions lib/item_repository.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
require_relative 'item'

class ItemRepository
def all
items = []
sql = 'SELECT id, name, price, quantity FROM items;'
result = DatabaseConnection.exec_params(sql,[])

result.each do |sql_data|
item = Item.new
item.id = sql_data['id']
item.name = sql_data['name']
item.price = sql_data['price']
item.quantity = sql_data['quantity']

items << item
end
return items
end

def find(id)

sql = 'SELECT id, name, price, quantity FROM items WHERE id = $1;'
params = [id]
result = DatabaseConnection.exec_params(sql, params)

find_id = result[0]

item = Item.new
item.id = find_id['id']
item.name = find_id['name']
item.price = find_id['price']
item.quantity = find_id['quantity']

return item
end

def create(item)
sql = 'INSERT INTO items (name, price, quantity) VALUES ($1, $2, $3);'
params = [item.name, item.price, item.quantity]
result = DatabaseConnection.exec_params(sql, params)
end
end
3 changes: 3 additions & 0 deletions lib/order.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class Order
attr_accessor :id, :customer, :date, :order_id
end
26 changes: 26 additions & 0 deletions lib/order_repository.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
require_relative 'order'

class OrderRepository
def all
orders = []
sql = 'SELECT id, customer, date, order_id FROM orders;'
result = DatabaseConnection.exec_params(sql,[])

result.each do |sql_data|
order = Order.new
order.id = sql_data['id']
order.customer = sql_data['customer']
order.date = sql_data['date']
order.order_id = sql_data['order_id']

orders << order
end
return orders
end

def create(order)
sql = 'INSERT INTO orders (customer, date, order_id) VALUES ($1, $2, $3);'
params = [order.customer, order.date, order.order_id]
DatabaseConnection.exec_params(sql, params)
end
end
95 changes: 95 additions & 0 deletions spec/app_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
require './app'

def reset_reset_table
seed_sql = File.read('spec/seeds_shop_manager_test.sql')
connection = PG.connect({ host: '127.0.0.1', dbname: 'shop_manager_test' })
connection.exec(seed_sql)
end

RSpec.describe Application do
context "testing the program methods" do
before(:each) do
reset_reset_table
end

it 'Tests prints program menu' do
io = double :io
fake_item = double :items
fake_order = double :orders
program = Application.new('shop_manager_test', io, fake_order, fake_item)

expect(io).to receive(:puts).with("Welcome to the shop manager!").ordered
expect(io).to receive(:puts).with("").ordered
expect(io).to receive(:puts).with("What do you want to do?").ordered
expect(io).to receive(:puts).with(" 1 = List all shop items").ordered
expect(io).to receive(:puts).with(" 2 = Create a new item").ordered
expect(io).to receive(:puts).with(" 3 = List all orders").ordered
expect(io).to receive(:puts).with(" 4 = Create a new order").ordered
expect(io).to receive(:puts).with(" 9 = Exit").ordered

item = program.print_program_menu
end

it "tests input '1' shop manager program" do
io = double :io
fake_item = ItemRepository.new
fake_order = OrderRepository.new
program_menu = Application.new('shop_manager_test', io, fake_order, fake_item)
expect(io).to receive(:gets).and_return('1').ordered
expect(io).to receive(:puts).with("1 - hammer: 5.99: 10")
expect(io).to receive(:puts).with("2 - glue: 2.99: 5")
output = program_menu.shop_manager_program
end

it "tests input '3' shop manager program" do
io = double :io
fake_item = ItemRepository.new
fake_order = OrderRepository.new
program_menu = Application.new('shop_manager_test', io, fake_order, fake_item)
expect(io).to receive(:gets).and_return('3').ordered
expect(io).to receive(:puts).with("1 - chris: 1999-01-08: 1")
expect(io).to receive(:puts).with("2 - tom: 2003-01-09: 1")
output = program_menu.shop_manager_program
end

it "tests input '2' shop manager program" do
io = double :io
fake_item = ItemRepository.new
fake_order = OrderRepository.new
program_menu = Application.new('shop_manager_test', io, fake_order, fake_item)
expect(io).to receive(:gets).and_return('2').ordered
expect(io).to receive(:puts).with("Enter name of item: ").ordered
expect(io).to receive(:gets).and_return('tape').ordered
expect(io).to receive(:puts).with("Enter price of item: ").ordered
expect(io).to receive(:gets).and_return('4.99').ordered
expect(io).to receive(:puts).with("Enter quantity of item: ").ordered
expect(io).to receive(:gets).and_return('60').ordered
output = program_menu.shop_manager_program
end

it "tests input '4' shop manager program" do
io = double :io
fake_item = ItemRepository.new
fake_order = OrderRepository.new
program_menu = Application.new('shop_manager_test', io, fake_order, fake_item)
expect(io).to receive(:gets).and_return('4').ordered
expect(io).to receive(:puts).with("Enter customer order name: ").ordered
expect(io).to receive(:gets).and_return('dave').ordered
expect(io).to receive(:puts).with("Enter order date (YYYY-MM-DD): ").ordered
expect(io).to receive(:gets).and_return('2023-08-09').ordered
expect(io).to receive(:puts).with("Enter order_id of item: ").ordered
expect(io).to receive(:gets).and_return('1').ordered
output = program_menu.shop_manager_program
end

it 'does match a charater in program menu' do
io = double :io
fake_item = ItemRepository.new
fake_order = OrderRepository.new
program_menu = Application.new('shop_manager_test', io, fake_order, fake_item)
expect(io).to receive(:gets).and_return('10').ordered
expect(io).to receive(:puts).with("I don't know what you meant, try again").ordered
output = program_menu.shop_manager_program
end
end
end
55 changes: 55 additions & 0 deletions spec/item_repository_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# file: spec/item_repository_spec.rb

require './lib/item_repository'

def reset_item_table
seed_sql = File.read('spec/seeds_shop_manager_test.sql')
connection = PG.connect({ host: '127.0.0.1', dbname: 'shop_manager_test' })
connection.exec(seed_sql)
end

describe ItemRepository do
before(:each) do
reset_item_table
end

it 'tests the the all method' do
repo = ItemRepository.new
item = repo.all

expect(item.length).to eq 2
expect(item[0].id).to eq '1'
expect(item[0].name).to eq 'hammer'
expect(item[0].price).to eq '5.99'
expect(item[0].quantity).to eq '10'
end

it 'tests the find method' do
repo = ItemRepository.new
item = repo.find(2)

expect(item).to (
having_attributes(
id: '2',
name: 'glue',
price: '2.99',
quantity: '5'
)
)
end

it 'tests the create method' do
repo = ItemRepository.new

item = Item.new
item.name = 'pencil'
item.price = 1.99
item.quantity = 1

repo.create(item)
create_item = repo.all

expect(create_item.last.name).to eq 'pencil'
expect(create_item.last.price).to eq '1.99'
end
end
Loading