def test_post_existing():
    """
    testing posting an existing tiddler to check that it is overwritten
    """
    #setup
    setup(store)
    tiddler = Tiddler('i exist','jon_private')
    tiddler.fields['geo.lat'] = '20'
    tiddler.fields['geo.long'] = '2'
    tiddler.text = 'data'
    tiddler.tags = ['a', 'b']
    store.put(tiddler)
    
    #run
    mailer.handle_email({
        'to': '*****@*****.**',
        'from': '*****@*****.**',
        'subject': 'i exist',
        'body': 'wipeout'
    })

    #verify  
    tiddler = store.get(Tiddler('i exist', 'jon_private'))
    assert tiddler.text == 'wipeout'
    assert tiddler.fields.get('geo.lat') == None
def test_post_new():
    """
    testing posting a new tiddler to tiddlyweb via email
    and that a reply to the response doesn't overwrite that tiddler
    """
    #setup
    setup(store)

    #run
    email = mailer.handle_email({
        'to': '*****@*****.**',
        'from': '*****@*****.**',
        'subject': 'Jons brand spanking new tiddler',
        'body': 'I love email tiddlyweb'
    })

    #verify  
    try:
        tiddler = Tiddler('Jons brand spanking new tiddler', 'jon_private')
        tiddler = store.get(tiddler)
    except NoTiddlerError:
        raise AssertionError('Tiddler has not been put into store')
    
    assert tiddler.text == 'I love email tiddlyweb'
    assert tiddler.tags == []
    
    assert email['from'] == '*****@*****.**'
    assert email['to'] == '*****@*****.**'
    assert email['subject'] == 'Jons brand spanking new tiddler'
    
    #check a reply doesn't overwrite the tiddler
    reply = {
        'subject': 'RE: Jons brand spanking new tiddler',
        'from': '*****@*****.**',
        'to': '*****@*****.**',
        'body': 'thanks tiddlyweb!'
    }
    
    #run
    email = mailer.handle_email(reply)
    
    #verify
    tiddler = Tiddler('Jons brand spanking new tiddler', 'jon_private')
    tiddler = store.get(tiddler)
    
    assert tiddler.text == 'I love email tiddlyweb'
    
    assert email == {
        'body': 'I love email tiddlyweb',
        'to': '*****@*****.**',
        'from': '*****@*****.**',
        'subject': 'Jons brand spanking new tiddler'
    }
def mail_agent(args):
  print "booting up mail agent"
  pigscantfly = True
  try:
    settings = config['mailer']
  except KeyError:
    print "mail agent failed to start: add to your config 'mailer':{'host':'','username':'','password':''}"
    return
  server =settings["pop"]
  user =settings["username"]
  password =settings["password"]

  while pigscantfly:
    print "logging %s into %s"%(user,server)
    try:
      session = poplib.POP3(server)
      session.user(user)
      session.pass_(password)
    except Exception,e:
      print "failed to start mail agent. Will try again in 30s."
      time.sleep(5)
      return mail_agent(args)
    print "logged into mail agent"
    numMessages = len(session.list()[1])
    print "there are %s new messages"%numMessages
    for i in range(1,numMessages+1):
      print "ooohh a message!! :D :D :D"
      raw_email = session.retr(i)[1]
      email_string = ""
      for el in raw_email:
        email_string += el
        email_string += "\n"
      msg = emailpy.message_from_string(email_string)
      email = {"from":msg["From"],"to":msg["To"],"subject":msg["Subject"]}
      body = msg.get_payload()
      if type(body) == type([]):
        body = body[0].as_string()
      try:
        body.index("\n\n")
        body = body[body.index("\n\n"):] 
      except ValueError:
        body = body
      email["body"]=  body
      try:
        mailer.handle_email(email)
        session.dele(i)
      except Exception,e:
        print "error %s"%e
      pass
def test_view_tiddlers():
    """
    test a request for viewing all tiddlers in a bag
    """
    #setup
    setup(store)
    tiddler = Tiddler('one', 'jon_private')
    store.put(tiddler)
    tiddler = Tiddler('two', 'jon_private')
    store.put(tiddler)
    tiddler = Tiddler('three', 'jon_private')
    store.put(tiddler)
    tiddler = Tiddler('four', 'jon_private')
    store.put(tiddler)

    #run
    email = mailer.handle_email({
        'to': '*****@*****.**',
        'from': '*****@*****.**',
        'subject': '',
        'body': ''
    })

    #verify
    assert email['to'] == '*****@*****.**'
    body = email['body'].splitlines()
    assert body.pop(0) == 'The following tiddlers are in jon.tiddlyspace.com:'
    assert len(body) == 4
    for tiddler_name in body: 
        assert tiddler_name in ['one', 'two', 'three', 'four']
def test_view():
    """
    test a request for viewing a single tiddler
    """
    #setup
    setup(store)
    tiddler = Tiddler('GettingStarted', 'jon_private')
    tiddler.text = 'the cat jumped over the moon'
    tiddler.tags = ['hello', 'world']
    store.put(tiddler)

    #run
    email = mailer.handle_email({
        'to': '*****@*****.**',
        'from': '*****@*****.**',
        'subject': 'GettingStarted',
        'body': ''
    })

    #verify
    assert email == {
        'to': '*****@*****.**',
        'from': '*****@*****.**',
        'subject': 'GettingStarted',
        'body': 'the cat jumped over the moon'
    }
def test_posting_of_tags():
    """
    overwriting a tiddler with tags with a tiddler with
    a different set of tags via email
    """
    #setup
    setup(store)
    tiddler = Tiddler('Hey there', 'ben_private')
    tiddler.tags = ['rainbows', 'colourful']
    store.put(tiddler)

    #run
    mailer.handle_email({
        'to': '*****@*****.**',
        'from': '*****@*****.**',
        'subject': 'Hey there',
        'body': 'tiddler text'
    })

    #verify
    tiddler = Tiddler('Hey there', 'ben_private')
    tiddler = store.get(tiddler)
    assert tiddler.tags == ['foo', 'bar', 'baz']
def test_view_reply():
    """
    test a request for viewing based on a reply to a previous response
    ie - the subject has an RE: in it.
    """
    #setup
    setup(store)
    tiddler = Tiddler('GettingStarted', 'ben_private')
    tiddler.text = 'The quick brown fox jumped over the lazy dog'
    store.put(tiddler)
    
    #run
    email = mailer.handle_email({
        'to': '*****@*****.**',
        'from': '*****@*****.**',
        'subject': 'RE: GettingStarted',
        'body': ''
    })
    
    #verify
    assert email['to'] == '*****@*****.**'
    assert email['from'] == '*****@*****.**'
    assert email['subject'] == 'GettingStarted'
    assert email['body'] == 'The quick brown fox jumped over the lazy dog'
def test_subscribe():
    # setup
    setup(store)
    empty = Tiddler("bags/osmosoft_private/empty", "subscriptions.daily")
    empty.text = """
[email protected]
[email protected]
"""
    store.put(empty)

    # run
    email = mailer.handle_email(
        {"to": "*****@*****.**", "from": "*****@*****.**", "subject": "", "body": ""}
    )

    # verify
    tid = store.get(Tiddler("bags/osmosoft_private/tiddlers", "subscriptions.daily"))
    assert tid.text == "*****@*****.**"

    email = mailer.handle_email(
        {"to": "*****@*****.**", "from": "*****@*****.**", "subject": "", "body": ""}
    )
    email = mailer.handle_email(
        {"to": "*****@*****.**", "from": "*****@*****.**", "subject": "", "body": ""}
    )

    tid = store.get(Tiddler("bags/osmosoft_private/tiddlers", "subscriptions.daily"))
    lines = tid.text.splitlines()
    assert len(lines) == 3
    for i in [u"*****@*****.**", u"*****@*****.**", u"*****@*****.**"]:
        assert i in lines

    email = mailer.handle_email(
        {"to": "*****@*****.**", "from": "*****@*****.**", "subject": "", "body": ""}
    )
    email = mailer.handle_email(
        {"to": "*****@*****.**", "from": "*****@*****.**", "subject": "", "body": ""}
    )
    tid = store.get(Tiddler("bags/osmosoft_private/tiddlers", "subscriptions.daily"))
    lines = tid.text.splitlines()
    email = mailer.make_digest_email(tid, environ)
    bcc = email["bcc"]
    assert len(bcc) == 2
    assert len(lines) == 2
    assert email["from"] == "*****@*****.**"
    for i in [u"*****@*****.**", u"*****@*****.**"]:
        assert i in lines
        assert i in bcc
    twhost = environ["tiddlyweb.config"]["server_host"]["host"]
    expected = (
        u"""note you can subscribe to this feed via atom feed <%s/test/bags/osmosoft_private/tiddlers.atom>

The meaning of life <http://monty.tiddlyspace.com/meaninglife>
The knights that go..

Life of Brian <http://monty.tiddlyspace.com/lifeofbrian>
He's been a very naughty boy.

"""
        % twhost
    )

    print "###########"
    assert email["body"] == expected
    expected = (
        u'<html><div>note you can <a href="%s/test/bags/osmosoft_private/tiddlers.atom">subscribe to this feed via atom feed</a></div><div><a href="http://monty.tiddlyspace.com/meaninglife"><h1>The meaning of life</h1></a>The knights that go..</div><div><a href="http://monty.tiddlyspace.com/lifeofbrian"><h1>Life of Brian</h1></a>He\'s been a very naughty boy.</div></html>'
        % twhost
    )
    assert email["bodyhtml"] == expected
    assert email["subject"] == u"Email Digest: Tiddlers in bag for testing purposes"
    tid = store.get(tid)
    assert "last_generated" in tid.fields

    global totalsent
    totalsent = 0

    def new_sendmail(email):
        global totalsent
        print "sending as part of make_digest_email test"
        totalsent += 1

    dummymailer.send_email = new_sendmail
    dummymailer.make_digest(["subscriptions.daily"])

    assert (
        totalsent is 1
    )  # one email is sent with all the email addresses blind carbon copied. osmosoft_private/empty is empty so wont cause emails

    tid = store.get(Tiddler("bags/osmosoft_private/empty", "subscriptions.daily"))
    email = dummymailer.make_digest_email(
        tid, environ
    )  # now since there was no changes to the store you would expect no email
    assert email is False
    assert "last_generated" not in tid.fields  # havent sent one yet