My problem is that I wanted to create a separate testing database, separate from my development database. The application itself is almost identical to the Django-Rest-Framework Quick Start Tutorial, I just use an LDAP server. My development database uses MySQL. I have a separate settings file for testing.
The full error tracing I entered here is: http://dpaste.com/1W3TX1E , but the interesting part:
sqlite3.OperationalError: no such table: auth_user
Full test settings: http://dpaste.com/1K7KHK4 . My related settings (pyldap and django-ldap-auth are missing in installed applications, they are installed manually with pip):
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'njord', 'permissions', ] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': ':memory:', } }
Currently, the application only performs authentication using LDAP. I think that is why I have a mistake - when I do tests, I have nothing in my database - there are no users, no groups. If the user is authenticated on the LDAP server, the user is created in the database along with all the groups in which he / she is located, so this happens on request.
What works: the development version of my application works well with external LDAP, and also works with development databases.
What does not work: Testing using the sqlite3 database in memory (I repeat, testing using the ldap development and bullying database).
The code I'm testing is here:
from django.test import TestCase, Client import django import ldap from mockldap import MockLdap class AuthenticationTests(TestCase): """ Set Up the structure ( Accounts, Groups ) and try authentication """ # Top level hierarchy top = ('dc=ee', {'dc': ['ee']}) test = ('dc=test,dc=ee', {'dc': ['test']}) # Top level groups people = ('ou=people,dc=test,dc=ee', {'ou': ['people'], 'objectClass': ['organizationalUnit', 'top']}) groups = ('ou=groups,dc=test,dc=ee', {'ou': ['groups'], 'objectClass': ['organizationalUnit', 'top']}) # Groups admins = ('cn=admins,ou=groups,dc=test,dc=ee', {'cn': ['admins'], 'memberUid': ['admin'], 'objectClass': ['sambaGroupMapping', 'posixGroup', 'top'], 'gidNumber': ['1']}) group1 = ('cn=group1,ou=groups,dc=test,dc=ee', {'cn': ['group1'], 'memberUid': ['alice', 'bob'], 'objectClass': ['sambaGroupMapping', 'posixGroup', 'top']}) group2 = ('cn=group2,ou=groups,dc=test,dc=ee', {'cn': ['group2'], 'memberUid': ['admin', 'bob', 'karl'], 'objectClass': ['sambaGroupMapping', 'posixGroup', 'top']}) # Users admin = ('uid=admin,ou=people,dc=test,dc=ee', {'uid': ['admin'], 'userPassword': ['ldaptest'], 'sn': ['Joe'], 'cn': ['Admin Joe'], 'mail': [' admin.joe@test.ee '], 'givenName': ['Admin'], 'objectClass': ['top', 'person', 'posixAccount', 'shadowAccount', 'inetOrgPerson', 'sambaSamAccount']}) alice = ('uid=alice,ou=people,dc=test,dc=ee', {'uid': ['alice'], 'userPassword': ['ldaptest'], 'sn': ['Cooper'], 'cn': ['Alice Cooper'], 'mail': [' alice.cooper@test.ee '], 'givenName': ['Alice'], 'objectClass': ['top', 'person', 'posixAccount', 'shadowAccount', 'inetOrgPerson', 'sambaSamAccount']}) bob = ('uid=bob,ou=people,dc=test,dc=ee', {'uid': ['bob'], 'userPassword': ['ldaptest'], 'sn': ['Marley'], 'cn': ['Bob Marley'], 'mail': [' bob.marley@test.ee '], 'givenName': ['Bob'], 'objectClass': ['top', 'person', 'posixAccount', 'shadowAccount', 'inetOrgPerson', 'sambaSamAccount']}) karl = ('uid=karl,ou=people,dc=test,dc=ee', {'uid': ['karl'], 'userPassword': ['ldaptest'], 'sn': ['Suur'], 'cn': ['Karl Suur'], 'mail': [' karl.suur@test.ee '], 'givenName': ['Karl'], 'objectClass': ['top', 'person', 'posixAccount', 'shadowAccount', 'inetOrgPerson', 'sambaSamAccount']}) # This is the content of our mock LDAP directory. It takes the form # {dn: {attr: [value, ...], ...}, ...}. directory = dict([top, test, people, groups, admins, group1, group2, admin, alice, bob, karl]) @classmethod def setUpTestData(cls): # We only need to create the MockLdap instance once. The content we # pass in will be used for all LDAP connections. cls.mockldap = MockLdap(cls.directory) @classmethod def tearDownClass(cls): del cls.mockldap def setUp(self): # Patch ldap.initialize django.setup() self.mockldap.start() self.ldapobj = self.mockldap['ldap://localhost/'] def tearDown(self): # Stop patching ldap.initialize and reset state. self.mockldap.stop() del self.ldapobj def test_some_basic_mockldap_auth(self): searchStr = 'uid=alice,ou=people,dc=test,dc=ee' results = _do_simple_ldap_search(searchStr) ldapName = results[0][0] ldapPropDict = results[0][1] self.assertEqual(searchStr, ldapName) self.assertEqual(len(ldapPropDict), 7) def test_index_visible_for_all(self): c = Client() response = c.get("/") self.assertContains(response, "/users/", 1) self.assertContains(response, "/groups/", 1) def test_login(self): c = Client() response = c.post("/api-auth/login/", {'username': 'bob', 'password': 'ldaptest'}) print(response.status_code) response = c.get("/users/") print(response._container) def _do_simple_ldap_search(searchStr): conn = ldap.initialize('ldap://localhost/') conn.simple_bind_s(searchStr, 'ldaptest') results = conn.search_s(searchStr, ldap.SCOPE_SUBTREE, ) return results
The code is also available here: http://dpaste.com/3D2H4NK (syntax highlighting).
I am not sure what the problem is. The only thing I can think of is that since there are no users in creating the database, the database is not being created, but I'm not sure. Any help is much appreciated.
I performed all the migrations.
(venv) user@box :~/workspace/fileshare/njord$ python manage.py showmigrationsadmin [X] 0001_initial [X] 0002_logentry_remove_auto_add auth [X] 0001_initial [X] 0002_alter_permission_name_max_length [X] 0003_alter_user_email_max_length [X] 0004_alter_user_username_opts [X] 0005_alter_user_last_login_null [X] 0006_require_contenttypes_0002 [X] 0007_alter_validators_add_error_messages contenttypes [X] 0001_initial [X] 0002_remove_content_type_name sessions [X] 0001_initial (venv) user@box :~/workspace/fileshare/njord$ python manage.py makemigrationsNo changes detected (venv) user@box :~/workspace/fileshare/njord$ python manage.py migrate Operations to perform: Apply all migrations: admin, sessions, auth, contenttypes Running migrations: No migrations to apply.