1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
import os
from unittest import TestCase
from unittest.mock import patch, MagicMock
from flask import Flask
from flask_seeder import cli, FlaskSeeder
from flask_seeder import Seeder
# This is for mocking os.walk, returns a list with dirs and files
# [ <current dir>, [<subdirs>], [<files in dir>] ]
MOCK_FILES = [
["data", ["sub1", "sub2"], []],
[os.path.join("data", "sub1"), [], ["file1.py", "file2.py"]],
[os.path.join("data", "sub2"), [], ["file3.py", "file4.py"]],
]
class TestSeedCLI(TestCase):
def setUp(self):
self.db_mock = MagicMock()
self.app = Flask("test")
self.cli = self.app.test_cli_runner()
self.seeder = FlaskSeeder()
self.seeder.init_app(self.app, db=self.db_mock)
@patch("flask_seeder.cli.os.walk", return_value=MOCK_FILES)
def test_get_seed_scripts_return_list_of_modules(self, mocked):
expected_result = [
os.path.join("data", "sub1", "file1.py"),
os.path.join("data", "sub1", "file2.py"),
os.path.join("data", "sub2", "file3.py"),
os.path.join("data", "sub2", "file4.py"),
]
modules = cli.get_seed_scripts()
self.assertListEqual(modules, expected_result)
@patch("flask_seeder.cli.get_seeders")
def test_seeder_calls_run_method_on_loaded_modules(self, m_get_seeders):
m_seeder = MagicMock()
m_get_seeders.return_value = [m_seeder]
self.cli.invoke(cli.seed_run)
m_seeder.run.assert_called_once()
@patch("flask_seeder.cli.get_seed_scripts", return_value=["test"])
@patch("flask_seeder.cli.get_seeders_from_script")
def test_get_seeders_return_ordered_iterable_of_seeders(self, m_get_seeders, m_get_scripts):
class TestSeeder:
def __init__(self, priority=None):
if priority:
self.priority = priority
class QQTestSeeder:
def __init__(self, priority=None):
if priority:
self.priority = priority
unordered_seeder_list = [TestSeeder(10), QQTestSeeder(), TestSeeder(), QQTestSeeder(1)]
m_get_seeders.return_value = unordered_seeder_list
expected_result = [
unordered_seeder_list[3],
unordered_seeder_list[0],
unordered_seeder_list[1],
unordered_seeder_list[2]
]
result = list(cli.get_seeders())
self.assertListEqual(result, expected_result)
@patch("flask_seeder.cli.get_seeders")
def test_seed_list_print_list_of_seeders(self, m_get_seeders):
m_seeder = MagicMock()
m_seeder.name = "testseeder"
m_get_seeders.return_value = [m_seeder]
result = self.cli.invoke(cli.seed_list)
self.assertTrue("testseeder" in result.output)
@patch("flask_seeder.cli.get_seeders")
def test_seed_run_echo_failed_runs(self, m_get_seeders):
class TestSeeder(Seeder):
def run(self):
raise ValueError()
m_get_seeders.return_value = [TestSeeder()]
result = self.cli.invoke(cli.seed_run)
self.assertTrue("ERROR" in result.output)
@patch("flask_seeder.cli.get_seeders")
def test_root_option_with_list(self, m_get_seeders):
self.cli.invoke(cli.seed_list, args=["--root", "sub1"])
m_get_seeders.assert_called_once_with(root="sub1")
@patch("flask_seeder.cli.get_seeders")
def test_root_option_with_run(self, m_get_seeders):
self.cli.invoke(cli.seed_run, args=["--root", "sub1"])
m_get_seeders.assert_called_once_with(root="sub1")
@patch("flask_seeder.cli.get_seeders")
def test_run_with_seeder_argument(self, m_get_seeders):
m_seeder = MagicMock()
m_seeder.name = "TestSeeder"
m_get_seeders.return_value = [m_seeder]
self.cli.invoke(cli.seed_run, args=["TestSeeder"])
m_seeder.run.assert_called_once()
@patch("flask_seeder.cli.get_seeders", return_value=[])
def test_run_commit_session_by_default(self, m_get_seeders):
self.cli.invoke(cli.seed_run)
self.db_mock.session.commit.assert_called()
@patch("flask_seeder.cli.get_seeders", return_value=[])
def test_run_avoid_commit_with_no_commit_option(self, m_get_seeders):
self.cli.invoke(cli.seed_run, args=["--no-commit"])
self.assertFalse(self.db_mock.session.commit.called)
|