class task_factory_test_2(unittest.TestCase):
    def setUp(self):
        self.app_tt_meta = Apptt_meta(short_name="sh_tt2", title="title2")

    def tearDown(self):
        if not self.app_tt_meta == None:
            pbclient.delete_app(self.app_tt_meta.app_id)

    # testing functions

    def test_get_task_01(self):
        self.app_tt_meta.add_task(task_info={"answer": "Yes", "page": 1})
        self.app_tt_meta.add_task(task_info={"answer": "Yes", "page": 2})
        self.app_tt_meta.add_task(task_info={"answer": "No", "page": 3})

        tasks = pbclient.get_tasks(self.app_tt_meta.app_id)

        try:
            for task in tasks:
                t2 = task_factory.get_task(task.id)
                if task.id == t2.task.id:
                    self.assertEquals(t2.task.info["page"], task.info["page"])
                    self.assertEquals(t2.task.info["answer"], task.info["answer"])
                    self.assertEquals(t2.app_short_name, self.app_tt_meta.short_name)

        except Exception as e:
            print e
            assert False

    def test_get_task_02(self):
        try:
            task_factory.get_task(-1)
        except Meb_task_factory_exception as e:
            self.assertEquals(e.code, 1)
def create_apps(book_id):
    """
    Celery queued task that creates tt_apps and tt1 tasks

    :arg book_id: Internet archive book id
    :returns: book indicating if the applications were created
    :rtype: bool

    """

    try:
        imgs = meb_util.get_tt_images(book_id)
        bookInfo = meb_util.get_archive_book_data(book_id)
        
        app_tt_select = Apptt_select(short_name=book_id + "_tt1", title=bookInfo['title'], book_info=bookInfo)
        app_tt_meta = Apptt_meta(short_name=book_id + "_tt2", title=bookInfo['title'])
        app_tt_struct = Apptt_struct(short_name=book_id + "_tt3", title=bookInfo['title'])
        app_tt_transcribe = Apptt_transcribe(short_name=book_id + "_tt4", title=bookInfo['title'])
        
        app_tt_select.add_app_infos(bookInfo)
        app_tt_meta.add_app_infos(bookInfo)
        app_tt_struct.add_app_infos(bookInfo)
        app_tt_transcribe.add_app_infos(bookInfo)
        
        if len(app_tt_select.get_tasks()) == 0:
            for img in imgs:
                task = app_tt_select.add_task(img)
                workflow_transaction_info = dict(task_id_1=task.id, task_id_2=None, task_id_3=None, task_id_4=None)
                data_mngr.record_workflow_transaction(workflow_transaction_info)

        return True

    except Exception as e:
        return False
 def test_add_next_task_02(self):
     """
        Invalid book
     """
     try:
         book_title = "BLBLB_title"
         app = Apptt_meta(short_name="BLBLB_tt2", title=book_title)
         app.add_task(task_info=dict(link="http://archive.org/download/livro1/n1", page=1))
         app.add_task(task_info=dict(link="http://archive.org/download/livro1/n2", page=2))
          
         tasks = pbclient.get_tasks(app_id=app.app_id)
          
         task1 = TTTask2(tasks[0].id, app_short_name=app.short_name)
         task2 = TTTask2(tasks[1].id, app_short_name=app.short_name)
          
         book_id = "BLBLB"
         data_mngr.record_book(dict(bookid=book_id, title=book_title, contributor="cont1", publisher="pub1", volume="1", img="image1"))
          
         task_run1 = dict(app_id=app.app_id, task_id=task1.task.id, info="[{\"id\":\"new\",\"top\":50,\"left\":9.5,\"width\":525,\"height\":626,\"text\":{\"titulo\":\"\",\"subtitulo\":\"\",\"assunto\":\"4\",\"fontes\":\"\",\"outros\":\"\",\"dataInicial\":\"\",\"dataFinal\":\"\",\"girar\":false,\"nao_girar\":true},\"editable\":true}]")
         task_run2 = dict(app_id=app.app_id, task_id=task1.task.id, info="[{\"id\":\"new\",\"top\":50,\"left\":15.5,\"width\":625,\"height\":626,\"text\":{\"titulo\":\"\",\"subtitulo\":\"\",\"assunto\":\"4\",\"fontes\":\"\",\"outros\":\"\",\"dataInicial\":\"\",\"dataFinal\":\"\",\"girar\":false,\"nao_girar\":true},\"editable\":true}]")
    
         # Anonymous submission
         submit_answer(self.base_url, task_run1)
            
         # FB authenticated user submission
         task_run2['facebook_user_id'] = '12345'
         submit_answer(self.base_url, task_run2)
            
         time.sleep(2)
            
         self.assertFalse(task1.check_answer())
           
         task1.add_next_task()
         
         assert False   
     
     except Meb_exception_tt2 as e:
         self.assertEquals(e.code, 3)
     
     finally:
         next_app = None 
         next_app_list = pbclient.find_app(short_name=app.short_name[:-1] + "3")
         
         if len(next_app_list) > 0:
             next_app = next_app_list[0]
         
             next_task = None
             tasks = pbclient.get_tasks(next_app.id)
             for t in tasks:
                 if t.info["page"] == task1.task.info["page"]: 
                     pbclient.delete_task(task_id=t.id)
      
         pbclient.delete_app(app_id=next_app.id)
         
         pbclient.delete_task(task1.task.id)
         pbclient.delete_task(task2.task.id)
         pbclient.delete_app(app.app_id)
         
         data_mngr.delete_book(book_id="BLBLB")
 def setUp(self):
     book_title = "rpparaiba1918_title"
     self.app = Apptt_meta(short_name="rpparaiba1918_tt2", title=book_title)
     self.app.add_task(task_info=dict(link="http://archive.org/download/livro1/n1", page=1))
     self.app.add_task(task_info=dict(link="http://archive.org/download/livro1/n2", page=2))
     
     tasks = pbclient.get_tasks(app_id=self.app.app_id)
     
     self.task1 = TTTask2(tasks[0].id, app_short_name=self.app.short_name)
     self.task2 = TTTask2(tasks[1].id, app_short_name=self.app.short_name)
     
     self.base_url = app_flask.config['PYBOSSA_URL']
     self.fb_user = authenticate_fb_user(self.base_url)
 def setUp(self):
     self.app_tt_meta = Apptt_meta(short_name="sh_tt2", title="title2")
class tt2_task_test(unittest.TestCase):
    
    def setUp(self):
        book_title = "rpparaiba1918_title"
        self.app = Apptt_meta(short_name="rpparaiba1918_tt2", title=book_title)
        self.app.add_task(task_info=dict(link="http://archive.org/download/livro1/n1", page=1))
        self.app.add_task(task_info=dict(link="http://archive.org/download/livro1/n2", page=2))
        
        tasks = pbclient.get_tasks(app_id=self.app.app_id)
        
        self.task1 = TTTask2(tasks[0].id, app_short_name=self.app.short_name)
        self.task2 = TTTask2(tasks[1].id, app_short_name=self.app.short_name)
        
        self.base_url = app_flask.config['PYBOSSA_URL']
        self.fb_user = authenticate_fb_user(self.base_url)
        
        
    def tearDown(self):
        next_app = None 
        next_app_list = pbclient.find_app(short_name=self.app.short_name[:-1] + "3")
        
        if len(next_app_list) > 0:
            next_app = next_app_list[0]
        
            next_task = None
            tasks = pbclient.get_tasks(next_app.id)
            for t in tasks:
                if t.info["page"] == self.task1.task.info["page"]: 
                    pbclient.delete_task(task_id=t.id)
         
            pbclient.delete_app(app_id=next_app.id)
         
        pbclient.delete_task(self.task1.task.id)
        pbclient.delete_task(self.task2.task.id)

        pbclient.delete_app(self.app.app_id)
         
        delete_book(self.task1.get_book_id())
    
    # testing functions

    def test_init_01(self):
        try:
            t1 = TTTask2( -1, "sh_tt2")
        except Meb_pb_task_exception as e:
            self.assertEquals(e.code, 1)
        
    def test_init_02(self):
        try:
            t1 = TTTask2( self.app.app_id, "sh_t")
        except Meb_pb_task_exception as e:
            self.assertEquals(e.code, 2)
     
    def test_get_next_app_01(self):
        try:
            nx_app = self.task1.get_next_app()
            self.assertEquals(nx_app.short_name, self.app.short_name[:-1] + "3")
        except Exception as ex:
            print ex
            assert False
        
    def test_check_answer_01(self):
        try:
            task_run1 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info="[{\"id\":\"new\",\"top\":50,\"left\":9.5,\"width\":525,\"height\":626,\"text\":{\"titulo\":\"\",\"subtitulo\":\"\",\"assunto\":\"4\",\"fontes\":\"\",\"outros\":\"\",\"dataInicial\":\"\",\"dataFinal\":\"\",\"girar\":false,\"nao_girar\":true},\"editable\":true}]")
            task_run2 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info="[{\"id\":\"new\",\"top\":50,\"left\":9.5,\"width\":525,\"height\":626,\"text\":{\"titulo\":\"\",\"subtitulo\":\"\",\"assunto\":\"4\",\"fontes\":\"\",\"outros\":\"\",\"dataInicial\":\"\",\"dataFinal\":\"\",\"girar\":false,\"nao_girar\":true},\"editable\":true}]")
                
            # Anonymous submission
            submit_answer(self.base_url, task_run1)
                  
            # FB authenticated user submission
            task_run2['facebook_user_id'] = '12345'
            submit_answer(self.base_url, task_run2)
                  
            time.sleep(2)
                 
            self.assertTrue(self.task1.check_answer())
                  
            trs = self.task1.get_task_runs()
      
            self.assertEquals(trs[0].info, "[{\"id\":\"new\",\"top\":50,\"left\":9.5,\"width\":525,\"height\":626,\"text\":{\"titulo\":\"\",\"subtitulo\":\"\",\"assunto\":\"4\",\"fontes\":\"\",\"outros\":\"\",\"dataInicial\":\"\",\"dataFinal\":\"\",\"girar\":false,\"nao_girar\":true},\"editable\":true}]")
            self.assertEquals(trs[1].info, "[{\"id\":\"new\",\"top\":50,\"left\":9.5,\"width\":525,\"height\":626,\"text\":{\"titulo\":\"\",\"subtitulo\":\"\",\"assunto\":\"4\",\"fontes\":\"\",\"outros\":\"\",\"dataInicial\":\"\",\"dataFinal\":\"\",\"girar\":false,\"nao_girar\":true},\"editable\":true}]")
                
            self.assertTrue(self.task1.check_answer())
            self.assertEquals(self.task1.task.state, '0')
                
            self.task1.close_task()
                
            self.assertEquals(self.task1.task.state, 'completed')
                
        except Exception as e:
            print e
            assert False
          
    def test_check_answer_02(self):
        try:
            task_run1 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info="[{\"id\":\"new\",\"top\":50,\"left\":9.5,\"width\":525,\"height\":626,\"text\":{\"titulo\":\"\",\"subtitulo\":\"\",\"assunto\":\"4\",\"fontes\":\"\",\"outros\":\"\",\"dataInicial\":\"\",\"dataFinal\":\"\",\"girar\":false,\"nao_girar\":true},\"editable\":true}]")
            task_run2 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info="[{\"id\":\"new\",\"top\":50,\"left\":9.5,\"width\":525,\"height\":626,\"text\":{\"titulo\":\"\",\"subtitulo\":\"\",\"assunto\":\"2\",\"fontes\":\"\",\"outros\":\"\",\"dataInicial\":\"\",\"dataFinal\":\"\",\"girar\":false,\"nao_girar\":true},\"editable\":true}]")
          
            # Anonymous submission
            submit_answer(self.base_url, task_run1)
                  
            # FB authenticated user submission
            task_run2['facebook_user_id'] = '12345'
            submit_answer(self.base_url, task_run2)
                  
            time.sleep(2)
                  
            self.assertFalse(self.task1.check_answer())
                  
        except Exception as e:
            print e
            assert False
         
         
    def test_check_answer_03(self):
        try:
            task_run1 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info="[]")
            task_run2 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info="[{\"id\":\"new\",\"top\":50,\"left\":9.5,\"width\":525,\"height\":626,\"text\":{\"titulo\":\"\",\"subtitulo\":\"\",\"assunto\":\"4\",\"fontes\":\"\",\"outros\":\"\",\"dataInicial\":\"\",\"dataFinal\":\"\",\"girar\":false,\"nao_girar\":true},\"editable\":true}]")
          
            # Anonymous submission
            submit_answer(self.base_url, task_run1)
                  
            # FB authenticated user submission
            task_run2['facebook_user_id'] = '12345'
            submit_answer(self.base_url, task_run2)
                  
            time.sleep(2)
                  
            self.task1.check_answer()
                  
        except Meb_exception_tt2 as e:
            self.assertEquals(e.code, 1)
         
    def test_check_answer_04(self):
        """
          Detection of some field differing 
        """
        try:
            task_run1 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info="[{\"id\":\"new\",\"top\":50,\"left\":9.5,\"width\":525,\"height\":626,\"text\":{\"titulo\":\"\",\"subtitulo\":\"\",\"assunto\":\"4\",\"fontes\":\"\",\"outros\":\"\",\"dataInicial\":\"\",\"dataFinal\":\"1900\",\"girar\":false,\"nao_girar\":true},\"editable\":true}]")
            task_run2 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info="[{\"id\":\"new\",\"top\":50,\"left\":9.5,\"width\":525,\"height\":626,\"text\":{\"titulo\":\"\",\"subtitulo\":\"\",\"assunto\":\"4\",\"fontes\":\"\",\"outros\":\"\",\"dataInicial\":\"\",\"dataFinal\":\"\",\"girar\":false,\"nao_girar\":true},\"editable\":true}]")
          
            # Anonymous submission
            submit_answer(self.base_url, task_run1)
                  
            # FB authenticated user submission
            task_run2['facebook_user_id'] = '12345'
            submit_answer(self.base_url, task_run2)
                  
            time.sleep(2)
                  
            self.task1.check_answer()
                  
        except Meb_exception_tt2 as e:
            self.assertEquals(e.code, 1)
         
    def test_check_answer_05(self):
        """
          Detection of some field faulting 
        """
        try:
            task_run1 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info="[{\"id\":\"new\",\"top\":50,\"left\":9.5,\"width\":525,\"height\":626,\"text\":{\"titulo\":\"\",\"subtitulo\":\"\",\"assunto\":\"4\",\"fontes\":\"\",\"outros\":\"\",\"dataInicial\":\"\",\"dataFinal\":\"\",\"girar\":false,\"nao_girar\":true},\"editable\":true}]")
            task_run2 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info="[{\"id\":\"new\",\"top\":50,\"left\":9.5,\"width\":525,\"height\":626,\"text\":{\"titulo\":\"\",\"subtitulo\":\"\",\"assunto\":\"4\",\"fontes\":\"\",\"outros\":\"\",\"dataFinal\":\"\",\"girar\":false,\"nao_girar\":true},\"editable\":true}]")
          
            # Anonymous submission
            submit_answer(self.base_url, task_run1)
                  
            # FB authenticated user submission
            task_run2['facebook_user_id'] = '12345'
            submit_answer(self.base_url, task_run2)
                  
            time.sleep(2)
                  
            self.task1.check_answer()
                  
        except Meb_exception_tt2 as e:
            self.assertEquals(e.code, 1)
        
    def test_add_next_task_01(self):
        try:
            task_run1 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info="[{\"id\":\"new\",\"top\":50,\"left\":9.5,\"width\":525,\"height\":626,\"text\":{\"titulo\":\"\",\"subtitulo\":\"\",\"assunto\":\"4\",\"fontes\":\"\",\"outros\":\"\",\"dataInicial\":\"\",\"dataFinal\":\"\",\"girar\":false,\"nao_girar\":true},\"editable\":true}]")
            task_run2 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info="[{\"id\":\"new\",\"top\":50,\"left\":9.5,\"width\":525,\"height\":626,\"text\":{\"titulo\":\"\",\"subtitulo\":\"\",\"assunto\":\"4\",\"fontes\":\"\",\"outros\":\"\",\"dataInicial\":\"\",\"dataFinal\":\"\",\"girar\":false,\"nao_girar\":true},\"editable\":true}]")
         
            # Anonymous submission
            submit_answer(self.base_url, task_run1)
                 
            # FB authenticated user submission
            task_run2['facebook_user_id'] = '12345'
            submit_answer(self.base_url, task_run2)
                 
            time.sleep(2)
                 
            self.assertTrue(self.task1.check_answer())
                
            self.task1.add_next_task()
                 
        except Exception as e:
            print e
            assert False
   
    def test_add_next_task_02(self):
        """
           Invalid book
        """
        try:
            book_title = "BLBLB_title"
            app = Apptt_meta(short_name="BLBLB_tt2", title=book_title)
            app.add_task(task_info=dict(link="http://archive.org/download/livro1/n1", page=1))
            app.add_task(task_info=dict(link="http://archive.org/download/livro1/n2", page=2))
             
            tasks = pbclient.get_tasks(app_id=app.app_id)
             
            task1 = TTTask2(tasks[0].id, app_short_name=app.short_name)
            task2 = TTTask2(tasks[1].id, app_short_name=app.short_name)
             
            book_id = "BLBLB"
            data_mngr.record_book(dict(bookid=book_id, title=book_title, contributor="cont1", publisher="pub1", volume="1", img="image1"))
             
            task_run1 = dict(app_id=app.app_id, task_id=task1.task.id, info="[{\"id\":\"new\",\"top\":50,\"left\":9.5,\"width\":525,\"height\":626,\"text\":{\"titulo\":\"\",\"subtitulo\":\"\",\"assunto\":\"4\",\"fontes\":\"\",\"outros\":\"\",\"dataInicial\":\"\",\"dataFinal\":\"\",\"girar\":false,\"nao_girar\":true},\"editable\":true}]")
            task_run2 = dict(app_id=app.app_id, task_id=task1.task.id, info="[{\"id\":\"new\",\"top\":50,\"left\":15.5,\"width\":625,\"height\":626,\"text\":{\"titulo\":\"\",\"subtitulo\":\"\",\"assunto\":\"4\",\"fontes\":\"\",\"outros\":\"\",\"dataInicial\":\"\",\"dataFinal\":\"\",\"girar\":false,\"nao_girar\":true},\"editable\":true}]")
       
            # Anonymous submission
            submit_answer(self.base_url, task_run1)
               
            # FB authenticated user submission
            task_run2['facebook_user_id'] = '12345'
            submit_answer(self.base_url, task_run2)
               
            time.sleep(2)
               
            self.assertFalse(task1.check_answer())
              
            task1.add_next_task()
            
            assert False   
        
        except Meb_exception_tt2 as e:
            self.assertEquals(e.code, 3)
        
        finally:
            next_app = None 
            next_app_list = pbclient.find_app(short_name=app.short_name[:-1] + "3")
            
            if len(next_app_list) > 0:
                next_app = next_app_list[0]
            
                next_task = None
                tasks = pbclient.get_tasks(next_app.id)
                for t in tasks:
                    if t.info["page"] == task1.task.info["page"]: 
                        pbclient.delete_task(task_id=t.id)
         
            pbclient.delete_app(app_id=next_app.id)
            
            pbclient.delete_task(task1.task.id)
            pbclient.delete_task(task2.task.id)
            pbclient.delete_app(app.app_id)
            
            data_mngr.delete_book(book_id="BLBLB")
            

    def test_add_next_task_03(self):
        """
           Try to create the next task from the same task T2
        """
        try:
            task_run1 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info="[{\"id\":\"new\",\"top\":50,\"left\":9.5,\"width\":525,\"height\":626,\"text\":{\"titulo\":\"\",\"subtitulo\":\"\",\"assunto\":\"4\",\"fontes\":\"\",\"outros\":\"\",\"dataInicial\":\"\",\"dataFinal\":\"\",\"girar\":false,\"nao_girar\":true},\"editable\":true}]")
            task_run2 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info="[{\"id\":\"new\",\"top\":50,\"left\":9.5,\"width\":525,\"height\":626,\"text\":{\"titulo\":\"\",\"subtitulo\":\"\",\"assunto\":\"4\",\"fontes\":\"\",\"outros\":\"\",\"dataInicial\":\"\",\"dataFinal\":\"\",\"girar\":false,\"nao_girar\":true},\"editable\":true}]")
      
            # Anonymous submission
            submit_answer(self.base_url, task_run1)
              
            # FB authenticated user submission
            task_run2['facebook_user_id'] = '12345'
            submit_answer(self.base_url, task_run2)
              
            time.sleep(2)
              
            self.assertTrue(self.task1.check_answer())
             
            self.assertTrue(self.task1.add_next_task())
             
            self.task1.add_next_task()
            
            assert False  
        except Meb_exception_tt2 as e:
            self.assertEquals(e.code, 6)