diff --git a/.coverage b/.coverage index 877ad7d3..470a242f 100644 Binary files a/.coverage and b/.coverage differ diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml new file mode 100644 index 00000000..e69de29b diff --git a/github/workflows/workflow.yml b/github/workflows/workflow.yml new file mode 100644 index 00000000..3eea79ec --- /dev/null +++ b/github/workflows/workflow.yml @@ -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 diff --git a/src/__pycache__/counter.cpython-39.pyc b/src/__pycache__/counter.cpython-39.pyc index 4df5f50a..bcf1678c 100644 Binary files a/src/__pycache__/counter.cpython-39.pyc and b/src/__pycache__/counter.cpython-39.pyc differ diff --git a/src/__pycache__/status.cpython-39.pyc b/src/__pycache__/status.cpython-39.pyc index 32cda55f..5c774eb1 100644 Binary files a/src/__pycache__/status.cpython-39.pyc and b/src/__pycache__/status.cpython-39.pyc differ diff --git a/src/counter.py b/src/counter.py new file mode 100644 index 00000000..83439b87 --- /dev/null +++ b/src/counter.py @@ -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 +# let Flask know that the only methods that is allowed to called +# on this function is "POST". +@app.route('/counters/', 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/', 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/', 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 + + + + + + + + + + diff --git a/tests/__pycache__/test_counter.cpython-39.pyc b/tests/__pycache__/test_counter.cpython-39.pyc index 715442c3..73301a29 100644 Binary files a/tests/__pycache__/test_counter.cpython-39.pyc and b/tests/__pycache__/test_counter.cpython-39.pyc differ diff --git a/tests/test_counter.py b/tests/test_counter.py index 3da6a8e4..8e536efa 100644 --- a/tests/test_counter.py +++ b/tests/test_counter.py @@ -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)