Permalink
Fetching contributors…
Cannot retrieve contributors at this time
535 lines (449 sloc) 23.6 KB
# -*- coding: utf-8 -*-
import os
import sys
import stat
import bagit
import codecs
import shutil
import hashlib
import logging
import datetime
import tempfile
import unittest
from os.path import join as j
# don't let < ERROR clutter up test output
logging.basicConfig(filename="test.log", level=logging.DEBUG)
class TestSingleProcessValidation(unittest.TestCase):
def setUp(self):
self.tmpdir = tempfile.mkdtemp()
if os.path.isdir(self.tmpdir):
shutil.rmtree(self.tmpdir)
shutil.copytree('test-data', self.tmpdir)
def tearDown(self):
if os.path.isdir(self.tmpdir):
shutil.rmtree(self.tmpdir)
def validate(self, bag, *args, **kwargs):
return bag.validate(*args, **kwargs)
def test_make_bag_sha1_sha256_manifest(self):
bag = bagit.make_bag(self.tmpdir, checksum=['sha1', 'sha256'])
# check that relevant manifests are created
self.assertTrue(os.path.isfile(j(self.tmpdir, 'manifest-sha1.txt')))
self.assertTrue(os.path.isfile(j(self.tmpdir, 'manifest-sha256.txt')))
# check valid with two manifests
self.assertTrue(self.validate(bag, fast=True))
def test_make_bag_md5_sha256_manifest(self):
bag = bagit.make_bag(self.tmpdir, checksum=['md5', 'sha256'])
# check that relevant manifests are created
self.assertTrue(os.path.isfile(j(self.tmpdir, 'manifest-md5.txt')))
self.assertTrue(os.path.isfile(j(self.tmpdir, 'manifest-sha256.txt')))
# check valid with two manifests
self.assertTrue(self.validate(bag, fast=True))
def test_make_bag_md5_sha1_sha256_manifest(self):
bag = bagit.make_bag(self.tmpdir, checksum=['md5', 'sha1', 'sha256'])
# check that relevant manifests are created
self.assertTrue(os.path.isfile(j(self.tmpdir, 'manifest-md5.txt')))
self.assertTrue(os.path.isfile(j(self.tmpdir, 'manifest-sha1.txt')))
self.assertTrue(os.path.isfile(j(self.tmpdir, 'manifest-sha256.txt')))
# check valid with three manifests
self.assertTrue(self.validate(bag, fast=True))
def test_validate_flipped_bit(self):
bag = bagit.make_bag(self.tmpdir)
readme = j(self.tmpdir, "data", "README")
with open(readme) as r:
txt = r.read()
txt = 'A' + txt[1:]
with open(readme, "w") as r:
r.write(txt)
bag = bagit.Bag(self.tmpdir)
self.assertRaises(bagit.BagValidationError, self.validate, bag)
# fast doesn't catch the flipped bit, since oxsum is the same
self.assertTrue(self.validate(bag, fast=True))
def test_validate_fast(self):
bag = bagit.make_bag(self.tmpdir)
self.assertEqual(self.validate(bag, fast=True), True)
os.remove(j(self.tmpdir, "data", "loc",
"2478433644_2839c5e8b8_o_d.jpg"))
self.assertRaises(bagit.BagValidationError, self.validate, bag, fast=True)
def test_validate_fast_without_oxum(self):
bag = bagit.make_bag(self.tmpdir)
os.remove(j(self.tmpdir, "bag-info.txt"))
bag = bagit.Bag(self.tmpdir)
self.assertRaises(bagit.BagValidationError, self.validate, bag, fast=True)
def test_validate_slow_without_oxum_extra_file(self):
bag = bagit.make_bag(self.tmpdir)
os.remove(j(self.tmpdir, "bag-info.txt"))
with open(j(self.tmpdir, "data", "extra_file"), "w") as ef:
ef.write("foo")
bag = bagit.Bag(self.tmpdir)
self.assertRaises(bagit.BagValidationError, self.validate, bag, fast=False)
def test_validation_error_details(self):
bag = bagit.make_bag(self.tmpdir)
readme = j(self.tmpdir, "data", "README")
with open(readme) as r:
txt = r.read()
txt = 'A' + txt[1:]
with open(readme, "w") as r:
r.write(txt)
extra_file = j(self.tmpdir, "data", "extra")
with open(extra_file, "w") as ef:
ef.write('foo')
# remove the bag-info.txt which contains the oxum to force a full
# check of the manifest
os.remove(j(self.tmpdir, "bag-info.txt"))
bag = bagit.Bag(self.tmpdir)
got_exception = False
try:
self.validate(bag)
except bagit.BagValidationError as e:
got_exception = True
self.assertTrue("invalid bag: bag-info.txt exists in manifest but not found on filesystem" in str(e))
self.assertTrue("data/extra exists on filesystem but is not in manifest" in str(e))
self.assertTrue("data/README checksum validation failed (alg=md5 expected=8e2af7a0143c7b8f4de0b3fc90f27354 found=fd41543285d17e7c29cd953f5cf5b955)" in str(e))
self.assertTrue("bag-info.txt checksum validation failed (alg=md5 expected=aeba487217e50cc9c63ac5f90a0b87cb found=%s does not exist)" % j(self.tmpdir, "bag-info.txt"))
self.assertEqual(len(e.details), 4)
error = e.details[0]
self.assertEqual(str(error), "bag-info.txt exists in manifest but not found on filesystem")
self.assertTrue(isinstance(error, bagit.FileMissing))
self.assertEqual(error.path, "bag-info.txt")
error = e.details[1]
self.assertEqual(str(error), "data/extra exists on filesystem but is not in manifest")
self.assertTrue(isinstance(error, bagit.UnexpectedFile))
self.assertEqual(error.path, "data/extra")
if e.details[2].path == 'data/README':
readme_error = e.details[2]
baginfo_error = e.details[3]
else:
readme_error = e.details[3]
baginfo_error = e.details[2]
self.assertEqual(str(readme_error), "data/README checksum validation failed (alg=md5 expected=8e2af7a0143c7b8f4de0b3fc90f27354 found=fd41543285d17e7c29cd953f5cf5b955)")
self.assertTrue(isinstance(readme_error, bagit.ChecksumMismatch))
self.assertEqual(readme_error.algorithm, 'md5')
self.assertEqual(readme_error.path, 'data/README')
self.assertEqual(readme_error.expected, '8e2af7a0143c7b8f4de0b3fc90f27354')
self.assertEqual(readme_error.found, 'fd41543285d17e7c29cd953f5cf5b955')
# cannot test full value of baginfo error as it contains random name for tmp dir
self.assertTrue("bag-info.txt does not exist" in str(baginfo_error))
self.assertTrue(isinstance(baginfo_error, bagit.ChecksumMismatch))
self.assertEqual(baginfo_error.algorithm, 'md5')
self.assertEqual(baginfo_error.path, 'bag-info.txt')
self.assertTrue("bag-info.txt does not exist" in baginfo_error.found)
if not got_exception:
self.fail("didn't get BagValidationError")
def test_bom_in_bagit_txt(self):
bag = bagit.make_bag(self.tmpdir)
BOM = codecs.BOM_UTF8
if sys.version_info[0] >= 3:
BOM = BOM.decode('utf-8')
with open(j(self.tmpdir, "bagit.txt"), "r") as bf:
bagfile = BOM + bf.read()
with open(j(self.tmpdir, "bagit.txt"), "w") as bf:
bf.write(bagfile)
bag = bagit.Bag(self.tmpdir)
self.assertRaises(bagit.BagValidationError, self.validate, bag)
def test_missing_file(self):
bag = bagit.make_bag(self.tmpdir)
os.remove(j(self.tmpdir, 'data', 'loc', '3314493806_6f1db86d66_o_d.jpg'))
self.assertRaises(bagit.BagValidationError, self.validate, bag)
def test_handle_directory_end_slash_gracefully(self):
bag = bagit.make_bag(self.tmpdir + '/')
self.assertTrue(self.validate(bag))
bag2 = bagit.Bag(self.tmpdir + '/')
self.assertTrue(self.validate(bag2))
def test_allow_extraneous_files_in_base(self):
bag = bagit.make_bag(self.tmpdir)
self.assertTrue(self.validate(bag))
f = j(self.tmpdir, "IGNOREFILE")
with open(f, 'w') as whatever:
self.assertTrue(self.validate(bag))
def test_allow_extraneous_dirs_in_base(self):
bag = bagit.make_bag(self.tmpdir)
self.assertTrue(self.validate(bag))
d = j(self.tmpdir, "IGNOREDIR")
os.mkdir(d)
self.assertTrue(self.validate(bag))
def test_missing_tagfile_raises_error(self):
bag = bagit.make_bag(self.tmpdir)
self.assertTrue(self.validate(bag))
os.remove(j(self.tmpdir, "bagit.txt"))
self.assertRaises(bagit.BagValidationError, self.validate, bag)
def test_missing_manifest_raises_error(self):
bag = bagit.make_bag(self.tmpdir)
self.assertTrue(self.validate(bag))
os.remove(j(self.tmpdir, "manifest-md5.txt"))
self.assertRaises(bagit.BagValidationError, self.validate, bag)
def test_mixed_case_checksums(self):
bag = bagit.make_bag(self.tmpdir)
hashstr = {}
#Extract entries only for the payload and ignore
# entries from the tagmanifest file
for key in bag.entries.keys():
if key.startswith('data' + os.sep):
hashstr = bag.entries[key]
hashstr = next(iter(hashstr.values()))
with open(j(self.tmpdir, "manifest-md5.txt"), "r") as m:
manifest = m.read()
manifest = manifest.replace(hashstr, hashstr.upper())
with open(j(self.tmpdir, "manifest-md5.txt"), "w") as m:
m.write(manifest)
#Since manifest-md5.txt file is updated, re-calculate its
# md5 checksum and update it in the tagmanifest-md5.txt file
hasher = hashlib.new('md5')
with open(j(self.tmpdir, "manifest-md5.txt"), "r") as manifest:
contents = manifest.read().encode('utf-8')
hasher.update(contents)
with open(j(self.tmpdir, "tagmanifest-md5.txt"), "r") as tagmanifest:
tagman_contents = tagmanifest.read()
tagman_contents = tagman_contents.replace(
bag.entries['manifest-md5.txt']['md5'], hasher.hexdigest())
with open(j(self.tmpdir, "tagmanifest-md5.txt"), "w") as tagmanifest:
tagmanifest.write(tagman_contents)
bag = bagit.Bag(self.tmpdir)
self.assertTrue(self.validate(bag))
def test_multiple_oxum_values(self):
bag = bagit.make_bag(self.tmpdir)
with open(j(self.tmpdir, "bag-info.txt"), "a") as baginfo:
baginfo.write('Payload-Oxum: 7.7\n')
bag = bagit.Bag(self.tmpdir)
self.assertTrue(self.validate(bag, fast=True))
def test_validate_optional_tagfile(self):
bag = bagit.make_bag(self.tmpdir)
tagdir = tempfile.mkdtemp(dir=self.tmpdir)
with open(j(tagdir, "tagfile"), "w") as tagfile:
tagfile.write("test")
relpath = j(tagdir, "tagfile").replace(self.tmpdir + os.sep, "")
relpath.replace("\\", "/")
with open(j(self.tmpdir, "tagmanifest-md5.txt"), "w") as tagman:
# Incorrect checksum.
tagman.write("8e2af7a0143c7b8f4de0b3fc90f27354 " + relpath + "\n")
bag = bagit.Bag(self.tmpdir)
self.assertRaises(bagit.BagValidationError, self.validate, bag)
hasher = hashlib.new("md5")
with open(j(tagdir, "tagfile"), "r") as tf:
contents = tf.read().encode('utf-8')
hasher.update(contents)
with open(j(self.tmpdir, "tagmanifest-md5.txt"), "w") as tagman:
tagman.write(hasher.hexdigest() + " " + relpath + "\n")
bag = bagit.Bag(self.tmpdir)
self.assertTrue(self.validate(bag))
# Missing tagfile.
os.remove(j(tagdir, "tagfile"))
bag = bagit.Bag(self.tmpdir)
self.assertRaises(bagit.BagValidationError, self.validate, bag)
def test_sha1_tagfile(self):
info = {'Bagging-Date': '1970-01-01', 'Contact-Email': 'ehs@pobox.com'}
bag = bagit.make_bag(self.tmpdir, checksum=['sha1'], bag_info=info)
self.assertTrue(os.path.isfile(j(self.tmpdir, 'tagmanifest-sha1.txt')))
self.assertEqual(bag.entries['bag-info.txt']['sha1'], 'd7f086508df433e5d7464b5a3835d5501df14404')
def test_validate_unreadable_file(self):
bag = bagit.make_bag(self.tmpdir, checksum=["md5"])
os.chmod(j(self.tmpdir, "data/loc/2478433644_2839c5e8b8_o_d.jpg"), 0)
self.assertRaises(bagit.BagValidationError, self.validate, bag, fast=False)
class TestMultiprocessValidation(TestSingleProcessValidation):
def validate(self, bag, *args, **kwargs):
return super(TestMultiprocessValidation, self).validate(bag, *args, processes=2, **kwargs)
class TestBag(unittest.TestCase):
def setUp(self):
self.tmpdir = tempfile.mkdtemp()
if os.path.isdir(self.tmpdir):
shutil.rmtree(self.tmpdir)
shutil.copytree('test-data', self.tmpdir)
def tearDown(self):
if os.path.isdir(self.tmpdir):
shutil.rmtree(self.tmpdir)
def test_make_bag(self):
info = {'Bagging-Date': '1970-01-01', 'Contact-Email': 'ehs@pobox.com'}
bag = bagit.make_bag(self.tmpdir, bag_info=info)
# data dir should've been created
self.assertTrue(os.path.isdir(j(self.tmpdir, 'data')))
# check bagit.txt
self.assertTrue(os.path.isfile(j(self.tmpdir, 'bagit.txt')))
with open(j(self.tmpdir, 'bagit.txt')) as b:
bagit_txt = b.read()
self.assertTrue('BagIt-Version: 0.97' in bagit_txt)
self.assertTrue('Tag-File-Character-Encoding: UTF-8' in bagit_txt)
# check manifest
self.assertTrue(os.path.isfile(j(self.tmpdir, 'manifest-md5.txt')))
with open(j(self.tmpdir, 'manifest-md5.txt')) as m:
manifest_txt = m.read()
self.assertTrue('8e2af7a0143c7b8f4de0b3fc90f27354 data/README' in manifest_txt)
self.assertTrue('9a2b89e9940fea6ac3a0cc71b0a933a0 data/loc/2478433644_2839c5e8b8_o_d.jpg' in manifest_txt)
self.assertTrue('6172e980c2767c12135e3b9d246af5a3 data/loc/3314493806_6f1db86d66_o_d.jpg' in manifest_txt)
self.assertTrue('38a84cd1c41de793a0bccff6f3ec8ad0 data/si/2584174182_ffd5c24905_b_d.jpg' in manifest_txt)
self.assertTrue('5580eaa31ad1549739de12df819e9af8 data/si/4011399822_65987a4806_b_d.jpg' in manifest_txt)
# check bag-info.txt
self.assertTrue(os.path.isfile(j(self.tmpdir, 'bag-info.txt')))
with open(j(self.tmpdir, 'bag-info.txt')) as bi:
bag_info_txt = bi.read()
self.assertTrue('Contact-Email: ehs@pobox.com' in bag_info_txt)
self.assertTrue('Bagging-Date: 1970-01-01' in bag_info_txt)
self.assertTrue('Payload-Oxum: 991765.5' in bag_info_txt)
self.assertTrue('Bag-Software-Agent: bagit.py <http://github.com/libraryofcongress/bagit-python>' in bag_info_txt)
# check tagmanifest-md5.txt
self.assertTrue(os.path.isfile(j(self.tmpdir, 'tagmanifest-md5.txt')))
with open(j(self.tmpdir, 'tagmanifest-md5.txt')) as tm:
tagmanifest_txt = tm.read()
self.assertTrue('9e5ad981e0d29adc278f6a294b8c2aca bagit.txt' in tagmanifest_txt)
self.assertTrue('a0ce6631a2a6d1a88e6d38453ccc72a5 manifest-md5.txt' in tagmanifest_txt)
self.assertTrue('6a5090e27cb29d5dda8a0142fbbdf37e bag-info.txt' in tagmanifest_txt)
def test_make_bag_sha1_manifest(self):
bag = bagit.make_bag(self.tmpdir, checksum=['sha1'])
# check manifest
self.assertTrue(os.path.isfile(j(self.tmpdir, 'manifest-sha1.txt')))
with open(j(self.tmpdir, 'manifest-sha1.txt')) as m:
manifest_txt = m.read()
self.assertTrue('ace19416e605cfb12ab11df4898ca7fd9979ee43 data/README' in manifest_txt)
self.assertTrue('4c0a3da57374e8db379145f18601b159f3cad44b data/loc/2478433644_2839c5e8b8_o_d.jpg' in manifest_txt)
self.assertTrue('62095aeddae2f3207cb77c85937e13c51641ef71 data/loc/3314493806_6f1db86d66_o_d.jpg' in manifest_txt)
self.assertTrue('e592194b3733e25166a631e1ec55bac08066cbc1 data/si/2584174182_ffd5c24905_b_d.jpg' in manifest_txt)
self.assertTrue('db49ef009f85a5d0701829f38d29f8cf9c5df2ea data/si/4011399822_65987a4806_b_d.jpg' in manifest_txt)
def test_make_bag_sha256_manifest(self):
bag = bagit.make_bag(self.tmpdir, checksum=['sha256'])
# check manifest
self.assertTrue(os.path.isfile(j(self.tmpdir, 'manifest-sha256.txt')))
with open(j(self.tmpdir, 'manifest-sha256.txt')) as m:
manifest_txt = m.read()
self.assertTrue('b6df8058fa818acfd91759edffa27e473f2308d5a6fca1e07a79189b95879953 data/loc/2478433644_2839c5e8b8_o_d.jpg' in manifest_txt)
self.assertTrue('1af90c21e72bb0575ae63877b3c69cfb88284f6e8c7820f2c48dc40a08569da5 data/loc/3314493806_6f1db86d66_o_d.jpg' in manifest_txt)
self.assertTrue('f065a4ae2bc5d47c6d046c3cba5c8cdfd66b07c96ff3604164e2c31328e41c1a data/si/2584174182_ffd5c24905_b_d.jpg' in manifest_txt)
self.assertTrue('45d257c93e59ec35187c6a34c8e62e72c3e9cfbb548984d6f6e8deb84bac41f4 data/si/4011399822_65987a4806_b_d.jpg' in manifest_txt)
def test_make_bag_sha512_manifest(self):
bag = bagit.make_bag(self.tmpdir, checksum=['sha512'])
# check manifest
self.assertTrue(os.path.isfile(j(self.tmpdir, 'manifest-sha512.txt')))
with open(j(self.tmpdir, 'manifest-sha512.txt')) as m:
manifest_txt = m.read()
self.assertTrue('51fb9236a23795886cf42d539d580739245dc08f72c3748b60ed8803c9cb0e2accdb91b75dbe7d94a0a461827929d720ef45fe80b825941862fcde4c546a376d data/loc/2478433644_2839c5e8b8_o_d.jpg' in manifest_txt)
self.assertTrue('627c15be7f9aabc395c8b2e4c3ff0b50fd84b3c217ca38044cde50fd4749621e43e63828201fa66a97975e316033e4748fb7a4a500183b571ecf17715ec3aea3 data/loc/3314493806_6f1db86d66_o_d.jpg' in manifest_txt)
self.assertTrue('4cb4dafe39b2539536a9cb31d5addf335734cb91e2d2786d212a9b574e094d7619a84ad53f82bd9421478a7994cf9d3f44fea271d542af09d26ce764edbada46 data/si/2584174182_ffd5c24905_b_d.jpg' in manifest_txt)
self.assertTrue('af1c03483cd1999098cce5f9e7689eea1f81899587508f59ba3c582d376f8bad34e75fed55fd1b1c26bd0c7a06671b85e90af99abac8753ad3d76d8d6bb31ebd data/si/4011399822_65987a4806_b_d.jpg' in manifest_txt)
def test_make_bag_unknown_algorithm(self):
self.assertRaises(RuntimeError, bagit.make_bag, self.tmpdir, checksum=['not-really-a-name'])
def test_make_bag_with_data_dir_present(self):
os.mkdir(j(self.tmpdir, 'data'))
bag = bagit.make_bag(self.tmpdir)
# data dir should now contain another data dir
self.assertTrue(os.path.isdir(j(self.tmpdir, 'data', 'data')))
def test_bag_class(self):
info = {'Contact-Email': 'ehs@pobox.com'}
bag = bagit.make_bag(self.tmpdir, bag_info=info)
self.assertTrue(isinstance(bag, bagit.Bag))
self.assertEqual(set(bag.payload_files()), set([
'data/README',
'data/si/2584174182_ffd5c24905_b_d.jpg',
'data/si/4011399822_65987a4806_b_d.jpg',
'data/loc/2478433644_2839c5e8b8_o_d.jpg',
'data/loc/3314493806_6f1db86d66_o_d.jpg']))
self.assertEqual(list(bag.manifest_files()), ['%s/manifest-md5.txt' %
self.tmpdir])
def test_has_oxum(self):
bag = bagit.make_bag(self.tmpdir)
self.assertTrue(bag.has_oxum())
def test_bag_constructor(self):
bag = bagit.make_bag(self.tmpdir)
bag = bagit.Bag(self.tmpdir)
self.assertEqual(type(bag), bagit.Bag)
self.assertEqual(len(list(bag.payload_files())), 5)
def test_is_valid(self):
bag = bagit.make_bag(self.tmpdir)
bag = bagit.Bag(self.tmpdir)
self.assertTrue(bag.is_valid())
with open(j(self.tmpdir, "data", "extra_file"), "w") as ef:
ef.write("bar")
self.assertFalse(bag.is_valid())
def test_garbage_in_bagit_txt(self):
bagit.make_bag(self.tmpdir)
bagfile = """BagIt-Version: 0.97
Tag-File-Character-Encoding: UTF-8
==================================
"""
with open(j(self.tmpdir, "bagit.txt"), "w") as bf:
bf.write(bagfile)
self.assertRaises(bagit.BagValidationError, bagit.Bag, self.tmpdir)
def test_make_bag_multiprocessing(self):
bag = bagit.make_bag(self.tmpdir, processes=2)
self.assertTrue(os.path.isdir(j(self.tmpdir, 'data')))
def test_multiple_meta_values(self):
baginfo = {"Multival-Meta": [7, 4, 8, 6, 8]}
bag = bagit.make_bag(self.tmpdir, baginfo)
meta = bag.info.get("Multival-Meta")
self.assertEqual(type(meta), list)
self.assertEqual(len(meta), len(baginfo["Multival-Meta"]))
def test_default_bagging_date(self):
info = {'Contact-Email': 'ehs@pobox.com'}
bag = bagit.make_bag(self.tmpdir, bag_info=info)
with open(j(self.tmpdir, 'bag-info.txt')) as bi:
bag_info_txt = bi.read()
self.assertTrue('Contact-Email: ehs@pobox.com' in bag_info_txt)
today = datetime.date.strftime(datetime.date.today(), "%Y-%m-%d")
self.assertTrue('Bagging-Date: %s' % today in bag_info_txt)
def test_missing_tagmanifest_valid(self):
info = {'Contact-Email': 'ehs@pobox.com'}
bag = bagit.make_bag(self.tmpdir, bag_info=info)
self.assertTrue(bag.is_valid())
os.remove(j(self.tmpdir, 'tagmanifest-md5.txt'))
self.assertTrue(bag.is_valid())
def test_carriage_return_manifest(self):
with open(j(self.tmpdir, "newline\r"), 'w') as whatever:
whatever.write("ugh")
bag = bagit.make_bag(self.tmpdir)
self.assertTrue(bag.is_valid())
def test_payload_permissions(self):
perms = os.stat(self.tmpdir).st_mode
# our tmpdir should not be writeable by group
self.assertEqual(perms & stat.S_IWOTH, 0)
# but if we make it writeable by the group then resulting
# payload directory should have the same permissions
new_perms = perms | stat.S_IWOTH
self.assertTrue(perms != new_perms)
os.chmod(self.tmpdir, new_perms)
bag = bagit.make_bag(self.tmpdir)
payload_dir = j(self.tmpdir, 'data')
self.assertEqual(os.stat(payload_dir).st_mode, new_perms)
def test_save_manifests(self):
bag = bagit.make_bag(self.tmpdir)
self.assertTrue(bag.is_valid())
bag.save(manifests=True)
self.assertTrue(bag.is_valid())
with open(j(self.tmpdir, "data", "newfile"), 'w') as nf:
nf.write('newfile')
self.assertRaises(bagit.BagValidationError, bag.validate, bag, fast=False)
bag.save(manifests=True)
self.assertTrue(bag.is_valid())
def test_save_baginfo(self):
bag = bagit.make_bag(self.tmpdir)
bag.info["foo"] = "bar"
bag.save()
bag = bagit.Bag(self.tmpdir)
self.assertEqual(bag.info["foo"], "bar")
self.assertTrue(bag.is_valid())
bag.info['x'] = ["a", "b", "c"]
bag.save()
b = bagit.Bag(self.tmpdir)
self.assertEqual(b.info["x"], ["a", "b", "c"])
self.assertTrue(bag.is_valid())
def test_save_baginfo_with_sha1(self):
bag = bagit.make_bag(self.tmpdir, checksum=["sha1", "md5"])
self.assertTrue(bag.is_valid())
bag.save()
bag.info['foo'] = "bar"
bag.save()
bag = bagit.Bag(self.tmpdir)
self.assertTrue(bag.is_valid())
def test_save_only_baginfo(self):
bag = bagit.make_bag(self.tmpdir)
with open(j(self.tmpdir, 'data', 'newfile'), 'w') as nf:
nf.write('newfile')
bag.info["foo"] = "bar"
bag.save()
bag = bagit.Bag(self.tmpdir)
self.assertEqual(bag.info["foo"], "bar")
self.assertFalse(bag.is_valid())
def test_make_bag_with_newline(self):
bag = bagit.make_bag(self.tmpdir, {"test": "foo\nbar"})
self.assertEqual(bag.info["test"], "foobar")
def test_unicode_in_tags(self):
bag = bagit.make_bag(self.tmpdir, {"test": ''})
bag = bagit.Bag(self.tmpdir)
self.assertEqual(bag.info['test'], '')
if __name__ == '__main__':
unittest.main()