def test_determine_requirement_group(self):
     groups = ["css", "js"]
     self.assertEquals("js", utils.determine_requirement_group("jquery.js", groups))
     self.assertEquals("js", utils.determine_requirement_group("http://example.com/url/example.js", groups))
     self.assertEquals("js", utils.determine_requirement_group("http://example.com/url/example.js?query=string&example", groups))
     self.assertEquals(None, utils.determine_requirement_group("var a = null;", groups))
     self.assertEquals("css", utils.determine_requirement_group("reset.css", groups))
     self.assertEquals("css", utils.determine_requirement_group("http://example.com/css/reset.css", groups))
     self.assertEquals("css", utils.determine_requirement_group("http://example.com/css/reset.css?query=string&example", groups))
     self.assertEquals(None, utils.determine_requirement_group("h1 { background: #fff; }", groups))
def compile_require_node(parser, token):
    """
    Registers an external requirement with the current request context.
    
    The tag is invoked with the following signature::

        {% require [<group>] requirement [<depends> ...] %}

    The optional ``group`` argument specifies a requirement group, such as
    "css" or "js", the ``requirement`` argument specifies the desired
    requirement, and all further arguments are interpreted as requirements
    of the one currently being specified.

    A simple example that causes ``jquery.js`` to be added to the list of
    ``js`` requirements for the current request::

        {% require js jquery.js %}

    This more complicated example would add ``jquery-ui.js`` to the list of
    ``js`` requirements after ``jquery.js``::

        {% require js jquery-ui.js jquery.js %}

    """
    parts = token.split_contents()
    if not len(parts) >= 2:
        raise template.TemplateSyntaxError("%s tag requires one or more arguments" % parts[0])
    tag_name, args = parts[0], parts[1:]

    group_aliases = settings.REQUIREMENT_GROUP_ALIASES or {}
    requirement_aliases = settings.REQUIREMENT_ALIASES or {}
    potential_group = group_aliases.get(args[0]) or args[0]
    if potential_group and potential_group in settings.GROUPS:
        if not len(args) >= 2:
            raise template.TemplateSyntaxError("%s tag requires a requirement to be specified" % parts[0])
        group = potential_group
        args = args[1:]
    else:
        group = None
    requirement = requirement_aliases.get(args[0]) or args[0]
    depends_on = args[1:]
    depends_on = [requirement_aliases.get(dependency, dependency) for dependency in depends_on]
    if group is None:
        group = determine_requirement_group(requirement, settings.GROUPS)
    return RequireNode(requirement, group, depends_on)