#!/usr/bin/env python
#
# Revelation 0.4.0 - a password manager for GNOME 2
# http://oss.codepoet.no/revelation/
# $Id$
#
# Unit tests for FPM datahandler module
#
#
# Copyright (c) 2003-2005 Erik Grinaker
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
import unittest, xml.dom.minidom
from revelation import data, datahandler, entry, util
class FPM(unittest.TestCase):
"FPM"
def test_attrs(self):
"FPM has sane attributes"
self.assertNotEqual(datahandler.FPM.name, "")
self.assertEqual(datahandler.FPM.importer, True)
self.assertEqual(datahandler.FPM.exporter, True)
self.assertEqual(datahandler.FPM.encryption, True)
class FPM_check(unittest.TestCase):
"FPM.check()"
def test_inv_baseattrs(self):
"FPM.check() raises FormatError on missing base attributes"
xml = """
"""
handler = datahandler.FPM()
self.assertRaises(datahandler.FormatError, handler.check, xml)
def test_inv_root(self):
"FPM.check() raises FormatError on wrong root element"
xml = """
"""
handler = datahandler.FPM()
self.assertRaises(datahandler.FormatError, handler.check, xml)
def test_inv_version(self):
"FPM.check() raises VersionError on invalid version"
xml = """
"""
handler = datahandler.FPM()
self.assertRaises(datahandler.VersionError, handler.check, xml)
def test_inv_version_format(self):
"FPM.check() raises FormatError on invalid version format"
xml = """
"""
handler = datahandler.FPM()
self.assertRaises(datahandler.FormatError, handler.check, xml)
def test_inv_xml(self):
"FPM.check() raises FormatError on invalid XML"
xml = """
"""
handler = datahandler.FPM()
self.assertRaises(datahandler.FormatError, handler.check, xml)
def test_none(self):
"FPM.check() raises FormatError on None"
handler = datahandler.FPM()
self.assertRaises(datahandler.FormatError, handler.check, None)
def test_valid(self):
"FPM.check() accepts valid data"
xml = """
"""
handler = datahandler.FPM()
handler.check(xml)
class FPM_detect(unittest.TestCase):
"FPM.detect()"
def test_inv(self):
"FPM.detect() rejects invalid data"
handler = datahandler.FPM()
self.assertEqual(handler.detect("dummydata"), False)
def test_inv_version(self):
"FPM.detect() rejects invalid version"
xml = """
"""
handler = datahandler.FPM()
self.assertEqual(handler.detect(xml), False)
def test_none(self):
"FPM.detect() rejects None"
handler = datahandler.FPM()
self.assertEqual(handler.detect(None), False)
def test_valid(self):
"FPM.detect() accepts valid data"
xml = """
"""
handler = datahandler.FPM()
self.assertEqual(handler.detect(xml), True)
class FPM_export_data(unittest.TestCase):
"FPM.export_data()"
def test_valid(self):
"FPM.export_data() generates valid data"
# set up data
entrystore = data.EntryStore()
e = entry.FolderEntry()
e.name = "Testfolder"
e.description = "Just a test folder"
folderiter = entrystore.add_entry(e)
e = entry.GenericEntry()
e.name = "Generic child"
e.description = "Child-entry"
e.get_field(entry.HostnameField).value = "www.slashdot.org"
e.get_field(entry.UsernameField).value = "erikg"
e.get_field(entry.PasswordField).value = "test123"
entrystore.add_entry(e, folderiter)
e = entry.WebEntry()
e.name = "A website entry"
e.get_field(entry.URLField).value = "http://www.kuro5hin.org/"
e.get_field(entry.UsernameField).value = "egrinake"
e.get_field(entry.PasswordField).value = "pwtest"
entrystore.add_entry(e)
# test the export
handler = datahandler.FPM()
fpmdata = handler.export_data(entrystore, "test")
dom = xml.dom.minidom.parseString(fpmdata)
itemnodes = dom.getElementsByTagName("PasswordItem")
entrydata = {}
for childnode in [ node for node in itemnodes[0].childNodes if node.nodeType == node.ELEMENT_NODE ]:
entrydata[childnode.nodeName] = util.dom_text(childnode)
fe = entrystore.get_entry(folderiter)
e = entrystore.get_entry(entrystore.iter_nth_child(folderiter, 0))
self.assertEqual(e.name, entrydata["title"])
self.assertEqual(e.description, entrydata["notes"])
self.assertEqual(fe.name, entrydata["category"])
self.assertEqual(e.get_field(entry.HostnameField).value, entrydata["url"])
self.assertEqual(e.get_field(entry.UsernameField).value, entrydata["user"])
self.assertEqual(e.get_field(entry.PasswordField).value, entrydata["password"])
entrydata = {}
for childnode in [ node for node in itemnodes[1].childNodes if node.nodeType == node.ELEMENT_NODE ]:
entrydata[childnode.nodeName] = util.dom_text(childnode)
e = entrystore.get_entry(entrystore.iter_nth_child(None, 1))
self.assertEqual(e.name, entrydata["title"])
self.assertEqual(e.description, entrydata["notes"])
self.assertEqual("", entrydata["category"])
self.assertEqual(e.get_field(entry.URLField).value, entrydata["url"])
self.assertEqual(e.get_field(entry.UsernameField).value, entrydata["user"])
self.assertEqual(e.get_field(entry.PasswordField).value, entrydata["password"])
class FPM_import_data(unittest.TestCase):
"FPM.import_data()"
def test_inv_password(self):
"FPM.import_data() raises PasswordError on invalid password"
xml = """
"""
handler = datahandler.FPM()
self.assertRaises(datahandler.PasswordError, handler.import_data, xml, "wrongpw")
def test_nodata(self):
"FPM.import_data() handles empty data"
xml = """
"""
handler = datahandler.FPM()
handler.import_data(xml, "test")
def test_none(self):
"FPM.import_data() raises FormatError on None"
handler = datahandler.FPM()
self.assertRaises(datahandler.FormatError, handler.import_data, None, "test")
def test_valid(self):
"FPM.import_data() accepts valid data"
xml = """
Webgnome-moz-remote "$a"21
sshgnome-terminal -e 'ssh $a -l $u'01
Generic Command$a00
noogeghgacbjkembbkcndhfmnpomakaolidannbdlfpgbbhmhcfkjcnegceimapinhdlpgkdickpaoafapcflihmlfopckkapnaolgoglkfmkpjgdnijaohfckjnddgpggjhfiienhgccmejnpbgddffgkiflhocilchedanbdecjfpnpmmjapijikapecnjfgaheppnjkhiacdmkndocanomelohfhadcmhcdddcjdmghaoicogbopbgchbnakiombpmbmlgkillcebkcpjpdcpdmalcgkccmmfbpeikhlfbacmlogopgdilpndajkbhhiflmbgblkonhpldfihmooajlodnogikgiehkaneeecfblaclikhedihkfhcpdalmaphohijmfaagliladeecchlbfbokfeikjbbpcgaegcjplpcalembmigjppbjlolbcempdpoibgiblhgmcbpmidbnickamieedfgigeenpmaoflmaddhoemmpbiplpgnnfamcebhompngcdpfonpkgnfkpgdognneongealocmfimfdnpcgjppmndhcfcnabjfmpehlfpfjanmjccfelbjfdlgldiimnahjjhfcmlgbjnpkiihkgjebgnghghhmgjnkbgnchgehiajbdnajoaniehgnljed
kofckpmcobmpoiamdhhogkdinpkihfkhpaljgfjdncoelohfiamoledhnphfppocmccppepcflkinibbhlfpbfgifpijdceeohkacpbdkjcpmlnjjpcdkgikeoojckbahdjdnhfpebmbndmbcajnajpfgdpfjemjnmeleaenkmmnonpelajpempdacmgmflnpcccafgagacmnkkiknbdkcfmbelgpdemcpojgibjoiiaccncjhleebhfgodknfajemlmidcnicppfkhkmbacmfpgkheplcjaejgmkokilfcclenfjinmlaijnahjbhiafjkcjnfffknahgifjhcmdlmgjggjdcojnhoadjaeobjjgpgicopmkckkaonbccopcocdbemdocingpeiehaocdmkkclpklegabpobjalijehnmfklicldndpcenbklnobjcjeeigknodicmlffnejfgcbhedmogipbfbfobmcaeoodpgnojbjfcpjdljgmbdingphkjeibpcomgfdgknigejailonledhgnmopcpocaiammlldkfgankgjheioaaejffmohhefgiagkflaednjogjogknchnjgfjkidkhheclllhnjpmfmbdaohdckpgapbgmkjpbpibfnkfakckalefcipcmfahhljcdkmdppdnbkaefcdlpcjjhhmlcginkgalgbjejfamgdbophmnfgmbhmnjanbc
"""
handler = datahandler.FPM()
entrystore = handler.import_data(xml, "test")
folderiter = entrystore.iter_nth_child(None, 0)
folderentry = entrystore.get_entry(folderiter)
self.assertEqual(type(folderentry), entry.FolderEntry)
self.assertEqual(folderentry.name, "web")
self.assertNotEqual(folderentry.updated, 0)
e = entrystore.get_entry(entrystore.iter_nth_child(folderiter, 0))
self.assertEqual(type(e), entry.GenericEntry)
self.assertEqual(e.name, "kuro5hin")
self.assertEqual(e.description, "")
self.assertNotEqual(e.updated, 0)
self.assertEqual(e.get_field(entry.UsernameField).value, "egrinake")
self.assertEqual(e.get_field(entry.HostnameField).value, "www.kuro5hin.org")
self.assertEqual(e.get_field(entry.PasswordField).value, "jeje")
e = entrystore.get_entry(entrystore.iter_nth_child(folderiter, 1))
self.assertEqual(type(e), entry.GenericEntry)
self.assertEqual(e.name, "slashdot")
self.assertEqual(e.description, "Username and password for /.")
self.assertNotEqual(e.updated, 0)
self.assertEqual(e.get_field(entry.UsernameField).value, "erikg")
self.assertEqual(e.get_field(entry.HostnameField).value, "http://www.slashdot.org/")
self.assertEqual(e.get_field(entry.PasswordField).value, "test")
if __name__ == "__main__":
unittest.main()