validacion usuarios usuario permisos grupos gestion contraseña python django selenium factory-boy

python - usuarios - ¿Cómo se puede crear un usuario administrador con Factory_Boy?



usuario y contraseña python (3)

Soy un principiante relativo de Django y acabo de empezar a hacer algunas pruebas para mis proyectos. Lo que quiero hacer es construir una prueba funcional con selenio que inicie sesión en el sitio de administración de Django.

Primero seguí este tutorial http://www.tdd-django-tutorial.com/tutorial/1/ y utilicé los accesorios y dumpdata para hacer que la información de la cuenta de administrador esté disponible para la aplicación de prueba (que crea una nueva base de datos). Esto funciona bien

Luego quise ver si puedo hacer lo mismo con el chico de fábrica para reemplazar los accesorios. Factory Boy funciona instanciando el objeto necesario dentro del archivo tests.py que me parece más limpio. De alguna manera no puedo hacer que esto funcione y la documentación de Factory_boy no es demasiado útil ...

Aquí está mi tests.py

from django.test import LiveServerTestCase from django.contrib.auth.models import User from selenium import webdriver from selenium.webdriver.common.keys import Keys import factory class UserFactory(factory.Factory): FACTORY_FOR = User username = ''jeff'' password = ''pass'' is_superuser = True class AdminTest(LiveServerTestCase): def setUp(self): self.browser = webdriver.Firefox() def tearDown(self): self.browser.quit() def test_if_admin_login_is_possible(self): jeff = UserFactory.create() # Jeff opens the browser and goes to the admin page self.browser = webdriver.Firefox() self.browser.get(self.live_server_url + ''/admin/'') # Jeff sees the familiar ''Django Administration'' heading body = self.browser.find_element_by_tag_name(''body'') self.assertIn(''Django administration'', body.text) # Jeff types in his username and password and hits return username_field = self.browser.find_element_by_name(''username'') username_field.send_keys(jeff.username) password_field = self.browser.find_element_by_name(''password'') password_field.send_keys(jeff.password) password_field.send_keys(Keys.RETURN) # Jeff finds himself on the ''Site Administration'' page body = self.browser.find_element_by_tag_name(''body'') self.assertIn(''Site administration'', body.text) self.fail(''Fail...'')

Esto no se puede iniciar sesión ya que de alguna manera no crea una cuenta de administrador válida. ¿Cómo puedo hacer eso usando el chico de fábrica? ¿Es posible o necesito usar accesorios para eso?

(En esta publicación, algunas personas sugirieron que los dispositivos son necesarios pero no surgió el fabricante de computadoras : cómo crear un usuario administrador en django tests.py . También probé la solución sugerida en la parte inferior de la misma respuesta: https: // stackoverflow. com / a / 3495219 / 1539688. No funcionó para mí ...)


Supongo que estás trabajando en el tutorial http://www.tdd-django-tutorial.com porque ahí es donde me quedé atascado también. Probablemente ya lo hayas descifrado, pero para la siguiente persona, aquí está el código que me funcionó, el truco fue agregar el método _prepare para asegurar que la contraseña esté encriptada, y establecer todas las banderas en verdadero (Esto se hizo con Django 1.5. 1, si está utilizando una versión anterior, cambie las importaciones del modelo de usuario)

from django.test import LiveServerTestCase from selenium import webdriver from selenium.webdriver.common.keys import Keys import factory from django.contrib.auth import get_user_model User = get_user_model() class UserFactory(factory.DjangoModelFactory): FACTORY_FOR = User email = ''[email protected]'' username = ''admin'' password = ''adm1n'' is_superuser = True is_staff = True is_active = True @classmethod def _prepare(cls, create, **kwargs): password = kwargs.pop(''password'', None) user = super(UserFactory, cls)._prepare(create, **kwargs) if password: user.set_password(password) if create: user.save() return user class PollsTest(LiveServerTestCase): def setUp(self): self.browser = webdriver.Firefox() self.browser.implicitly_wait(3) self.user = UserFactory.create() def tearDown(self): self.browser.quit() def test_can_create_new_poll_via_admin_site(self): self.browser.get(self.live_server_url+''/admin/'') body = self.browser.find_element_by_tag_name(''body'') self.assertIn(''Django administration'', body.text) username_field = self.browser.find_element_by_name(''username'') username_field.send_keys(self.user.username) password_field = self.browser.find_element_by_name(''password'') password_field.send_keys(''adm1n'') password_field.send_keys(Keys.ENTER) body = self.browser.find_element_by_tag_name(''body'') self.assertIn(''Site administration'', body.text) polls_links = self.browser.find_element_by_link_text(''Polls'') self.assertEqual(len(polls_links), 2) self.fail(''Finish the test!'')


Si crea una subclase factory.DjangoModelFactory, debe guardar el objeto del usuario por usted. Vea la sección de notas en PostGenerationMethodCall . Entonces solo necesitas hacer lo siguiente:

class UserFactory(factory.DjangoModelFactory): FACTORY_FOR = User email = ''[email protected]'' username = ''admin'' password = factory.PostGenerationMethodCall(''set_password'', ''adm1n'') is_superuser = True is_staff = True is_active = True


Así es como lo hice con Factory Boy 2.7.0 y Django 1.8.4 . A continuación hay dos fábricas, una para un usuario básico y otra para el usuario administrador, que hereda de la básica y solo agrega los campos necesarios.

class UserFactory(DjangoModelFactory): class Meta: model = User django_get_or_create = (''username'', ''email'', ''password'') username = ''basic'' email = ''basic@tnot_admin.com'' password = ''basicpassword'' class AdminFactory(UserFactory): username = ''admin'' is_superuser = True