Scille / umongo

sync/async MongoDB ODM, yes.
MIT License
446 stars 63 forks source link

How do the isolation test #375

Open 0xblacktea opened 2 years ago

0xblacktea commented 2 years ago

How do the isolation test

The project structure


$ tree -L 2
.
├── config.py
├── sandbox
│   ├── config.py
│   ├── __init__.py
│   ├── main.py
│   ├── models.py
│   └── tasks.py
├── settings.toml
├── templates
│   ├── compose_template
...
└── tests
    ├── common.py
    ├── conftest.py
    ├── __init__.py
    ├── test_models.py
    └── test_sandbox.py

11 directories, 48 files

sandbox/models.py


from pymongo import MongoClient
from umongo import Document, EmbeddedDocument, fields, validate
from umongo.frameworks import PyMongoInstance

username = "root"
password = "example"
host = "192.168.204.129"
uri = f"mongodb://{username}:{password}@{host}"
db = MongoClient(uri).ioc
# instance = PyMongoInstance(db)

instance = PyMongoInstance()
instance.set_db(db)

...

@instance.register
class UrlStatusTable(BaseIOCDocument):
    value = fields.StrField(required=True) # url
    hash_infos = fields.ListField(fields.ReferenceField(HashTable))

    class Meta:
        collection_name = "UrlStatusTable"

tests/test_models.py


import pytest
from pymongo import MongoClient
from config import settings

from sandbox.models import (
  UrlStatusTable, PocStatusTable
)

from .common import BaseTest, BaseDBTest, TEST_DB

def make_db():

    host = settings.mongodb.host
    username = settings.mongodb.username
    password = settings.mongodb.password
    uri = f"mongodb://{username}:{password}@{host}"
    TEST_DB = settings.mongodb.test_dbname                      #   test db name:   ioc_test

    return MongoClient(uri)[TEST_DB]

@pytest.fixture
def db():
    return make_db()

class TestURLCRUD(BaseDBTest):

    def test_url_simple_crud(self):
        md5 = HashTable(value="7adcd9e020cf273b7f197abcf9305173", value_type="md5", source="url")
        md5.commit() 
        baidu = UrlStatusTable(value="www.baidu.com")
        baidu.hash_infos = [md5]
        # print(baidu.dump())

        assert baidu.value == "www.baidu.com"
        assert baidu.dump()['hash_infos'][0] == str(md5.id)
        assert baidu.hash_infos[0].fetch().value_type == "md5"
        assert baidu.hash_infos[0].fetch().source == "url"

if __name__ == "__main__":
    pytest.main(['-s', 'test_models.py'])

run pytest

root @ c7 in .../sec/sandbox |06:24:35  |master U:8 ✗|
$ pytest -v
========================================================================== test session starts ==========================================================================
platform linux -- Python 3.8.13, pytest-7.1.2, pluggy-0.13.1 -- /root/.cache/pypoetry/virtualenvs/sandbox-Yi_B9d---py3.8/bin/python
cachedir: .pytest_cache
rootdir: /home/projects/sec/sandbox, configfile: pytest.ini
plugins: anyio-3.5.0
collected 2 items

tests/test_models.py::TestURLCRUD::test_url_simple_crud PASSED                                                                                                    [ 50%]
tests/test_sandbox.py::test_version PASSED                                                                                                                        [100%]

=========================================================================== 2 passed in 0.44s ===========================================================================

The document model is already decorated with decorators when it is imported, and the test data is written directly to the database specified by instance.set_db(db) in the models.py file, but not to the specified test database ioc_test