class TestRichMetadataInterceptor(unittest.TestCase):

        


    def setUp(self):
        
        self.metadataDBHandler = MockMetadataDBHandler()
        self.voteCastDBHandler = MockVoteCastHandler()
        self.subSupp = MockSubtitlesHandler()
        self.my_permid_and_keypair = generatePermIds(1)[0]
        self.advertisedChannelIds = generatePermIds(CHANNELCAST_NUM_OF_ENTRIES)
        self.advertisedInfohash =  generateInfohashes(CHANNELCAST_NUM_OF_ENTRIES)
        self.peersHaveMngr = MockPeersHaveMngr()
        
        self.channelcastMsg = dict()
        for i in range(CHANNELCAST_NUM_OF_ENTRIES):
    
            signature, msg = generateChannelCastEntry(self.advertisedChannelIds[i][0], 
                                                      self.advertisedInfohash[i], 
                                                      self.advertisedChannelIds[i][1])
            
            self.channelcastMsg[signature] = msg
            
        self.undertest = RichMetadataInterceptor(self.metadataDBHandler, self.voteCastDBHandler, 
                                                 self.my_permid_and_keypair[0], self.subSupp,
                                                 self.peersHaveMngr)
        
        self.metadataDBHandler.nextKeypair = self.advertisedChannelIds[0][1]
            


    def testAddRMDContentNoContent(self):
        self.metadataDBHandler.returnMetadata = False
        newMessage = self.undertest.addRichMetadataContent(self.channelcastMsg)
        #message should be left untouched
        self.assertEquals(self.channelcastMsg,newMessage)
        #check if the the db handler is called
        self.assertEquals(CHANNELCAST_NUM_OF_ENTRIES,self.metadataDBHandler.getMetadataCount)
        
        for i in range(CHANNELCAST_NUM_OF_ENTRIES):
            self.assertTrue(
                            (self.advertisedChannelIds[i][0], self.advertisedInfohash[i])
                              in self.metadataDBHandler.getMetadataParametesHistory) 
    
    def testAddRichMetadataContentSomeContent(self):
        self.metadataDBHandler.returnMetadata = True
        newMessage = self.undertest.addRichMetadataContent(self.channelcastMsg)
        #message should have been changed
        self.assertNotEquals(self.channelcastMsg,newMessage)
        
        for item in newMessage.itervalues():
            #check the contents of the modified message
            self.assertTrue('rich_metadata' in item.keys())
            #description,bitmask,timestamp,listofchecksums, signature
            self.assertEquals(6, len(item['rich_metadata']))
        
        

        
        
    
    def test_splitChnAndRmdNoContent(self):
        self.metadataDBHandler.returnMetadata = False
        newMessage = self.undertest.addRichMetadataContent(self.channelcastMsg)
        
        listOfmetadata = \
            self.undertest._splitChannelcastAndRichMetadataContents(newMessage)
        
        self.assertEquals(([],[]),listOfmetadata)
    
    
    def test_splitChnAndRmdSomeContent(self):
        self.metadataDBHandler.returnMetadata = True
        newMessage = self.undertest.addRichMetadataContent(self.channelcastMsg)
        
        listOfmetadata = \
            self.undertest._splitChannelcastAndRichMetadataContents(newMessage)
    
        listOfmetadata = listOfmetadata[0]
        self.assertEquals(2,len(listOfmetadata))
        for dto in listOfmetadata:
            self.assertTrue(isinstance(dto[0], MetadataDTO))

    def testHandleRMetadata(self):
        self.metadataDBHandler.returnMetadata = True
        newMessage = self.undertest.addRichMetadataContent(self.channelcastMsg)
        
        #it will result that i am a subscriber for any channel
        self.voteCastDBHandler.nextVoteValue = 2
        
        
        self.undertest.handleRMetadata(self.advertisedChannelIds[0][0], 
                                       newMessage)
        
        self.assertEquals(2, self.metadataDBHandler.insertMetadataCount)
        self.assertEquals(2, self.subSupp.retrieveMultipleCount)
        
        pass