def _test_attachment_object(self, page):
        # LIST attachment - count 0
        attaches = Attachment.list(page, verbose=global_verbose)
        assert_that(len(attaches), is_(0))

        # POST attachment
        _starting("test Attachment.upload() CREATE ..")
        data = open(__file__, 'rb') # i shall sacrifice myself for testing!
        attach = Attachment(page, file=data)
        assert_that(attach.date_created, is_(None))
        attach.upload(verbose=global_verbose)
        data.close()
        assert_that(attach.date_created, is_not(None))
        prev_attach_rsrc = attach.resource
        # LIST attachment - count 1
        attaches = Attachment.list(page, verbose=global_verbose)
        assert_that(len(attaches), is_(1))
        assert_that(attaches[0].id, is_(attach.id))
        _okay()

        # PUT attachment
        _starting("test Attachment.upload() UPDATE ..")
        attach.file = File('tmp2', 'CONTENT!')
        attach.upload(verbose=global_verbose)
        assert_that(attach.id          , is_(prev_attach_rsrc["identifier"]))
        assert_that(attach.title       , is_not(prev_attach_rsrc["title"]))
        assert_that(attach.description , is_not(prev_attach_rsrc["description"]))
        assert_that(attach.resource["date_created"], is_(prev_attach_rsrc["date_created"]))
        _okay()
        
        # DELETE attachment
        _starting("test Attachment.delete() ..")
        attach.delete(verbose=global_verbose)
        # LIST attachment - count 0
        attaches = Attachment.list(page, verbose=global_verbose)
        assert_that(len(attaches), is_(0))
        _okay()
        _starting("test Attachment.list() ..")
        _okay()
def handle_attachment_resource(sn, method, page_id, verbose, resource_id, argv):
    ''' shows a few ways handling attahcment resources, with page_id and resource_id.

    note the possible styles handling each request.
     - LIST:   Page(sn, id=page_id).list_attachments()
     - GET:    Attachment(Page(sn, id=page_id), id=resource_id).get().download()
     - POST:   Attachment(Page(sn, id=page_id), filename=filename, file=file_obj).upload()
     - PUT:    Attachment(Page(sn, id=page_id), id=resource_id, file=file_obj).upload()
     - DELETE: Page(sn, id=page_id).delete_attachment(resource_id)
    '''
    ## DOWNLOAD attchment
    if method == 'GET' and resource_id:
        page   = Page(sn, id=page_id)   # just initializing, no need to fetch
        attach = Attachment(page, id=resource_id)
        attach.get(verbose=verbose)         # this retrieves metadata, such as filename
        attach.download(verbose=verbose)    # this downloads actual file content
        pprint.pprint(attach.resource)
        print 'saving to', attach.title, '..'

        if os.path.exists(filename):
            print 'filename already exists! abort saving file'
        else:
            file = open(attach.title, 'rw')
            file.write(attach.raw)
            file.close()

    ## LIST attchments
    if method == 'GET' and not resource_id:
        page = Page(sn, id=page_id).get() # fetch page, just curious
        attachments = page.list_attachments(verbose=verbose)
        print 'found', len(attachments), "files under '%(title)s'(#%(identifier)d)" % page.resource
        for attach in attachments:
            print ' - %(title), %(description) bytes' % attach.resource
            
    ## POST atatchment
    elif method == "POST":
        filename = resource_id # resource_id slot has filename to upload
        file_obj = open(filename, 'rb')

        # DON'T HAVE TO give a page object, relation_is_part_of will do.
        page   = Page(sn, id=page_id)   # no fetch, just holding page_id
        attach = Attachment(page, filename=filename, file=file_obj)
        attach.upload(verbose=verbose)
        pprint.pprint(attach.resource)
        print "created '%(title)s' (#%(identifier)d), %(description)d bytes under %(relation_is_part_of)d" % attach.resource
        file_obj.close()

    ## PUT attachment
    elif method == "PUT":
        filename = argv[5]  # you need the resource_id
        file_obj = open(filename, 'rb')

        page   = Page(sn, id=page_id)   # no fetch, just holding page_id
        attach = Attachment(page, id=resource_id, file=file_obj) # knows filename
        attach.upload(verbose=verbose)
        print "updated '%(title)s' (#%(identifier)d), %(description)d bytes under %(relation_is_part_of)d" % attach.resource
        file_obj.close()

    ## DELETE attachment
    elif method == "DELETE":
        page = Page(sn, id=page_id)
        attach = page.delete_attachment(resource_id, verbose=verbose)
        print "deleted file '%(title)s'" % attach.resource