Skip to content

Commit

Permalink
User: New fixture to test unix users
Browse files Browse the repository at this point in the history
  • Loading branch information
philpep committed May 20, 2015
1 parent 586656e commit 435aae3
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 1 deletion.
8 changes: 8 additions & 0 deletions doc/source/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,14 @@ File
:exclude-members: as_fixture


User
~~~~

.. autoclass:: testinfra.modules.User
:members:
:undoc-members:


Group
~~~~~

Expand Down
3 changes: 2 additions & 1 deletion testinfra/modules/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,10 @@
from testinfra.modules.package import Package
from testinfra.modules.service import Service
from testinfra.modules.systeminfo import SystemInfo
from testinfra.modules.user import User


__all__ = [
"Command", "File", "Package", "Group", "Interface",
"Service", "SystemInfo",
"Service", "SystemInfo", "User",
]
74 changes: 74 additions & 0 deletions testinfra/modules/user.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# -*- coding: utf8 -*-
# Copyright © 2015 Philippe Pepiot
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from __future__ import unicode_literals

from testinfra.modules.base import Module


class User(Module):
"""Test unix users
If name is not supplied, test the current user
"""

def __init__(self, name=None):
self._name = name
super(User, self).__init__()

@property
def name(self):
if self._name is None:
self._name = self.check_output("id -nu")
return self._name

@property
def exists(self):
return self.run_test("id %s", self.name).rc == 0

@property
def uid(self):
return int(self.check_output("id -u %s", self.name))

@property
def gid(self):
return int(self.check_output("id -g %s", self.name))

@property
def group(self):
return self.check_output("id -ng %s", self.name)

@property
def gids(self):
"""Return a list of user group id"""
return map(int, self.check_output("id -G %s", self.name).split(" "))

@property
def groups(self):
"""Return a list of user group names"""
return self.check_output("id -nG %s", self.name).split(" ")

@property
def home(self):
"""Return home directory"""
return self.check_output("getent passwd %s", self.name).split(":")[5]

@property
def shell(self):
"""Return login shell"""
return self.check_output("getent passwd %s", self.name).split(":")[6]

def __repr__(self):
return "<user %s>" % (self.name,)
1 change: 1 addition & 0 deletions testinfra/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
Command = modules.Command.as_fixture()
Service = modules.Service.as_fixture()
SystemInfo = modules.SystemInfo.as_fixture()
User = modules.User.as_fixture()


@pytest.fixture(scope="module")
Expand Down
21 changes: 21 additions & 0 deletions testinfra/test/integration/test_wheezy.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,24 @@ def test_systeminfo(SystemInfo):
assert SystemInfo.release == "7"
assert SystemInfo.distribution == "debian"
assert SystemInfo.codename is None


def test_user(User):
user = User("sshd")
assert user.exists
assert user.name == "sshd"
assert user.uid == 101
assert user.gid == 65534
assert user.group == "nogroup"
assert user.gids == [65534]
assert user.groups == ["nogroup"]
assert user.shell == "/usr/sbin/nologin"
assert user.home == "/var/run/sshd"


def test_nonexistent_user(User):
assert not User("zzzzzzzzzz").exists


def test_current_user(User):
assert User().name == "root"

0 comments on commit 435aae3

Please sign in to comment.