That was the first thing I tried, per your suggestion. Unfortunately, with that I get the following traceback:

```
Traceback (most recent call last):
    lms/djangoapps/courseware/tests/test_views.py line 91 in setUp
      self.course = self.create_course(start=datetime(2014, 5, 13))
    lms/djangoapps/courseware/tests/test_views.py line 98 in create_course
      self.draft = ItemFactory(category='vertical', parent_location=section.location, modulestore=modulestore('draft'))
    /edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/factory/base.py line 81 in __call__
      return cls.create(**kwargs)
    /edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/factory/base.py line 515 in create
      return cls._generate(True, attrs)
    /edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/factory/base.py line 440 in _generate
      obj = cls._prepare(create, **attrs)
    /edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/factory/base.py line 414 in _prepare
      return cls._create(target_class, *args, **kwargs)
    common/lib/xmodule/xmodule/modulestore/tests/factories.py line 168 in _create
      store.update_item(parent, '**replace_user**')
    common/lib/xmodule/xmodule/modulestore/mongo/draft.py line 169 in update_item
      self.convert_to_draft(xblock.location)
    common/lib/xmodule/xmodule/modulestore/mongo/draft.py line 145 in convert_to_draft
      raise InvalidVersionError(source_location)
   InvalidVersionError: 
```

This is because the draft store's `update_item` attempts to convert all parent items to drafts as well, for some reason, and fails when it gets to check if the category is in `DIRECT_ONLY_CATEGORIES`, which for most of the upper categories is the case.

So creating a direct/public item first and then converting it is the only way I've found to workaround this.