Commit ddb81667 authored by wbond's avatar wbond

Rewrote tests to check the new schema versions

parent f4aef938
...@@ -10,49 +10,120 @@ import os ...@@ -10,49 +10,120 @@ import os
import json import json
import unittest import unittest
from collections import OrderedDict from collections import OrderedDict
from nose.tools import assert_equal, assert_in, assert_not_in, assert_regexp_matches
# Generator tests can't be part of a class, so for consistency
# they are all functions
repo_file = "repositories.json" def test_channel():
with open("channel.json") as fp:
data = json.load(fp)
keys = sorted(data.keys())
assert_equal(keys, ['repositories', 'schema_version'])
assert_equal(data['schema_version'], '2.0')
# No need to check for this because all the other tests would fail anyway assert_equal(type(data['repositories']), list)
# class TestValidity(unittest.TestCase):
# def test_json_is_valid(self): for repository in data['repositories']:
# fp = open("repositories.json") assert_equal(type(repository), str)
# json.load(fp)
def test_repository():
class TestContents(unittest.TestCase): with open('repository.json') as f:
# Do not limit the list comparison to 600 chars (for more detailed debugging) data = json.load(f, object_pairs_hook=OrderedDict)
maxDiff = None
keys = sorted(data.keys())
def setUp(self): assert_equal(keys, ['includes', 'packages', 'schema_version'])
with open(repo_file) as f:
self.j = json.load(f, object_pairs_hook=OrderedDict) assert_equal(data['schema_version'], '2.0')
assert_equal(data['packages'], [])
def test_repositories_in_order(self): assert_equal(type(data['includes']), list)
repos = self.j['repositories']
# Remove "https://github.com/SublimeText" at the top because it is purposely not in order for include in data['includes']:
del repos[0] assert_equal(type(include), str)
self.assertEqual(repos, sorted(repos, key=str.lower))
def test_package_names_in_order(self): def test_repository_includes():
map_packages = list(self.j['package_name_map'].keys()) with open('repository.json') as f:
self.assertEqual(map_packages, sorted(map_packages, key=str.lower)) data = json.load(f, object_pairs_hook=OrderedDict)
def test_renamed_packages_in_order(self): for include in data['includes']:
ren_packages = list(self.j['renamed_packages'].keys()) yield check_include, include
self.assertEqual(ren_packages, sorted(ren_packages, key=str.lower))
with open(include) as f:
def test_name_map_redundancy(self): include_data = json.load(f, object_pairs_hook=OrderedDict)
for k, v in self.j['package_name_map'].items(): for package in include_data['packages']:
if k == v: yield check_package, package
raise ValueError("Package '%s' maps to itself" % k) if 'releases' in package:
for release in package['releases']:
def test_rename_map_redundancy(self): yield check_release, package, release
for k, v in self.j['renamed_packages'].items():
if k == v:
raise ValueError("Package '%s' renames to itself" % k) def check_include(filename):
with open(filename) as f:
data = json.load(f, object_pairs_hook=OrderedDict)
keys = sorted(data.keys())
assert_equal(keys, ['packages', 'schema_version'])
assert_equal(data['schema_version'], '2.0')
assert_equal(type(data['packages']), list)
def check_package(data):
for key in data.keys():
assert_in(key, ['name', 'details', 'releases', 'homepage', 'author',
'readme', 'issues', 'donate', 'buy', 'previous_names', 'labels'])
assert_equal(type(data[key]), map_key_type(key))
if key in ['details', 'homepage', 'readme', 'issues', 'donate', 'buy']:
assert_regexp_matches(data[key], '^https?://')
if 'details' not in data:
assert_in('name', data, 'The key "name" is required if no "details" URL provided')
assert_in('homepage', data, 'The key "homepage" is required if no "details" URL provided')
assert_in('author', data, 'The key "author" is required if no "details" URL provided')
assert_in('releases', data, 'The key "releases" is required if no "details" URL provided')
def check_release(package, data):
for key in data.keys():
assert_not_in(key, ['version', 'date', 'url'], 'The version, date and ' + \
'url keys should not be used in the main repository since a pull ' + \
'request would be necessary for every release')
assert_in(key, ['details', 'sublime_text', 'platforms'])
if key in ['details', 'url']:
assert_regexp_matches(data[key], '^https?://')
if key == 'sublime_text':
assert_regexp_matches(data[key], '^(\*|<=?\d{4}|>=?\d{4})$')
if key == 'platforms':
assert_in(type(data[key]), [str, list])
if type(data[key]) == str:
assert_in(data[key], ['*', 'osx', 'linux', 'windows'])
else:
for platform in data[key]:
assert_in(platform, ['*', 'osx', 'linux', 'windows'])
assert_in('details', data, 'A release must have a "details" key if it is in ' + \
'the main repository. For custom releases, a custom repository.json ' + \
'file must be hosted elsewhere.')
def map_key_type(key):
return {
'name': str,
'details': str,
'releases': list,
'homepage': str,
'author': str,
'readme': str,
'issues': str,
'donate': str,
'buy': str,
'previous_names': list,
'labels': list
}.get(key)
if __name__ == '__main__': if __name__ == '__main__':
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment