From b9f6db18560ca2c278e63a370be27f21afd47dae Mon Sep 17 00:00:00 2001 From: Adam Shimali Date: Fri, 15 Jan 2016 11:12:05 +0000 Subject: [PATCH 1/3] Added model and dao for Jobs. --- app/dao/jobs_dao.py | 19 ++++ app/job/__init__.py | 0 app/models.py | 25 +++++ app/schemas.py | 2 +- migrations/versions/0004_create_jobs.py | 40 ++++++++ tests/app/dao/test_jobs_dao.py | 117 ++++++++++++++++++++++++ 6 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 app/dao/jobs_dao.py create mode 100644 app/job/__init__.py create mode 100644 migrations/versions/0004_create_jobs.py create mode 100644 tests/app/dao/test_jobs_dao.py diff --git a/app/dao/jobs_dao.py b/app/dao/jobs_dao.py new file mode 100644 index 000000000..06e56fb97 --- /dev/null +++ b/app/dao/jobs_dao.py @@ -0,0 +1,19 @@ +from app import db +from app.models import Job + + +def save_job(job): + db.session.add(job) + db.session.commit() + + +def get_job_by_id(id): + return Job.query.get(id) + + +def get_jobs_by_service(service_id): + return Job.query.filter_by(service_id=service_id).all() + + +def get_jobs(): + return Job.query.all() diff --git a/app/job/__init__.py b/app/job/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/app/models.py b/app/models.py index 0e4b13609..07d03a1df 100644 --- a/app/models.py +++ b/app/models.py @@ -1,6 +1,8 @@ from . import db import datetime +from sqlalchemy.dialects.postgresql import UUID + def filter_null_value_fields(obj): return dict( @@ -95,3 +97,26 @@ class Template(db.Model): content = db.Column(db.Text, index=False, unique=False, nullable=False) service_id = db.Column(db.BigInteger, db.ForeignKey('services.id'), index=True, unique=False) service = db.relationship('Service', backref=db.backref('templates', lazy='dynamic')) + + +class Job(db.Model): + + __tablename__ = 'jobs' + + id = db.Column(UUID(as_uuid=True), primary_key=True) + original_file_name = db.Column(db.String, nullable=False) + service_id = db.Column(db.BigInteger, db.ForeignKey('services.id'), index=True, unique=False) + service = db.relationship('Service', backref=db.backref('jobs', lazy='dynamic')) + template_id = db.Column(db.BigInteger, db.ForeignKey('templates.id'), index=True, unique=False) + created_at = db.Column( + db.DateTime, + index=False, + unique=False, + nullable=False, + default=datetime.datetime.now) + updated_at = db.Column( + db.DateTime, + index=False, + unique=False, + nullable=True, + onupdate=datetime.datetime.now) diff --git a/app/schemas.py b/app/schemas.py index 71bc14377..3f28b9e34 100644 --- a/app/schemas.py +++ b/app/schemas.py @@ -19,7 +19,7 @@ class UserSchema(ma.ModelSchema): class ServiceSchema(ma.ModelSchema): class Meta: model = models.Service - exclude = ("updated_at", "created_at", "tokens", "templates") + exclude = ("updated_at", "created_at", "tokens", "templates", "jobs") class TemplateSchema(ma.ModelSchema): diff --git a/migrations/versions/0004_create_jobs.py b/migrations/versions/0004_create_jobs.py new file mode 100644 index 000000000..fd5bd18bf --- /dev/null +++ b/migrations/versions/0004_create_jobs.py @@ -0,0 +1,40 @@ +"""empty message + +Revision ID: c929d81b9e4a +Revises: 0003_create_tokens +Create Date: 2016-01-15 10:12:02.381160 + +""" + +# revision identifiers, used by Alembic. +revision = '0004_create_jobs' +down_revision = '0003_create_tokens' + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +def upgrade(): + ### commands auto generated by Alembic - please adjust! ### + op.create_table('jobs', + sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False), + sa.Column('original_file_name', sa.String(), nullable=False), + sa.Column('service_id', sa.BigInteger(), nullable=True), + sa.Column('template_id', sa.BigInteger(), nullable=True), + sa.Column('created_at', sa.DateTime(), nullable=False), + sa.Column('updated_at', sa.DateTime(), nullable=True), + sa.ForeignKeyConstraint(['service_id'], ['services.id'], ), + sa.ForeignKeyConstraint(['template_id'], ['templates.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_jobs_service_id'), 'jobs', ['service_id'], unique=False) + op.create_index(op.f('ix_jobs_template_id'), 'jobs', ['template_id'], unique=False) + ### end Alembic commands ### + + +def downgrade(): + ### commands auto generated by Alembic - please adjust! ### + op.drop_index(op.f('ix_jobs_template_id'), table_name='jobs') + op.drop_index(op.f('ix_jobs_service_id'), table_name='jobs') + op.drop_table('jobs') + ### end Alembic commands ### diff --git a/tests/app/dao/test_jobs_dao.py b/tests/app/dao/test_jobs_dao.py new file mode 100644 index 000000000..fdf56c089 --- /dev/null +++ b/tests/app/dao/test_jobs_dao.py @@ -0,0 +1,117 @@ +import uuid + +from app.dao.jobs_dao import ( + save_job, + get_job_by_id, + get_jobs_by_service, + get_jobs +) + +from app.models import Job + +from tests.app.conftest import ( + sample_template as create_template, + sample_service as create_service +) + + +def test_save_job(notify_api, notify_db, notify_db_session, sample_user): + service = create_service(notify_db, notify_db_session, user=sample_user) + template = create_template(notify_db, notify_db_session, service=service) + + assert Job.query.count() == 0 + job_id = uuid.uuid4() + data = { + 'id': job_id, + 'service_id': service.id, + 'template_id': template.id, + 'original_file_name': 'some.csv' + } + + job = Job(**data) + + save_job(job) + + assert Job.query.count() == 1 + job_from_db = Job.query.get(job_id) + assert job == job_from_db + + +def test_get_job_by_id(notify_api, notify_db, notify_db_session, sample_user): + service = create_service(notify_db, notify_db_session, user=sample_user) + template = create_template(notify_db, notify_db_session, service=service) + + assert Job.query.count() == 0 + job_id = uuid.uuid4() + data = { + 'id': job_id, + 'service_id': service.id, + 'template_id': template.id, + 'original_file_name': 'some.csv' + } + job = Job(**data) + save_job(job) + + job_from_db = get_job_by_id(job_id) + + assert job == job_from_db + + +def test_get_jobs_for_service(notify_api, notify_db, notify_db_session, + sample_user): + + service1, service2 = _do_services_setup(notify_db, + notify_db_session, sample_user) + + jobs1 = [job for job in service1.jobs] # get jobs directly from service + jobs1_from_dao = get_jobs_by_service(service1.id) # get jobs via dao + + assert len(jobs1_from_dao) == 5 + assert jobs1 == jobs1_from_dao + + jobs2 = [job for job in service2.jobs] # get jobs directly from service + jobs2_from_dao = get_jobs_by_service(service2.id) # get jobs via dao + + assert len(jobs2_from_dao) == 2 + assert jobs2 == jobs2_from_dao + + assert jobs1_from_dao != jobs2_from_dao + + +def test_get_all_jobs(notify_api, notify_db, notify_db_session, + sample_user): + + _do_services_setup(notify_db, notify_db_session, sample_user) + + jobs_from_db = get_jobs() + assert len(jobs_from_db) == 7 + + +def _do_services_setup(notify_db, notify_db_session, sample_user): + service1 = create_service(notify_db, notify_db_session, user=sample_user) + template1 = create_template(notify_db, notify_db_session, service=service1) + + for i in range(5): + job_id = uuid.uuid4() + data = { + 'id': job_id, + 'service_id': service1.id, + 'template_id': template1.id, + 'original_file_name': 'some.csv' + } + save_job(Job(**data)) + + service2 = create_service(notify_db, notify_db_session, user=sample_user) + template2 = create_template(notify_db, notify_db_session, service=service2) + + for i in range(2): + job_id = uuid.uuid4() + data = { + 'id': job_id, + 'service_id': service2.id, + 'template_id': template2.id, + 'original_file_name': 'some.csv' + } + save_job(Job(**data)) + + return service1, service2 From ef6d1008e5caaee352bc55fe7f704feee5e96c8d Mon Sep 17 00:00:00 2001 From: Adam Shimali Date: Fri, 15 Jan 2016 11:33:47 +0000 Subject: [PATCH 2/3] Fix revision ID --- migrations/versions/0004_create_jobs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/migrations/versions/0004_create_jobs.py b/migrations/versions/0004_create_jobs.py index fd5bd18bf..d5f1cafb6 100644 --- a/migrations/versions/0004_create_jobs.py +++ b/migrations/versions/0004_create_jobs.py @@ -1,6 +1,6 @@ """empty message -Revision ID: c929d81b9e4a +Revision ID: 0004_create_jobs Revises: 0003_create_tokens Create Date: 2016-01-15 10:12:02.381160 From 012cff5ae2e032dbc637c33a53d3d8d27df76304 Mon Sep 17 00:00:00 2001 From: Adam Shimali Date: Fri, 15 Jan 2016 12:16:07 +0000 Subject: [PATCH 3/3] test cleanup with fixtures --- tests/app/conftest.py | 26 +++++++++- tests/app/dao/test_jobs_dao.py | 89 ++++++++-------------------------- 2 files changed, 43 insertions(+), 72 deletions(-) diff --git a/tests/app/conftest.py b/tests/app/conftest.py index 560e3bf38..99930cd4e 100644 --- a/tests/app/conftest.py +++ b/tests/app/conftest.py @@ -1,9 +1,11 @@ import pytest -from app.models import (User, Service, Template, Token) +from app.models import (User, Service, Template, Token, Job) from app.dao.users_dao import (save_model_user) from app.dao.services_dao import save_model_service from app.dao.templates_dao import save_model_template from app.dao.tokens_dao import save_model_token +from app.dao.jobs_dao import save_job +import uuid @pytest.fixture(scope='function') @@ -57,10 +59,30 @@ def sample_template(notify_db, def sample_token(notify_db, notify_db_session, service=None): - import uuid if service is None: service = sample_service(notify_db, notify_db_session) data = {'service_id': service.id} token = Token(**data) save_model_token(token) return token + + +@pytest.fixture(scope='function') +def sample_job(notify_db, + notify_db_session, + service=None, + template=None): + if service is None: + service = sample_service(notify_db, notify_db_session) + if template is None: + template = sample_template(notify_db, notify_db_session, + service=service) + data = { + 'id': uuid.uuid4(), + 'service_id': service.id, + 'template_id': template.id, + 'original_file_name': 'some.csv' + } + job = Job(**data) + save_job(job) + return job diff --git a/tests/app/dao/test_jobs_dao.py b/tests/app/dao/test_jobs_dao.py index fdf56c089..a2336b247 100644 --- a/tests/app/dao/test_jobs_dao.py +++ b/tests/app/dao/test_jobs_dao.py @@ -9,27 +9,19 @@ from app.dao.jobs_dao import ( from app.models import Job -from tests.app.conftest import ( - sample_template as create_template, - sample_service as create_service -) - -def test_save_job(notify_api, notify_db, notify_db_session, sample_user): - service = create_service(notify_db, notify_db_session, user=sample_user) - template = create_template(notify_db, notify_db_session, service=service) +def test_save_job(notify_db, notify_db_session, sample_template): assert Job.query.count() == 0 job_id = uuid.uuid4() data = { 'id': job_id, - 'service_id': service.id, - 'template_id': template.id, + 'service_id': sample_template.service_id, + 'template_id': sample_template.id, 'original_file_name': 'some.csv' } job = Job(**data) - save_job(job) assert Job.query.count() == 1 @@ -37,16 +29,13 @@ def test_save_job(notify_api, notify_db, notify_db_session, sample_user): assert job == job_from_db -def test_get_job_by_id(notify_api, notify_db, notify_db_session, sample_user): - service = create_service(notify_db, notify_db_session, user=sample_user) - template = create_template(notify_db, notify_db_session, service=service) - +def test_get_job_by_id(notify_db, notify_db_session, sample_template): assert Job.query.count() == 0 job_id = uuid.uuid4() data = { 'id': job_id, - 'service_id': service.id, - 'template_id': template.id, + 'service_id': sample_template.service_id, + 'template_id': sample_template.id, 'original_file_name': 'some.csv' } job = Job(**data) @@ -57,61 +46,21 @@ def test_get_job_by_id(notify_api, notify_db, notify_db_session, sample_user): assert job == job_from_db -def test_get_jobs_for_service(notify_api, notify_db, notify_db_session, - sample_user): +def test_get_jobs_for_service(notify_db, notify_db_session, sample_job): - service1, service2 = _do_services_setup(notify_db, - notify_db_session, sample_user) + service_id = sample_job.service_id + job_from_db = get_jobs_by_service(service_id) - jobs1 = [job for job in service1.jobs] # get jobs directly from service - jobs1_from_dao = get_jobs_by_service(service1.id) # get jobs via dao - - assert len(jobs1_from_dao) == 5 - assert jobs1 == jobs1_from_dao - - jobs2 = [job for job in service2.jobs] # get jobs directly from service - jobs2_from_dao = get_jobs_by_service(service2.id) # get jobs via dao - - assert len(jobs2_from_dao) == 2 - assert jobs2 == jobs2_from_dao - - assert jobs1_from_dao != jobs2_from_dao + assert len(job_from_db) == 1 + assert sample_job == job_from_db[0] -def test_get_all_jobs(notify_api, notify_db, notify_db_session, - sample_user): - - _do_services_setup(notify_db, notify_db_session, sample_user) - - jobs_from_db = get_jobs() - assert len(jobs_from_db) == 7 - - -def _do_services_setup(notify_db, notify_db_session, sample_user): - service1 = create_service(notify_db, notify_db_session, user=sample_user) - template1 = create_template(notify_db, notify_db_session, service=service1) - +def test_get_all_jobs(notify_db, notify_db_session, sample_template): + from tests.app.conftest import sample_job as create_job for i in range(5): - job_id = uuid.uuid4() - data = { - 'id': job_id, - 'service_id': service1.id, - 'template_id': template1.id, - 'original_file_name': 'some.csv' - } - save_job(Job(**data)) - - service2 = create_service(notify_db, notify_db_session, user=sample_user) - template2 = create_template(notify_db, notify_db_session, service=service2) - - for i in range(2): - job_id = uuid.uuid4() - data = { - 'id': job_id, - 'service_id': service2.id, - 'template_id': template2.id, - 'original_file_name': 'some.csv' - } - save_job(Job(**data)) - - return service1, service2 + create_job(notify_db, + notify_db_session, + sample_template.service, + sample_template) + jobs_from_db = get_jobs() + assert len(jobs_from_db) == 5