Browse Source

Merge pull request #479 from meolu/2.0/feature/unittest

2.0/feature/unittest
huamanshu 6 years ago
parent
commit
740cd3002b
7 changed files with 51 additions and 67 deletions
  1. 2 0
      README.md
  2. 21 60
      tests/test_00_base.py
  3. 12 3
      tests/test_05_api_space.py
  4. 1 1
      tests/test_07_api_project.py
  5. 3 1
      walle/app.py
  6. 9 2
      walle/model/user.py
  7. 3 0
      walle/service/rbac/role.py

+ 2 - 0
README.md

@@ -2,6 +2,8 @@
 
 Walle 2.0 - [官方主页](https://www.walle-web.io) 
 =========================
+[![Build Status](https://travis-ci.org/meolu/walle-web.svg?branch=master)](https://travis-ci.org/meolu/walle-web)
+
 功能强大,且免费开源的`walle-web 瓦力`终于更新`2.0`了!占用了我几乎所有业余时间,望各位喜欢 `star` 以示感谢。目前 `2.0` 预览版尚未达到完全企业可用状态,请保持关注,我会在公众号更新(在最下面)。
 老版本已迁移到 [walle 1.x](https://github.com/meolu/walle-web-v1.x) 的同学**务必不要再更新了**,两个版本不兼容。
 

+ 21 - 60
tests/test_00_base.py

@@ -1,17 +1,23 @@
 # -*- coding: utf-8 -*-
 """Model unit tests."""
 
+from copy import deepcopy
+
 import pytest
 from walle.model.user import MenuModel
-from walle.model.user import RoleModel
 from walle.model.user import UserModel
 from werkzeug.security import generate_password_hash
-from copy import deepcopy
+from walle.service.rbac.role import *
+
 user_data_login = {
     'username': u'wushuiyong',
     'email': u'wushuiyong@walle-web.io',
     'password': u'WU123shuiyong',
 }
+space_base = {
+    'name': u'walle-2.0',
+    'user_id': u'1',
+}
 
 
 @pytest.mark.usefixtures('db')
@@ -513,66 +519,21 @@ class TestAccess:
             )
             access.save()
 
+
 class TestUser:
-    user_data_login = deepcopy(user_data_login)
-    def test_add(self):
+    user_super_login = deepcopy(user_data_login)
 
-        self.user_data_login['password'] = generate_password_hash(user_data_login['password'])
-        user = UserModel(**self.user_data_login)
+    def test_add(self):
+        self.user_super_login['role'] = SUPER
+        self.user_super_login['password'] = generate_password_hash(self.user_super_login['password'])
+        user = UserModel(**self.user_super_login)
         user.save()
 
-        # class TestUser:
-        #     """User tests."""
-        #
-        #     def test_get_by_id(self):
-        #         """Get user by ID."""
-        #         user = Foo(username='wushuiyongoooo', email='wushuiyong@mail.com')
-        #         user.save()
-        #
-        #         retrieved = User.get_by_id(user.id)
-        #         assert retrieved == user
 
-        # def test_created_at_defaults_to_datetime(self):
-        #     """Test creation date."""
-        #     user = User(username='foo', email='foo@bar.com')
-        #     user.save()
-        #     assert bool(user.created_at)
-        #     assert isinstance(user.created_at, dt.datetime)
-        #
-        # def test_password_is_nullable(self):
-        #     """Test null password."""
-        #     user = User(username='foo', email='foo@bar.com')
-        #     user.save()
-        #     assert user.password is None
-        #
-        # def test_factory(self, db):
-        #     """Test user factory."""
-        #     user = UserFactory(password='myprecious')
-        #     db.session.commit()
-        #     assert bool(user.username)
-        #     assert bool(user.email)
-        #     assert bool(user.created_at)
-        #     assert user.is_admin is False
-        #     assert user.active is True
-        #     assert user.check_password('myprecious')
-        #
-        # def test_check_password(self):
-        #     """Check password."""
-        #     user = User.create(username='foo', email='foo@bar.com',
-        #                        password='foobarbaz123')
-        #     assert user.check_password('foobarbaz123') is True
-        #     assert user.check_password('barfoobaz') is False
-        #
-        # def test_full_name(self):
-        #     """User full name."""
-        #     user = UserFactory(first_name='Foo', last_name='Bar')
-        #     assert user.full_name == 'Foo Bar'
-        #
-        # def test_roles(self):
-        #     """Add a role to a user."""
-        #     role = Role(name='admin')
-        #     role.save()
-        #     user = UserFactory()
-        #     user.roles.append(role)
-        #     user.save()
-        #     assert role in user.roles
+# class TestSpace:
+#     user_data_login = deepcopy(user_data_login)
+#
+#     def test_add(self):
+#         self.user_data_login['password'] = generate_password_hash(user_data_login['password'])
+#         user = UserModel(**self.user_data_login)
+#         user.save()

+ 12 - 3
tests/test_05_api_space.py

@@ -12,10 +12,11 @@ class TestApiSpace:
 
     user_id = {}
 
+    #: user list (1, 2, 3)
     space_data = {
         'name': u'大数据',
         'user_id': u'1',
-        'members': json.dumps([{"user_id": 1, "role": "MASTER"}, {"user_id": 2, "role": "DEVELOPER"}, {"user_id": 3, "role": "DEVELOPER"}]),
+        'members': json.dumps([{"user_id": 2, "role": "MASTER"}, {"user_id": 3, "role": "DEVELOPER"}]),
     }
 
     space_name_2 = u'瓦力'
@@ -23,13 +24,13 @@ class TestApiSpace:
     space_data_2 = {
         'name': u'瓦力',
         'user_id': u'2',
-        'members': json.dumps([{"user_id": 1, "role": "MASTER"}, {"user_id": 2, "role": "DEVELOPER"}, {"user_id": 4, "role": "DEVELOPER"}]),
+        'members': json.dumps([{"user_id": 3, "role": "MASTER"}, {"user_id": 1, "role": "DEVELOPER"}]),
     }
 
     space_data_remove = {
         'name': u'瓦尔登',
         'user_id': u'2',
-        'members': json.dumps([{"user_id": 1, "role": "MASTER"}, {"user_id": 2, "role": "DEVELOPER"}]),
+        'members': json.dumps([{"user_id": 1, "role": "MASTER"}, {"user_id": 3, "role": "DEVELOPER"}]),
     }
 
     def test_create(self, user, testapp, client, db):
@@ -114,6 +115,14 @@ class TestApiSpace:
     def test_get_update(self, user, testapp, client):
         """Login successful."""
         # 1.update
+        space_data = self.space_data
+        space_data['name'] = u'大数据平台'
+        resp = client.put('%s/%d' % (self.uri_prefix, self.space_data['space_id']), data=space_data)
+
+        response_success(resp)
+        self.compare_member_req_resp(self.space_data, resp)
+
+        # 1.update
         space_data_2 = self.space_data_2
         space_data_2['name'] = u'瓦力2.0'
         resp = client.put('%s/%d' % (self.uri_prefix, self.space_data_2['space_id']), data=space_data_2)

+ 1 - 1
tests/test_07_api_project.py

@@ -38,7 +38,7 @@ class TestApiProject:
     }
 
     project_data_members = [
-        {"user_id": 1, "role": "MASTER"},
+        {"user_id": 3, "role": "MASTER"},
         {"user_id": 2, "role": "DEVELOPER"}
     ]
 

+ 3 - 1
walle/app.py

@@ -63,7 +63,9 @@ def create_app(config_object=ProdConfig):
     def index():
         return render_template('socketio.html')
 
-    register_socketio(app)
+    # 单元测试不用开启 websocket
+    if app.config.get('ENV') <> 'test':
+        register_socketio(app)
 
     reload(sys)
     sys.setdefaultencoding('utf-8')

+ 9 - 2
walle/model/user.py

@@ -273,13 +273,18 @@ class UserModel(UserMixin, SurrogatePK, Model):
 
     @classmethod
     def fresh_session(cls):
+        # 0.超管
+        if current_user.role == SUPER:
+            return True
+
         spaces = current_user.has_spaces()
 
-        # 1.无空间权限
-        if not spaces:
+        # 1.无空间权限且非超管
+        if not spaces and current_user.role <> SUPER:
             raise WalleError(Code.space_empty)
 
         default_space = spaces.keys()[0]
+
         # 2.第一次登录无空间
         if not current_user.last_space:
             current_user.last_space = default_space
@@ -665,6 +670,8 @@ class MemberModel(SurrogatePK, Model):
         for member in members:
             user_update.append(member['user_id'])
 
+        current_app.logger.info(group_model['user_ids'])
+        current_app.logger.info(user_update)
         # project新增用户是否在space's group中,无则抛出
         if list(set(user_update).difference(set(group_model['user_ids']))):
             raise ValueError('用户不存在')

+ 3 - 0
walle/service/rbac/role.py

@@ -116,6 +116,9 @@ class Permission():
         :param role:
         :return:
         '''
+        if current_user.role == SUPER:
+            return True
+
         # TODO about project/task
         current_role = session['space_info']['role']
         return self.compare_role(current_role, role)