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
class task_factory_test_3(unittest.TestCase):
    
    def setUp(self):
        self.app_tt_struct = Apptt_struct(short_name="sh_tt3",title="title3")
    
    def tearDown(self):
        if not self.app_tt_struct == None:
            pbclient.delete_app(self.app_tt_struct.app_id)
    
    # testing functions

    def test_get_task_01(self):
        self.app_tt_struct.add_task(task_info={"answer":"Yes", "page":1})
        self.app_tt_struct.add_task(task_info={"answer":"Yes", "page":2})
        self.app_tt_struct.add_task(task_info={"answer":"No", "page":3})
        
        tasks = pbclient.get_tasks(self.app_tt_struct.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_struct.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 setUp(self):
     book_title = "rpparaiba1918_title"
     self.app = Apptt_struct(short_name="rpparaiba1918_tt3", title=book_title)
     
     self.app.add_task(task_info=dict(
                                      hasZoom=False,
                                      zoom=[], 
                                      coords=[[0, 0, 7, 9], [7, 0, 37, 9], [37, 0, 118, 9], [118, 0, 251, 9], [251, 0, 489, 9], [0, 9, 7, 53], [7, 9, 37, 53], [37, 9, 118, 53], [118, 9, 251, 53], [251, 9, 489, 53], [0, 53, 7, 61], [7, 53, 37, 61], [37, 53, 118, 61], [118, 53, 251, 61], [251, 53, 489, 61], [0, 61, 7, 100], [7, 61, 37, 100], [37, 61, 118, 100], [118, 61, 251, 100], [251, 61, 489, 100], [0, 100, 7, 144], [7, 100, 37, 144], [37, 100, 118, 144], [118, 100, 251, 144], [251, 100, 489, 144], [0, 144, 7, 153], [7, 144, 37, 153], [37, 144, 118, 153], [118, 144, 251, 153], [251, 144, 489, 153], [0, 153, 7, 181], [7, 153, 37, 181], [37, 153, 118, 181], [118, 153, 251, 181], [251, 153, 489, 181], [0, 181, 7, 239], [7, 181, 37, 239], [37, 181, 118, 239], [118, 181, 251, 239], [251, 181, 489, 239], [0, 239, 7, 280], [7, 239, 37, 280], [37, 239, 118, 280], [118, 239, 251, 280], [251, 239, 489, 280], [0, 280, 7, 289], [7, 280, 37, 289], [37, 280, 118, 289], [118, 280, 251, 289], [251, 280, 489, 289], [0, 289, 7, 506], [7, 289, 37, 506], [37, 289, 118, 506], [118, 289, 251, 506], [251, 289, 489, 506]], 
                                      table_id=0, 
                                      img_url="http://localhost/mb-static/books/rpparaiba1918/metadados/tabelasBaixa/image1_0.png", 
                                      page=1
                                      )
                       )
     self.app.add_task(task_info=dict(
                                      hasZoom=False,
                                      zoom=[], 
                                      coords=[[0, 0, 7, 9], [7, 0, 37, 9], [37, 0, 118, 9], [118, 0, 251, 9], [251, 0, 489, 9], [0, 9, 7, 53], [7, 9, 37, 53], [37, 9, 118, 53], [118, 9, 251, 53], [251, 9, 489, 53], [0, 53, 7, 61], [7, 53, 37, 61], [37, 53, 118, 61], [118, 53, 251, 61], [251, 53, 489, 61], [0, 61, 7, 100], [7, 61, 37, 100], [37, 61, 118, 100], [118, 61, 251, 100], [251, 61, 489, 100], [0, 100, 7, 144], [7, 100, 37, 144], [37, 100, 118, 144], [118, 100, 251, 144], [251, 100, 489, 144], [0, 144, 7, 153], [7, 144, 37, 153], [37, 144, 118, 153], [118, 144, 251, 153], [251, 144, 489, 153], [0, 153, 7, 181], [7, 153, 37, 181], [37, 153, 118, 181], [118, 153, 251, 181], [251, 153, 489, 181], [0, 181, 7, 239], [7, 181, 37, 239], [37, 181, 118, 239], [118, 181, 251, 239], [251, 181, 489, 239], [0, 239, 7, 280], [7, 239, 37, 280], [37, 239, 118, 280], [118, 239, 251, 280], [251, 239, 489, 280], [0, 280, 7, 289], [7, 280, 37, 289], [37, 280, 118, 289], [118, 280, 251, 289], [251, 280, 489, 289], [0, 289, 7, 506], [7, 289, 37, 506], [37, 289, 118, 506], [118, 289, 251, 506], [251, 289, 489, 506]], 
                                      table_id=1, 
                                      img_url="http://localhost/mb-static/books/rpparaiba1918/metadados/tabelasBaixa/image1_1.png", 
                                      page=1
                                      )
                       )
     
     tasks = pbclient.get_tasks(app_id=self.app.app_id)
     
     self.task1 = TTTask3(tasks[0].id, app_short_name=self.app.short_name)
     self.task2 = TTTask3(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)
class tt3_task_with_zoom_test(unittest.TestCase):
    
    def setUp(self):
        book_title = "caracterizaoeten2001bras_title"
        self.app = Apptt_struct(short_name="caracterizaoeten2001bras_tt3", title=book_title)
        
        self.app.add_task(task_info=dict(
                                         hasZoom=True,
                                         zoom=[0, 0, 489, 168], 
                                         coords=[[0, 0, 7, 9], [7, 0, 37, 9], [37, 0, 118, 9], [118, 0, 251, 9], [251, 0, 489, 9], [0, 9, 7, 53], [7, 9, 37, 53], [37, 9, 118, 53], [118, 9, 251, 53], [251, 9, 489, 53], [0, 53, 7, 61], [7, 53, 37, 61], [37, 53, 118, 61], [118, 53, 251, 61], [251, 53, 489, 61], [0, 61, 7, 100], [7, 61, 37, 100], [37, 61, 118, 100], [118, 61, 251, 100], [251, 61, 489, 100], [0, 100, 7, 144], [7, 100, 37, 144], [37, 100, 118, 144], [118, 100, 251, 144], [251, 100, 489, 144], [0, 144, 7, 153], [7, 144, 37, 153], [37, 144, 118, 153], [118, 144, 251, 153], [251, 144, 489, 153], [0, 153, 7, 181], [7, 153, 37, 181], [37, 153, 118, 181], [118, 153, 251, 181], [251, 153, 489, 181], [0, 181, 7, 239], [7, 181, 37, 239], [37, 181, 118, 239], [118, 181, 251, 239], [251, 181, 489, 239], [0, 239, 7, 280], [7, 239, 37, 280], [37, 239, 118, 280], [118, 239, 251, 280], [251, 239, 489, 280], [0, 280, 7, 289], [7, 280, 37, 289], [37, 280, 118, 289], [118, 280, 251, 289], [251, 280, 489, 289], [0, 289, 7, 506], [7, 289, 37, 506], [37, 289, 118, 506], [118, 289, 251, 506], [251, 289, 489, 506]], 
                                         table_id=0, 
                                         img_url="http://localhost/mb-static/books/caracterizaoeten2001bras/metadados/tabelasBaixa/image1_0.png", 
                                         page=1
                                         )
                          )
        
        self.app.add_task(task_info=dict(
                                         hasZoom=True,
                                         zoom=[0, 0, 100, 168], 
                                         coords=[[0, 0, 7, 9], [7, 0, 37, 9], [37, 0, 118, 9], [118, 0, 251, 9], [251, 0, 489, 9], [0, 9, 7, 53], [7, 9, 37, 53], [37, 9, 118, 53], [118, 9, 251, 53], [251, 9, 489, 53], [0, 53, 7, 61], [7, 53, 37, 61], [37, 53, 118, 61], [118, 53, 251, 61], [251, 53, 489, 61], [0, 61, 7, 100], [7, 61, 37, 100], [37, 61, 118, 100], [118, 61, 251, 100], [251, 61, 489, 100], [0, 100, 7, 144], [7, 100, 37, 144], [37, 100, 118, 144], [118, 100, 251, 144], [251, 100, 489, 144], [0, 144, 7, 153], [7, 144, 37, 153], [37, 144, 118, 153], [118, 144, 251, 153], [251, 144, 489, 153], [0, 153, 7, 181], [7, 153, 37, 181], [37, 153, 118, 181], [118, 153, 251, 181], [251, 153, 489, 181], [0, 181, 7, 239], [7, 181, 37, 239], [37, 181, 118, 239], [118, 181, 251, 239], [251, 181, 489, 239], [0, 239, 7, 280], [7, 239, 37, 280], [37, 239, 118, 280], [118, 239, 251, 280], [251, 239, 489, 280], [0, 280, 7, 289], [7, 280, 37, 289], [37, 280, 118, 289], [118, 280, 251, 289], [251, 280, 489, 289], [0, 289, 7, 506], [7, 289, 37, 506], [37, 289, 118, 506], [118, 289, 251, 506], [251, 289, 489, 506]], 
                                         table_id=1, 
                                         img_url="http://localhost/mb-static/books/caracterizaoeten2001bras/metadados/tabelasBaixa/image2_0.png", 
                                         page=2
                                         )
                          )
        self.app.add_task(task_info=dict(
                                         hasZoom=True,
                                         zoom=[100, 0, 200, 168], 
                                         coords=[[0, 0, 7, 9], [7, 0, 37, 9], [37, 0, 118, 9], [118, 0, 251, 9], [251, 0, 489, 9], [0, 9, 7, 53], [7, 9, 37, 53], [37, 9, 118, 53], [118, 9, 251, 53], [251, 9, 489, 53], [0, 53, 7, 61], [7, 53, 37, 61], [37, 53, 118, 61], [118, 53, 251, 61], [251, 53, 489, 61], [0, 61, 7, 100], [7, 61, 37, 100], [37, 61, 118, 100], [118, 61, 251, 100], [251, 61, 489, 100], [0, 100, 7, 144], [7, 100, 37, 144], [37, 100, 118, 144], [118, 100, 251, 144], [251, 100, 489, 144], [0, 144, 7, 153], [7, 144, 37, 153], [37, 144, 118, 153], [118, 144, 251, 153], [251, 144, 489, 153], [0, 153, 7, 181], [7, 153, 37, 181], [37, 153, 118, 181], [118, 153, 251, 181], [251, 153, 489, 181], [0, 181, 7, 239], [7, 181, 37, 239], [37, 181, 118, 239], [118, 181, 251, 239], [251, 181, 489, 239], [0, 239, 7, 280], [7, 239, 37, 280], [37, 239, 118, 280], [118, 239, 251, 280], [251, 239, 489, 280], [0, 280, 7, 289], [7, 280, 37, 289], [37, 280, 118, 289], [118, 280, 251, 289], [251, 280, 489, 289], [0, 289, 7, 506], [7, 289, 37, 506], [37, 289, 118, 506], [118, 289, 251, 506], [251, 289, 489, 506]], 
                                         table_id=1, 
                                         img_url="http://localhost/mb-static/books/caracterizaoeten2001bras/metadados/tabelasBaixa/image2_0.png", 
                                         page=2
                                         )
                          )
        self.app.add_task(task_info=dict(
                                         hasZoom=True,
                                         zoom=[200, 0, 489, 168], 
                                         coords=[[0, 0, 7, 9], [7, 0, 37, 9], [37, 0, 118, 9], [118, 0, 251, 9], [251, 0, 489, 9], [0, 9, 7, 53], [7, 9, 37, 53], [37, 9, 118, 53], [118, 9, 251, 53], [251, 9, 489, 53], [0, 53, 7, 61], [7, 53, 37, 61], [37, 53, 118, 61], [118, 53, 251, 61], [251, 53, 489, 61], [0, 61, 7, 100], [7, 61, 37, 100], [37, 61, 118, 100], [118, 61, 251, 100], [251, 61, 489, 100], [0, 100, 7, 144], [7, 100, 37, 144], [37, 100, 118, 144], [118, 100, 251, 144], [251, 100, 489, 144], [0, 144, 7, 153], [7, 144, 37, 153], [37, 144, 118, 153], [118, 144, 251, 153], [251, 144, 489, 153], [0, 153, 7, 181], [7, 153, 37, 181], [37, 153, 118, 181], [118, 153, 251, 181], [251, 153, 489, 181], [0, 181, 7, 239], [7, 181, 37, 239], [37, 181, 118, 239], [118, 181, 251, 239], [251, 181, 489, 239], [0, 239, 7, 280], [7, 239, 37, 280], [37, 239, 118, 280], [118, 239, 251, 280], [251, 239, 489, 280], [0, 280, 7, 289], [7, 280, 37, 289], [37, 280, 118, 289], [118, 280, 251, 289], [251, 280, 489, 289], [0, 289, 7, 506], [7, 289, 37, 506], [37, 289, 118, 506], [118, 289, 251, 506], [251, 289, 489, 506]], 
                                         table_id=1, 
                                         img_url="http://localhost/mb-static/books/caracterizaoeten2001bras/metadados/tabelasBaixa/image2_0.png", 
                                         page=2
                                         )
                          )
        
        tasks = pbclient.get_tasks(app_id=self.app.app_id)
        
        self.task1 = TTTask3(tasks[0].id, app_short_name=self.app.short_name)
        
        self.task2 = TTTask3(tasks[1].id, app_short_name=self.app.short_name)
        self.task3 = TTTask3(tasks[2].id, app_short_name=self.app.short_name)
        self.task4 = TTTask3(tasks[3].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] + "4")
        
        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["img_url"] == self.task1.task.info["img_url"]: 
                    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 = TTTask3( -1, "sh_tt3")
        except Meb_pb_task_exception as e:
            self.assertEquals(e.code, 1)
          
    def test_init_02(self):
        try:
            t1 = TTTask3( 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] + "4")
        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='{\"img_url\":\"https://localhost/mb-static/books/caracterizaoeten2001bras/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
            task_run2 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/caracterizaoeten2001bras/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
                  
            # 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, '{\"img_url\":\"https://localhost/mb-static/books/caracterizaoeten2001bras/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
            self.assertEquals(trs[1].info, '{\"img_url\":\"https://localhost/mb-static/books/caracterizaoeten2001bras/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
                  
            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='{\"img_url\":\"https://localhost/mb-static/books/caracterizaoeten2001bras/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
            task_run2 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/caracterizaoeten2001bras/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
                  
            # 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='{\"img_url\":\"https://localhost/mb-static/books/caracterizaoeten2001bras/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
                  
            # 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_tt3 as e:
            self.assertEquals(e.code, 2)
      
      
    def test_check_answer_04(self):
        """
          Detecting the fault of a field in info
        """
          
        try:
            task_run1 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/caracterizaoeten2001bras/metadados/tabelasBaixa/image1_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"maxX\":507,\"maxY\":178}')
            task_run2 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/caracterizaoeten2001bras/metadados/tabelasBaixa/image1_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
                  
            # 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_tt3 as e:
            self.assertEquals(e.code, 2)
    
    
    def test_add_next_task_01(self):
        """
          Detection of invalid task group
        """
        
        try:
            task_run1 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/caracterizaoeten2001bras/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
            task_run2 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/caracterizaoeten2001bras/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
         
            # 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.assertFalse(self.task1.add_next_task())
                 
        except Exception as e:
            print e
            assert False
    
    
    def test_add_next_task_02(self):
        """
          Valid task group
        """
        
        try:
            task_run1 = dict(app_id=self.app.app_id, task_id=self.task2.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/caracterizaoeten2001bras/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
            task_run2 = dict(app_id=self.app.app_id, task_id=self.task2.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/caracterizaoeten2001bras/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
         
            task_run3 = dict(app_id=self.app.app_id, task_id=self.task3.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/caracterizaoeten2001bras/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
            task_run4 = dict(app_id=self.app.app_id, task_id=self.task3.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/caracterizaoeten2001bras/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
            
            task_run5 = dict(app_id=self.app.app_id, task_id=self.task4.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/caracterizaoeten2001bras/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
            task_run6 = dict(app_id=self.app.app_id, task_id=self.task4.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/caracterizaoeten2001bras/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
            
            # Anonymous submission
            submit_answer(self.base_url, task_run1)
            submit_answer(self.base_url, task_run3)
            submit_answer(self.base_url, task_run5)
                 
            # FB authenticated user submission
            task_run2['facebook_user_id'] = '12345'
            task_run4['facebook_user_id'] = '12345'
            task_run6['facebook_user_id'] = '12345'
            
            submit_answer(self.base_url, task_run2)
            submit_answer(self.base_url, task_run4)
            submit_answer(self.base_url, task_run6)
                 
            time.sleep(2)
            
            self.assertTrue(self.task2.check_answer())
            self.assertTrue(self.task3.check_answer())
            self.assertTrue(self.task4.check_answer())
            
            self.task2.close_task()
            self.task3.close_task()
            self.task4.close_task()
            
            self.task4.add_next_task()
            
        except Meb_exception_tt3 as e:
            self.assertEquals(e.code, 5)  # didnt found images to run tesseract executor
 def test_add_next_task_03(self):
     """
        Invalid book
     """
     try:
         book_title = "BLABDL_title"
         app = Apptt_struct(short_name="BLABDL_tt3", title=book_title)
     
         app.add_task(task_info=dict(
                                          hasZoom=False,
                                          zoom=[0, 0, 489, 168], 
                                          coords=[[0, 0, 7, 9], [7, 0, 37, 9], [37, 0, 118, 9], [118, 0, 251, 9], [251, 0, 489, 9], [0, 9, 7, 53], [7, 9, 37, 53], [37, 9, 118, 53], [118, 9, 251, 53], [251, 9, 489, 53], [0, 53, 7, 61], [7, 53, 37, 61], [37, 53, 118, 61], [118, 53, 251, 61], [251, 53, 489, 61], [0, 61, 7, 100], [7, 61, 37, 100], [37, 61, 118, 100], [118, 61, 251, 100], [251, 61, 489, 100], [0, 100, 7, 144], [7, 100, 37, 144], [37, 100, 118, 144], [118, 100, 251, 144], [251, 100, 489, 144], [0, 144, 7, 153], [7, 144, 37, 153], [37, 144, 118, 153], [118, 144, 251, 153], [251, 144, 489, 153], [0, 153, 7, 181], [7, 153, 37, 181], [37, 153, 118, 181], [118, 153, 251, 181], [251, 153, 489, 181], [0, 181, 7, 239], [7, 181, 37, 239], [37, 181, 118, 239], [118, 181, 251, 239], [251, 181, 489, 239], [0, 239, 7, 280], [7, 239, 37, 280], [37, 239, 118, 280], [118, 239, 251, 280], [251, 239, 489, 280], [0, 280, 7, 289], [7, 280, 37, 289], [37, 280, 118, 289], [118, 280, 251, 289], [251, 280, 489, 289], [0, 289, 7, 506], [7, 289, 37, 506], [37, 289, 118, 506], [118, 289, 251, 506], [251, 289, 489, 506]], 
                                          table_id=0, 
                                          img_url="http://localhost/mb-static/books/BLABDL/metadados/tabelasBaixa/image2000_0.png", 
                                          page=1
                                          )
                           )
         app.add_task(task_info=dict(
                                          hasZoom=False,
                                          zoom=[0, 0, 489, 168], 
                                          coords=[[0, 0, 7, 9], [7, 0, 37, 9], [37, 0, 118, 9], [118, 0, 251, 9], [251, 0, 489, 9], [0, 9, 7, 53], [7, 9, 37, 53], [37, 9, 118, 53], [118, 9, 251, 53], [251, 9, 489, 53], [0, 53, 7, 61], [7, 53, 37, 61], [37, 53, 118, 61], [118, 53, 251, 61], [251, 53, 489, 61], [0, 61, 7, 100], [7, 61, 37, 100], [37, 61, 118, 100], [118, 61, 251, 100], [251, 61, 489, 100], [0, 100, 7, 144], [7, 100, 37, 144], [37, 100, 118, 144], [118, 100, 251, 144], [251, 100, 489, 144], [0, 144, 7, 153], [7, 144, 37, 153], [37, 144, 118, 153], [118, 144, 251, 153], [251, 144, 489, 153], [0, 153, 7, 181], [7, 153, 37, 181], [37, 153, 118, 181], [118, 153, 251, 181], [251, 153, 489, 181], [0, 181, 7, 239], [7, 181, 37, 239], [37, 181, 118, 239], [118, 181, 251, 239], [251, 181, 489, 239], [0, 239, 7, 280], [7, 239, 37, 280], [37, 239, 118, 280], [118, 239, 251, 280], [251, 239, 489, 280], [0, 280, 7, 289], [7, 280, 37, 289], [37, 280, 118, 289], [118, 280, 251, 289], [251, 280, 489, 289], [0, 289, 7, 506], [7, 289, 37, 506], [37, 289, 118, 506], [118, 289, 251, 506], [251, 289, 489, 506]], 
                                          table_id=1, 
                                          img_url="http://localhost/mb-static/books/BLABDL/metadados/tabelasBaixa/image2000_1.png", 
                                          page=1
                                          )
                           )
           
         tasks = pbclient.get_tasks(app_id=app.app_id)
           
         task1 = TTTask3(tasks[0].id, app_short_name=app.short_name)
         task2 = TTTask3(tasks[1].id, app_short_name=app.short_name)
           
         book_id = "BLABDL"
           
         task_run1 = dict(app_id=app.app_id, task_id=task1.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/BLABDL/metadados/tabelasBaixa/image2000_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
         task_run2 = dict(app_id=app.app_id, task_id=task1.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/BLABDL/metadados/tabelasBaixa/image2000_1.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
     
         # 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(task1.check_answer())
            
         task1.add_next_task()
          
         assert False   
      
     except Meb_exception_tt3 as e:
         self.assertEquals(e.code, 5)
      
     finally:
         next_app = None 
         next_app_list = pbclient.find_app(short_name=app.short_name[:-1] + "4")
          
         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["img_url"] == task1.task.info["img_url"]: 
                     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="BLABDL")
class tt3_task_without_zoom_test(unittest.TestCase):
    
    def setUp(self):
        book_title = "rpparaiba1918_title"
        self.app = Apptt_struct(short_name="rpparaiba1918_tt3", title=book_title)
        
        self.app.add_task(task_info=dict(
                                         hasZoom=False,
                                         zoom=[], 
                                         coords=[[0, 0, 7, 9], [7, 0, 37, 9], [37, 0, 118, 9], [118, 0, 251, 9], [251, 0, 489, 9], [0, 9, 7, 53], [7, 9, 37, 53], [37, 9, 118, 53], [118, 9, 251, 53], [251, 9, 489, 53], [0, 53, 7, 61], [7, 53, 37, 61], [37, 53, 118, 61], [118, 53, 251, 61], [251, 53, 489, 61], [0, 61, 7, 100], [7, 61, 37, 100], [37, 61, 118, 100], [118, 61, 251, 100], [251, 61, 489, 100], [0, 100, 7, 144], [7, 100, 37, 144], [37, 100, 118, 144], [118, 100, 251, 144], [251, 100, 489, 144], [0, 144, 7, 153], [7, 144, 37, 153], [37, 144, 118, 153], [118, 144, 251, 153], [251, 144, 489, 153], [0, 153, 7, 181], [7, 153, 37, 181], [37, 153, 118, 181], [118, 153, 251, 181], [251, 153, 489, 181], [0, 181, 7, 239], [7, 181, 37, 239], [37, 181, 118, 239], [118, 181, 251, 239], [251, 181, 489, 239], [0, 239, 7, 280], [7, 239, 37, 280], [37, 239, 118, 280], [118, 239, 251, 280], [251, 239, 489, 280], [0, 280, 7, 289], [7, 280, 37, 289], [37, 280, 118, 289], [118, 280, 251, 289], [251, 280, 489, 289], [0, 289, 7, 506], [7, 289, 37, 506], [37, 289, 118, 506], [118, 289, 251, 506], [251, 289, 489, 506]], 
                                         table_id=0, 
                                         img_url="http://localhost/mb-static/books/rpparaiba1918/metadados/tabelasBaixa/image1_0.png", 
                                         page=1
                                         )
                          )
        self.app.add_task(task_info=dict(
                                         hasZoom=False,
                                         zoom=[], 
                                         coords=[[0, 0, 7, 9], [7, 0, 37, 9], [37, 0, 118, 9], [118, 0, 251, 9], [251, 0, 489, 9], [0, 9, 7, 53], [7, 9, 37, 53], [37, 9, 118, 53], [118, 9, 251, 53], [251, 9, 489, 53], [0, 53, 7, 61], [7, 53, 37, 61], [37, 53, 118, 61], [118, 53, 251, 61], [251, 53, 489, 61], [0, 61, 7, 100], [7, 61, 37, 100], [37, 61, 118, 100], [118, 61, 251, 100], [251, 61, 489, 100], [0, 100, 7, 144], [7, 100, 37, 144], [37, 100, 118, 144], [118, 100, 251, 144], [251, 100, 489, 144], [0, 144, 7, 153], [7, 144, 37, 153], [37, 144, 118, 153], [118, 144, 251, 153], [251, 144, 489, 153], [0, 153, 7, 181], [7, 153, 37, 181], [37, 153, 118, 181], [118, 153, 251, 181], [251, 153, 489, 181], [0, 181, 7, 239], [7, 181, 37, 239], [37, 181, 118, 239], [118, 181, 251, 239], [251, 181, 489, 239], [0, 239, 7, 280], [7, 239, 37, 280], [37, 239, 118, 280], [118, 239, 251, 280], [251, 239, 489, 280], [0, 280, 7, 289], [7, 280, 37, 289], [37, 280, 118, 289], [118, 280, 251, 289], [251, 280, 489, 289], [0, 289, 7, 506], [7, 289, 37, 506], [37, 289, 118, 506], [118, 289, 251, 506], [251, 289, 489, 506]], 
                                         table_id=1, 
                                         img_url="http://localhost/mb-static/books/rpparaiba1918/metadados/tabelasBaixa/image1_1.png", 
                                         page=1
                                         )
                          )
        
        tasks = pbclient.get_tasks(app_id=self.app.app_id)
        
        self.task1 = TTTask3(tasks[0].id, app_short_name=self.app.short_name)
        self.task2 = TTTask3(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] + "4")
        
        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["img_url"] == self.task1.task.info["img_url"]: 
                    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 = TTTask3( -1, "sh_tt3")
        except Meb_pb_task_exception as e:
            self.assertEquals(e.code, 1)
         
    def test_init_02(self):
        try:
            t1 = TTTask3( 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] + "4")
        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='{\"img_url\":\"https://localhost/mb-static/books/rpparaiba1918/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
            task_run2 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/rpparaiba1918/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
                 
            # 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, '{\"img_url\":\"https://localhost/mb-static/books/rpparaiba1918/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
            self.assertEquals(trs[1].info, '{\"img_url\":\"https://localhost/mb-static/books/rpparaiba1918/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
                 
            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='{\"img_url\":\"https://localhost/mb-static/books/rpparaiba1918/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
            task_run2 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/rpparaiba1918/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
                 
            # 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='{\"img_url\":\"https://localhost/mb-static/books/rpparaiba1918/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
                 
            # 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_tt3 as e:
            self.assertEquals(e.code, 2)
     
     
    def test_check_answer_04(self):
        """
          Detecting the fault of a field in info
        """
         
        try:
            task_run1 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/rpparaiba1918/metadados/tabelasBaixa/image1_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"maxX\":507,\"maxY\":178}')
            task_run2 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/rpparaiba1918/metadados/tabelasBaixa/image1_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
                 
            # 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_tt3 as e:
            self.assertEquals(e.code, 2)
    
    
    def test_add_next_task_01(self):
        """
          Normal add_next with tasks without zoom
        """
        
        try:
            task_run1 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/rpparaiba1918/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
            task_run2 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/rpparaiba1918/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
         
            # 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())
                 
        except Exception as e:
            print e
            assert False


    def test_add_next_task_02(self):
        """
          Try to create twice a new task from the same task T3
        """
        
        try:
            task_run1 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/rpparaiba1918/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
            task_run2 = dict(app_id=self.app.app_id, task_id=self.task1.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/rpparaiba1918/metadados/tabelasBaixa/image0_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
         
            # 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()
                 
        except Meb_exception_tt3 as e:
            self.assertEquals(e.code, 3)
    
    def test_add_next_task_03(self):
        """
           Invalid book
        """
        try:
            book_title = "BLABDL_title"
            app = Apptt_struct(short_name="BLABDL_tt3", title=book_title)
        
            app.add_task(task_info=dict(
                                             hasZoom=False,
                                             zoom=[0, 0, 489, 168], 
                                             coords=[[0, 0, 7, 9], [7, 0, 37, 9], [37, 0, 118, 9], [118, 0, 251, 9], [251, 0, 489, 9], [0, 9, 7, 53], [7, 9, 37, 53], [37, 9, 118, 53], [118, 9, 251, 53], [251, 9, 489, 53], [0, 53, 7, 61], [7, 53, 37, 61], [37, 53, 118, 61], [118, 53, 251, 61], [251, 53, 489, 61], [0, 61, 7, 100], [7, 61, 37, 100], [37, 61, 118, 100], [118, 61, 251, 100], [251, 61, 489, 100], [0, 100, 7, 144], [7, 100, 37, 144], [37, 100, 118, 144], [118, 100, 251, 144], [251, 100, 489, 144], [0, 144, 7, 153], [7, 144, 37, 153], [37, 144, 118, 153], [118, 144, 251, 153], [251, 144, 489, 153], [0, 153, 7, 181], [7, 153, 37, 181], [37, 153, 118, 181], [118, 153, 251, 181], [251, 153, 489, 181], [0, 181, 7, 239], [7, 181, 37, 239], [37, 181, 118, 239], [118, 181, 251, 239], [251, 181, 489, 239], [0, 239, 7, 280], [7, 239, 37, 280], [37, 239, 118, 280], [118, 239, 251, 280], [251, 239, 489, 280], [0, 280, 7, 289], [7, 280, 37, 289], [37, 280, 118, 289], [118, 280, 251, 289], [251, 280, 489, 289], [0, 289, 7, 506], [7, 289, 37, 506], [37, 289, 118, 506], [118, 289, 251, 506], [251, 289, 489, 506]], 
                                             table_id=0, 
                                             img_url="http://localhost/mb-static/books/BLABDL/metadados/tabelasBaixa/image2000_0.png", 
                                             page=1
                                             )
                              )
            app.add_task(task_info=dict(
                                             hasZoom=False,
                                             zoom=[0, 0, 489, 168], 
                                             coords=[[0, 0, 7, 9], [7, 0, 37, 9], [37, 0, 118, 9], [118, 0, 251, 9], [251, 0, 489, 9], [0, 9, 7, 53], [7, 9, 37, 53], [37, 9, 118, 53], [118, 9, 251, 53], [251, 9, 489, 53], [0, 53, 7, 61], [7, 53, 37, 61], [37, 53, 118, 61], [118, 53, 251, 61], [251, 53, 489, 61], [0, 61, 7, 100], [7, 61, 37, 100], [37, 61, 118, 100], [118, 61, 251, 100], [251, 61, 489, 100], [0, 100, 7, 144], [7, 100, 37, 144], [37, 100, 118, 144], [118, 100, 251, 144], [251, 100, 489, 144], [0, 144, 7, 153], [7, 144, 37, 153], [37, 144, 118, 153], [118, 144, 251, 153], [251, 144, 489, 153], [0, 153, 7, 181], [7, 153, 37, 181], [37, 153, 118, 181], [118, 153, 251, 181], [251, 153, 489, 181], [0, 181, 7, 239], [7, 181, 37, 239], [37, 181, 118, 239], [118, 181, 251, 239], [251, 181, 489, 239], [0, 239, 7, 280], [7, 239, 37, 280], [37, 239, 118, 280], [118, 239, 251, 280], [251, 239, 489, 280], [0, 280, 7, 289], [7, 280, 37, 289], [37, 280, 118, 289], [118, 280, 251, 289], [251, 280, 489, 289], [0, 289, 7, 506], [7, 289, 37, 506], [37, 289, 118, 506], [118, 289, 251, 506], [251, 289, 489, 506]], 
                                             table_id=1, 
                                             img_url="http://localhost/mb-static/books/BLABDL/metadados/tabelasBaixa/image2000_1.png", 
                                             page=1
                                             )
                              )
              
            tasks = pbclient.get_tasks(app_id=app.app_id)
              
            task1 = TTTask3(tasks[0].id, app_short_name=app.short_name)
            task2 = TTTask3(tasks[1].id, app_short_name=app.short_name)
              
            book_id = "BLABDL"
              
            task_run1 = dict(app_id=app.app_id, task_id=task1.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/BLABDL/metadados/tabelasBaixa/image2000_0.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
            task_run2 = dict(app_id=app.app_id, task_id=task1.task.id, info='{\"img_url\":\"https://localhost/mb-static/books/BLABDL/metadados/tabelasBaixa/image2000_1.png\",\"linhas\":[[0,0,507,0],[0,54,507,54],[0,103,507,103],[0,178,507,178]],\"colunas\":[[0,0,0,178],[239,0,239,178],[507,0,507,178]],\"maxX\":507,\"maxY\":178}')
        
            # 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(task1.check_answer())
               
            task1.add_next_task()
             
            assert False   
         
        except Meb_exception_tt3 as e:
            self.assertEquals(e.code, 5)
         
        finally:
            next_app = None 
            next_app_list = pbclient.find_app(short_name=app.short_name[:-1] + "4")
             
            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["img_url"] == task1.task.info["img_url"]: 
                        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="BLABDL")
 def setUp(self):
     self.app_tt_struct = Apptt_struct(short_name="sh_tt3",title="title3")