Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Db tests #89

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
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
4 changes: 2 additions & 2 deletions newsletter_automation/helpers/mailchimp_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ def create_campaign(self,title,subject_line,preview_text):
def set_campaign_content(self,newsletter_json,campaign_id):
"sets the content text for the campaign"
try:
editable_newsletter = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'Editable_Newsletter_Template.html')
with open(editable_newsletter) as raw_data:
editable_template = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'Editable_Newsletter_Template.html')
with open(editable_template) as raw_data:
template = Template(raw_data.read())
#print(newsletter_json)
final_html =template.render(newsletter_json=newsletter_json)
Expand Down
11 changes: 10 additions & 1 deletion newsletter_automation/newsletter/__init__.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,28 @@
#!/bin/env python
import os
import os, sys
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:[email protected]/newsletter_automation'
app.config['SQLALCHEMY_BINDS'] = {
'qa_db': 'mysql+pymysql://root:[email protected]/qa_db'
}
app.config['SECRET_KEY'] = "random string"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config.from_object(__name__)

db = SQLAlchemy(app)

# following test db session is for db tests expected verifications
app.config['SQLALCHEMY_DATABASE_TEST_URI'] = 'mysql+pymysql://root:[email protected]/qa_db'

migrate = Migrate()
migrate.init_app(app, db)

from newsletter import models
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
from tests.db_tests import db_tests_models
from newsletter import routes
from newsletter import schedule_form_routes
59 changes: 59 additions & 0 deletions newsletter_automation/tests/db_tests/db_tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
""" add unit tests to verify table structures , number of tables and pre-defined article categories"""

import unittest
import os,sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
from newsletter.models import Articles, Article_category, AddNewsletter, NewsletterContent, Newsletter_schedule, Newsletter_campaign
from newsletter import db, app
from sqlalchemy import select,inspect,create_engine
from sqlalchemy import INTEGER,FLOAT,VARCHAR

class TestDatabase(unittest.TestCase):
""" database integration tests """

def setUp(self):
"""set the expected data required to validate the working db"""
self.test_db_engine = create_engine(app.config['SQLALCHEMY_DATABASE_TEST_URI'])
self.test_inspector = inspect(self.test_db_engine)
self.db_engine = create_engine(app.config['SQLALCHEMY_DATABASE_URI'])
self.inspector = inspect(self.db_engine)
self.all_tables_expected = sorted(['add_newsletter', 'article_category', 'articles', 'newsletter_campaign', 'newsletter_content', 'newsletter_schedule'])
self.article_categories_expected = ['comic', 'pastweek', 'currentweek', 'automation corner']

def test_database_contains_all_tables(self):
"""check test_db has all the expected tables"""
self.assertEqual(self.all_tables_expected,self.inspector.get_table_names())

def test_article_categories(self):
""" validate pre-defined article categories in the db """
self.assertEqual(self.article_categories_expected,[ctg[0] for ctg in db.session.query(Article_category.category_name).all()])

def test_articles_schema(self):
"""verify articles table schema is as expected"""
#self.maxDiff=None
self.assertEqual(str(self.test_inspector.get_columns('test_articles')),str(self.inspector.get_columns('articles')))

def test_add_newsletter_schema(self):
"""verify newsletter table schema is as expected"""
self.assertEqual(str(self.test_inspector.get_columns('test_add_newsletter')),str(self.inspector.get_columns('add_newsletter')))

def test_article_category_schema(self):
"""verify article_category table schema is as expected"""
self.assertEqual(str(self.test_inspector.get_columns('test_article_category')),str(self.inspector.get_columns('article_category')))

def test_newsletter_campaign_schema(self):
"""verify newsletter_campaign table schema is as expected"""
self.assertEqual(str(self.test_inspector.get_columns('test_newsletter_campaign')),str(self.inspector.get_columns('newsletter_campaign')))

def test_newsletter_content_schema(self):
"""verify newsletter_content table schema is as expected"""
self.assertEqual(str(self.test_inspector.get_columns('test_newsletter_content')),str(self.inspector.get_columns('newsletter_content')))

def test_newsletter_schedule_schema(self):
"""verify newsletter_schedule table schema is as expected"""
self.assertEqual(str(self.test_inspector.get_columns('test_newsletter_schedule')),str(self.inspector.get_columns('newsletter_schedule')))


if __name__=='__main__':
unittest.main(verbosity=2)

95 changes: 95 additions & 0 deletions newsletter_automation/tests/db_tests/db_tests_models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
"""
This file has been created for testing purpose which contains expected Models to compare with the actual data base schemas
"""
import sys,os
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
from newsletter import db

class AddNewsletter(db.Model):
"Class for AddNewsletter db model"
__tablename__ = 'test_add_newsletter'
__bind_key__ = 'qa_db'
newsletter_id = db.Column(db.Integer, primary_key=True)
subject = db.Column(db.String(50))
opener = db.Column(db.String(400))
preview = db.Column(db.String(400))
#campaign_id= db.Column(db.Integer)

def __init__(self, subject, opener,preview):
"initialize subject,opener"
self.subject = subject
self.opener = opener
self.preview = preview

class NewsletterContent(db.Model):
"Class for NewsletterContent db model"
__tablename__ = 'test_newsletter_content'
__bind_key__ = 'qa_db'
newsletter_content_id = db.Column(db.Integer, primary_key=True)
newsletter_id = db.Column(db.Integer, db.ForeignKey('test_add_newsletter.newsletter_id'))
article_id = db.Column(db.Integer, db.ForeignKey('test_articles.article_id'))

def __init__(self, newsletter_id, article_id):
self.newsletter_id = newsletter_id
self.article_id = article_id

class Articles(db.Model):
"Class for Article db model"
__tablename__ = 'test_articles'
__bind_key__ = 'qa_db'
article_id = db.Column('article_id', db.Integer, primary_key = True)
url = db.Column(db.String(100))
title = db.Column(db.String(250))
description = db.Column(db.String(500))
time = db.Column(db.String(300))
category_id = db.Column(db.Integer, db.ForeignKey('test_article_category.category_id'))
newsletter_id = db.Column(db.Integer, db.ForeignKey('test_add_newsletter.newsletter_id'))

def __init__(self, url, title, description, time,category_id):
"initializes url, title, description, time, category_id"
self.url = url
self.title = title
self.description = description
self.time = time
self.category_id = category_id


class Article_category(db.Model):
"Class for Article_category db model"
__tablename__ = 'test_article_category'
__bind_key__ = 'qa_db'
category_id = db.Column('category_id', db.Integer, primary_key = True)
category_name = db.Column(db.String(100))

def __init__(self, category_name):
"initializes category_name"
self.category_name = category_name


class Newsletter_schedule(db.Model):
"Newsletter schedule table"
__tablename__ = 'test_newsletter_schedule'
__bind_key__ = 'qa_db'
schedule_id = db.Column('schedule_id', db.Integer, primary_key=True)
newsletter_id = db.Column('newsletter_id',db.Integer,db.ForeignKey('test_add_newsletter.newsletter_id'))
schedule_date = db.Column('schedule_date',db.Integer)

def __init__(self,schedule_id,newsletter_id,schedule_date):
self.schedule_id = schedule_id
self.newsletter_id = newsletter_id
self.schedule_date = schedule_date

class Newsletter_campaign(db.Model):
"Newsletter create campaign table"
__tablename__ = 'test_newsletter_campaign'
__bind_key__ = 'qa_db'
Newsletter_campaign_id =db.Column('Newsletter_campaign_id', db.Integer, primary_key=True)
campaign_id = db.Column('campaign_id', db.String(50))
newsletter_id = db.Column('newsletter_id',db.Integer,db.ForeignKey('test_add_newsletter.newsletter_id'))

def __init__(self,campaign_id,newsletter_id):
self.campaign_id = campaign_id
self.newsletter_id = newsletter_id

db.create_all()
db.session.commit()