Ver Fonte

* Change Readme.md
* Add dockerized app

kaajavi há 5 anos atrás
pai
commit
f28d0a275b
8 ficheiros alterados com 273 adições e 3 exclusões
  1. 6 0
      .dockerignore
  2. 8 0
      Dockerfile
  3. 2 2
      Readme.md
  4. 16 0
      application/settings-pg.py
  5. 17 0
      docker-compose.yml
  6. 6 0
      entrypoint.sh
  7. 163 0
      transactions/tests.py
  8. 55 1
      users/tests.py

+ 6 - 0
.dockerignore

@@ -0,0 +1,6 @@
+db.sqlite3
+.env
+docker-compose.yml
+Dockerfile
+/.git
+/.gitignore

+ 8 - 0
Dockerfile

@@ -0,0 +1,8 @@
+FROM python:3.8
+ENV PYTHONUNBUFFERED=1
+RUN mkdir /code
+WORKDIR /code
+COPY requirements.txt /code/
+RUN pip install -r requirements.txt
+COPY . /code/
+RUN chmod +x entrypoint.sh

+ 2 - 2
Readme.md

@@ -9,7 +9,7 @@ You can see demo in challenge.kaajavi.com
 The first thing to do is to clone the repository:
 
 ```sh
-$ git clone https://github.com/gocardless/sample-django-app.git
+$ git clone https://gogs.kaajavi.com/kaajavi/BelvoApp.git
 $ cd application
 ```
 
@@ -40,7 +40,7 @@ The home page is the API documentation.
 
 ## What do you need know about the challenge
 
-I didn't set up the authentication by JWT or similar, because of the short time.
+I didn't set up the authentication by JWT or similar, so the API is open for everybody.
 
 
 ## To run in docker-compose

+ 16 - 0
application/settings-pg.py

@@ -0,0 +1,16 @@
+"""
+Settings for postgres db
+"""
+from .settings import *
+from os import environ
+
+
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.postgresql',
+        'NAME': environ.get('POSTGRES_DB','postgres'),
+        'USER': environ.get('POSTGRES_USER','postgres'),
+        'HOST': 'db',
+        'PASSWORD': environ.get('POSTGRES_PASSWORD','postgres'),
+    }
+}

+ 17 - 0
docker-compose.yml

@@ -0,0 +1,17 @@
+version: "3.3"
+
+services:
+  db:
+    image: postgres:11-alpine
+    env_file: .env
+
+  web:
+    build: .
+    command: ./entrypoint.sh
+    volumes:
+      - .:/code
+    env_file: .env
+    ports:
+      - "8080:8080"
+    depends_on:
+      - db

+ 6 - 0
entrypoint.sh

@@ -0,0 +1,6 @@
+#!/bin/sh
+set -e
+
+python manage.py migrate
+python manage.py create_superuser users
+python manage.py runserver 0.0.0.0:8080

+ 163 - 0
transactions/tests.py

@@ -0,0 +1,163 @@
+from django.test import TestCase
+from rest_framework.test import APITestCase
+from rest_framework import status
+from rest_framework.reverse import reverse
+from .serializers import (CreateTransactionSerializer)
+from .models import Transaction
+from django.contrib.auth import get_user_model
+
+User = get_user_model()
+
+# Create your tests here.
+
+class TransactionsSerializerTest(TestCase):
+    """ Test module for test all serializers API """
+    user_error = {
+        "reference": "000050",
+        "account": "C00099",
+        "date": "2020-01-03",
+        "amount": -25.10,
+        "type": "outflow",
+        "category": "groceries",
+        "user_id": -99
+    }
+    inflow_ok = {
+        "reference": "000051",
+        "account": "C00099",
+        "date": "2020-01-03",
+        "amount": 51.13,
+        "type": "inflow",
+        "category": "groceries",
+        "user_id": 1
+      }
+    inflow_error = {
+        "reference": "000052",
+        "account": "C00099",
+        "date": "2020-01-03",
+        "amount": -51.13,
+        "type": "inflow",
+        "category": "groceries",
+        "user_id": 1
+    }
+    outflow_ok = {
+        "reference": "000053",
+        "account": "C00099",
+        "date": "2020-01-03",
+        "amount": -25.10,
+        "type": "outflow",
+        "category": "groceries",
+        "user_id": 1
+    }
+    outflow_error = {
+        "reference": "000054",
+        "account": "C00099",
+        "date": "2020-01-03",
+        "amount": 25.10,
+        "type": "outflow",
+        "category": "groceries",
+        "user_id": 1
+    }
+    type_error = {
+        "reference": "000055",
+        "account": "C00099",
+        "date": "2020-01-03",
+        "amount": 25.10,
+        "type": "another_type",
+        "category": "groceries",
+        "user_id": 1
+    }
+    date_error = {
+        "reference": "000052",
+        "account": "C00099",
+        "amount": -51.13,
+        "type": "inflow",
+        "category": "groceries",
+        "user_id": 1
+    }
+
+
+
+    def setUp(self):
+        user = User.objects.create(id=1,name='test',email='test@test.com',age=18)
+
+    def test_wrong_outflow_value(self):
+        serializer = CreateTransactionSerializer(data=self.outflow_error)
+        self.assertEqual(serializer.is_valid(), False)
+        self.assertEqual(set(serializer.errors.keys()), set(['amount']))
+
+    def test_wrong_inflow_value(self):
+        serializer = CreateTransactionSerializer(data=self.inflow_error)
+        self.assertEqual(serializer.is_valid(), False)
+        self.assertEqual(set(serializer.errors.keys()), set(['amount']))
+
+    def test_wrong_type_value(self):
+        serializer = CreateTransactionSerializer(data=self.type_error)
+        self.assertEqual(serializer.is_valid(), False)
+        self.assertEqual(set(serializer.errors.keys()), set(['type']))
+
+    def test_wrong_user_value(self):
+        serializer = CreateTransactionSerializer(data=self.user_error)
+        self.assertEqual(serializer.is_valid(), False)
+        self.assertEqual(set(serializer.errors.keys()), set(['user_id']))
+
+    def test_wrong_date_value(self):
+        serializer = CreateTransactionSerializer(data=self.date_error)
+        self.assertEqual(serializer.is_valid(), False)
+        self.assertEqual(set(serializer.errors.keys()), set(['date']))
+
+    def test_pass_inflow(self):
+        serializer = CreateTransactionSerializer(data=self.inflow_ok)
+        self.assertEqual(serializer.is_valid(), True)
+
+    def test_pass_outflow(self):
+        serializer = CreateTransactionSerializer(data=self.outflow_ok)
+        self.assertEqual(serializer.is_valid(), True)
+
+
+class TransactionViewTest(APITestCase):
+    """ Test case for Transactions Views """
+    inflow_ok = {
+        "reference": "000051",
+        "account": "C00099",
+        "date": "2020-01-03",
+        "amount": 51.1,
+        "type": "inflow",
+        "category": "salary",
+        "user_id": 1
+    }
+    outflow_ok = {
+        "reference": "000053",
+        "account": "C00099",
+        "date": "2020-01-03",
+        "amount": -25.10,
+        "type": "outflow",
+        "category": "groceries",
+        "user_id": 1
+    }
+    balance_expected = [{
+        "account": "C00099",
+        "balance": inflow_ok.get('amount')+outflow_ok.get('amount'),
+        "total_inflow": inflow_ok.get('amount'),
+        "total_outflow": outflow_ok.get('amount'),
+    }]
+    balance_cashflow = {
+        "inflow": {inflow_ok.get('category'): inflow_ok.get('amount')},
+        "outflow": {outflow_ok.get('category'): outflow_ok.get('amount')},
+    }
+
+    def setUp(self):
+        user = User.objects.create(id=1,name='test',email='test@test.com',age=18)
+        tr1 = Transaction.objects.create(**self.inflow_ok)
+        tr2 = Transaction.objects.create(**self.outflow_ok)
+
+    def test_get_balance(self):
+        # get API response
+        response = self.client.get(reverse('transactions:balance-detail', kwargs={'user_id':1}),{}, format='json')
+        self.assertEqual(response.data, self.balance_expected)
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+
+    def test_get_cashflow(self):
+        # get API response
+        response = self.client.get(reverse('transactions:cashflow-detail', kwargs={'user_id':1}),{}, format='json')
+        self.assertEqual(response.data, self.balance_cashflow)
+        self.assertEqual(response.status_code, status.HTTP_200_OK)

+ 55 - 1
users/tests.py

@@ -1,3 +1,57 @@
 from django.test import TestCase
+from rest_framework.test import APITestCase
+from rest_framework import status
+from rest_framework.reverse import reverse
+from .models import User
+from .serializers import UserSerializer
+
+
+class UserViewTest(APITestCase):
+    """ Test case for Transactions Views """
+    user_data_ok = {
+        "name": 'Test 2',
+        "email": 'test2@test2.com',
+        "age": 18
+    }
+
+    user_data_no_age = {
+        "name": 'Test 2',
+        "email": 'test2@test2.com'
+    }
+
+    user_data_duplicate_email = {
+        "name": 'Test 2',
+        "email": 'test@test.com',
+        "age": 18
+    }
+
+    def setUp(self):
+        user = User.objects.create(id=1, name='test', email='test@test.com', age=18)
+
+    def test_pass_create(self):
+        """
+        Create user test
+        """
+        response = self.client.post(reverse('users_path:users-list'), self.user_data_ok, format='json')
+        self.assertEqual(response.data, self.user_data_ok)
+        self.assertEqual(User.objects.filter(email='test2@test2.com').count(), 1)
+        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+
+    def test_wrong_create_age_serializer(self):
+        """
+        Bad age value
+        """
+        serializer = UserSerializer(data=self.user_data_no_age)
+        self.assertEqual(serializer.is_valid(), False)
+        self.assertEqual(set(serializer.errors.keys()), set(['age']))
+
+    def test_wrong_create_duplicated_email_serializer(self):
+        """
+        Bad age email
+        """
+        serializer = UserSerializer(data=self.user_data_duplicate_email)
+        self.assertEqual(serializer.is_valid(), False)
+        self.assertEqual(set(serializer.errors.keys()), set(['email']))
+
+
 
-# Create your tests here.