ginger-dev-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Ginger-dev-list] [PATCH 1/2] Unit tests for user management


From: Daniel Henrique Barboza
Subject: Re: [Ginger-dev-list] [PATCH 1/2] Unit tests for user management
Date: Fri, 24 Jul 2015 15:15:31 -0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0

Actually it needs a v2 :P

The reason why this pep8 errors appeared is because make check-local wasn't
running the pep8 script in the new /test dir. I need to include this change in
Makefile.am as well.

I'll send another version right away. Thanks Ziviani!

On 07/24/2015 01:37 PM, Jose Ricardo Ziviani wrote:
Only some minor changes, don't need to resend the patch for review.

On 24-07-2015 10:53, address@hidden wrote:
From: Daniel Henrique Barboza <address@hidden>

This patch creates a basic testing framework for Ginger models,
starting with some tests that cover the user management
backend

Signed-off-by: Daniel Henrique Barboza <address@hidden>
---
  Makefile.am              |   2 +-
  configure.ac             |   6 +++
  tests/Makefile.am        |  35 +++++++++++++++++
  tests/run_tests.sh       |  45 +++++++++++++++++++++
  tests/run_tests.sh.in    |  45 +++++++++++++++++++++
tests/test_libuser.py | 100 +++++++++++++++++++++++++++++++++++++++++++++++
  tests/test_user_model.py |  79 +++++++++++++++++++++++++++++++++++++
  7 files changed, 311 insertions(+), 1 deletion(-)
  create mode 100644 tests/Makefile.am
  create mode 100755 tests/run_tests.sh
  create mode 100644 tests/run_tests.sh.in
  create mode 100644 tests/test_libuser.py
  create mode 100644 tests/test_user_model.py

diff --git a/Makefile.am b/Makefile.am
index 5a52d95..4a13143 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -17,7 +17,7 @@
  # License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

-SUBDIRS= po controls models ui contrib
+SUBDIRS= po controls models ui contrib tests

  ACLOCAL_AMFLAGS = --install -I m4

diff --git a/configure.ac b/configure.ac
index 26b78c0..f5de8e3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -42,6 +42,11 @@ AM_GNU_GETTEXT([external])
  AM_GNU_GETTEXT_VERSION([0.18])
  AC_PATH_PROG([CHEETAH], [cheetah], [/usr/bin/cheetah])

+AC_PYTHON_MODULE([unittest])
+AC_SUBST([HAVE_PYMOD_UNITTEST])
+AC_SUBST([PYTHON_VERSION])
+
+
  # Checking for pyflakes
  AC_PATH_PROG([PYFLAKES], [pyflakes])
  if test "x$PYFLAKES" = "x"; then
@@ -69,6 +74,7 @@ AC_CONFIG_FILES([
      contrib/Makefile
      contrib/DEBIAN/Makefile
      contrib/DEBIAN/control
+    tests/Makefile
  ],[
      chmod +x po/gen-pot
  ])
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644
index 0000000..d890ba8
--- /dev/null
+++ b/tests/Makefile.am
@@ -0,0 +1,35 @@
+#
+# Project Ginger
+#
+# Copyright IBM Corp, 2015
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+EXTRA_DIST = \
+        Makefile.am \
+    run_tests.sh.in \
+    $(NULL)
+
+do_substitution = \
+    sed -e 's,address@hidden@],$(HAVE_PYMOD_UNITTEST),g' \
+    -e 's,address@hidden@],$(PYTHON_VERSION),g'
+
+run_tests.sh: run_tests.sh.in Makefile
+    $(do_substitution) < $(srcdir)/run_tests.sh.in > run_tests.sh
+    chmod +x run_tests.sh
+
+BUILT_SOURCES = run_tests.sh
+
+CLEANFILES = run_tests.sh
diff --git a/tests/run_tests.sh b/tests/run_tests.sh
new file mode 100755
index 0000000..55991db
--- /dev/null
+++ b/tests/run_tests.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+#
+# Project Ginger
+#
+# Copyright IBM, Corp. 2015
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+HAVE_UNITTEST=yes
+PYTHON_VER=2.7
+
+if [ "$1" = "-v" ]; then
+    OPTS="-v"
+    shift
+else
+    OPTS=""
+fi
+
+if [ $# -ne 0 ]; then
+    ARGS="$@"
+else
+    ARGS="discover"
+fi
+
+if [ "$HAVE_UNITTEST" != "yes" -o "$PYTHON_VER" == "2.6" ]; then
+    CMD="unit2"
+else
+    CMD="python -m unittest"
+fi
+
+LIST=($ARGS)
+
+PYTHONPATH=../../../src:../ $CMD $ARGS $OPTS
diff --git a/tests/run_tests.sh.in b/tests/run_tests.sh.in
new file mode 100644
index 0000000..a39254c
--- /dev/null
+++ b/tests/run_tests.sh.in
@@ -0,0 +1,45 @@
+#!/bin/bash
+#
+# Project Ginger
+#
+# Copyright IBM, Corp. 2015
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
address@hidden@
address@hidden@
+
+if [ "$1" = "-v" ]; then
+    OPTS="-v"
+    shift
+else
+    OPTS=""
+fi
+
+if [ $# -ne 0 ]; then
+    ARGS="$@"
+else
+    ARGS="discover"
+fi
+
+if [ "$HAVE_UNITTEST" != "yes" -o "$PYTHON_VER" == "2.6" ]; then
+    CMD="unit2"
+else
+    CMD="python -m unittest"
+fi
+
+LIST=($ARGS)
+
+PYTHONPATH=../../../src:../ $CMD $ARGS $OPTS
diff --git a/tests/test_libuser.py b/tests/test_libuser.py
new file mode 100644
index 0000000..59e3c45
--- /dev/null
+++ b/tests/test_libuser.py
@@ -0,0 +1,100 @@
+#
+# Project Ginger
+#
+# Copyright IBM, Corp. 2015
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+import crypt
+import spwd
+import unittest
+
+import models.users as users
+
+from kimchi.exception import OperationFailed
+from kimchi.rollbackcontext import RollbackContext
+
+class UserAdmTests(unittest.TestCase):
+
+    def test_get_users_list(self):
+        common_users = users.get_users()
+        self.assertGreaterEqual(len(common_users), 0)
+
+        all_users = users.get_users(exclude_system_users=False)
+        self.assertGreaterEqual(len(all_users), 1)
+
+        self.assertGreaterEqual(all_users, common_users)
+
+    def test_create_user(self):
+        user = 'unit_test_fake_user'
+        passwd = 'fakepass'
+
+        common_users = users.get_users()
+        with RollbackContext() as rollback:
+            users.create_user(user,passwd)

Insert a space between user and passwd

+ rollback.prependDefer(users.delete_user, user)
+
+            new_users = users.get_users()
+            self.assertEqual(len(new_users), len(common_users) +1)

Insert a space after '+' sign
+
+            enc_passwd = spwd.getspnam(user)[1]
+            invalid_passwd = [None, "NP", "!", "!!",  "", "LK", "*"]
+            self.assertNotIn(enc_passwd, invalid_passwd)
+
+ self.assertEqual(crypt.crypt(passwd, enc_passwd), enc_passwd)
+
+    def test_create_existing_user_fails(self):
+        user = 'unit_test_fake_user'
+        passwd = 'fakepass'
+
+        with RollbackContext() as rollback:
+            users.create_user(user,passwd)
+            rollback.prependDefer(users.delete_user, user)
+
+            with self.assertRaises(OperationFailed):
+                users.create_user(user,passwd)

Insert a space between user and passwd

+
+    def test_list_existing_groups(self):
+        groups = users.get_groups()
+        self.assertGreaterEqual(len(groups), 1)
+
+    def test_create_group(self):
+        groupname = 'unit_test_fake_group'
+        groups = users.get_groups()
+
+        with RollbackContext() as rollback:
+            users.create_group(groupname)
+            rollback.prependDefer(users.delete_group, groupname)
+
+            new_groups = users.get_groups()
+            self.assertEqual(len(new_groups), len(groups) + 1)
+
+    def test_add_user_to_primary_group(self):
+        user = 'unit_test_fake_user'
+        passwd = 'fakepass'
+        group = 'unit_test_fake_group'
+
+        with RollbackContext() as rollback:
+            users.create_group(group)
+            rollback.prependDefer(users.delete_group, group)
+
+            users.create_user(user,passwd)
+            rollback.prependDefer(users.delete_user, user)
+
+            users.add_user_to_primary_group(user, group)
+
+            users_group = users.get_users_from_group(group)
+            self.assertEqual(len(users_group), 1)
+            self.assertIn(user, users_group)
diff --git a/tests/test_user_model.py b/tests/test_user_model.py
new file mode 100644
index 0000000..efec45d
--- /dev/null
+++ b/tests/test_user_model.py
@@ -0,0 +1,79 @@
+#
+# Project Ginger
+#
+# Copyright IBM, Corp. 2015
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+import crypt
+import spwd
+import unittest
+
+from models.users import UserModel, UsersModel
+
+from kimchi.exception import OperationFailed
+from kimchi.rollbackcontext import RollbackContext
+
+class UserModelTests(unittest.TestCase):
+
+    def test_get_users_list(self):
+        model = UsersModel()
+        users = model.get_list()
+        self.assertGreaterEqual(len(users), 0)
+
+    def test_create_user(self):
+        users_model = UsersModel()
+        user_model = UserModel()
+
+        user = 'unit_test_fake_user'
+        passwd = 'fakepass'
+        group = 'unit_test_fake_group'
+        profile = 'unit_test_fake_profile'
+
+        common_users =  users_model.get_list()
+        params = {'name': user, 'password': passwd,
+                  'group': group, 'profile': profile}
+        with RollbackContext() as rollback:

Insert a blank line before 'with RollbackContext() as rollback:'

+
+            users_model.create(params)
+            rollback.prependDefer(user_model.delete, user)
+
+            new_users = users_model.get_list()
+            self.assertEqual(len(new_users), len(common_users) +1)

Insert a space after '+' sign
+
+            enc_passwd = spwd.getspnam(user)[1]
+            invalid_passwd = [None, "NP", "!", "!!",  "", "LK", "*"]
+            self.assertNotIn(enc_passwd, invalid_passwd)
+
+ self.assertEqual(crypt.crypt(passwd, enc_passwd), enc_passwd)
+
+    def test_creating_existing_user_fails(self):
+        users_model = UsersModel()
+        user_model = UserModel()
+
+        user = 'unit_test_fake_user'
+        passwd = 'fakepass'
+        group = 'unit_test_fake_group'
+        profile = 'unit_test_fake_profile'
+
+        params = {'name': user, 'password': passwd,
+                  'group': group, 'profile': profile}
+
+        with RollbackContext() as rollback:
+            users_model.create(params)
+            rollback.prependDefer(user_model.delete, user)
+
+            with self.assertRaises(OperationFailed):
+                users_model.create(params)






reply via email to

[Prev in Thread] Current Thread [Next in Thread]