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
Binary file modified .coverage
Binary file not shown.
Empty file added .github/workflows/workflow.yml
Empty file.
12 changes: 12 additions & 0 deletions github/workflows/workflow.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
name: CI workflow

on:
push:
branches: [ main ]
pull_request:
branches: [ main ]

jobs:
build:
runs-on: ubuntu-latest
container: python:3.9-slim
Binary file modified src/__pycache__/counter.cpython-39.pyc
Binary file not shown.
Binary file modified src/__pycache__/status.cpython-39.pyc
Binary file not shown.
58 changes: 58 additions & 0 deletions src/counter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
from flask import Flask
from src import status

app = Flask(__name__)

COUNTERS = {}

# We will use the app decorator and create a route called slash counters.
# specify the variable in route <name>
# let Flask know that the only methods that is allowed to called
# on this function is "POST".
@app.route('/counters/<name>', methods=['POST'])
def create_counter(name):
"""Create a counter"""
app.logger.info(f"Request to create counter: {name}")
global COUNTERS

if name in COUNTERS:
return {"Message":f"Counter {name} already exists"}, status.HTTP_409_CONFLICT

COUNTERS[name] = 0
return {name: COUNTERS[name]}, status.HTTP_201_CREATED

@app.route('/counters/<name>', methods=['PUT'])
def update_counter(name):
"""Update Counter"""

app.logger.info(f"Request to update counter: {name}")
global COUNTERS

if not name in COUNTERS:
return {"Message":f"Counter {name} does not exist"}, status.HTTP_404_NOT_FOUND

COUNTERS[name] += 1
return {name: COUNTERS[name]}, status.HTTP_200_OK

@app.route('/counters/<name>', methods=['GET'])
def read_counter(name):

"""Read a counter"""
app.logger.info(f"Request to read counter: {name}")

global COUNTERS

if not name in COUNTERS:
return {"Message":f"Counter {name} does not exist"}, status.HTTP_404_NOT_FOUND

return {name: COUNTERS[name]}, status.HTTP_200_OK










Binary file modified tests/__pycache__/test_counter.cpython-39.pyc
Binary file not shown.
54 changes: 54 additions & 0 deletions tests/test_counter.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,57 @@
- The service must be able to update a counter by name.
- The service must be able to read the counter
"""

from unittest import TestCase

# we need to import the unit under test - counter
from src.counter import app

# we need to import the file that contains the status codes
from src import status

class CounterTest(TestCase):
"""Counter tests"""

def setUp(self):
self.client = app.test_client()

def test_create_a_counter(self):
"""It should create a counter"""
client = app.test_client()
result = client.post('/counters/foo')
self.assertEqual(result.status_code, status.HTTP_201_CREATED)

def test_duplicate_a_counter(self):
"""It should return an error for duplicates"""
result = self.client.post('/counters/bar')
self.assertEqual(result.status_code, status.HTTP_201_CREATED)
result = self.client.post('/counters/bar')
self.assertEqual(result.status_code, status.HTTP_409_CONFLICT)

def test_update_a_counter(self):

result = self.client.post('/counters/test')
self.assertEqual(result.status_code, status.HTTP_201_CREATED)

updateResult = self.client.put('/counters/test')
self.assertEqual(updateResult.status_code, status.HTTP_200_OK)

self.assertEqual(result.get_json()['test'] + 1, updateResult.get_json()['test'])

nullCounter = self.client.put('/counters/NULL')
self.assertEqual(nullCounter.status_code, status.HTTP_404_NOT_FOUND)

def test_read_counter(self):

result = self.client.post('/counters/newTest')
self.assertEqual(result.status_code, status.HTTP_201_CREATED)

for x in range(5):
self.client.put('/counters/newTest')

num = self.client.get('/counters/newTest')
self.assertEqual(num.get_json()['newTest'], 5)

nullCounter = self.client.get('/counters/NULL')
self.assertEqual(nullCounter.status_code, status.HTTP_404_NOT_FOUND)