2016-08-17 18:21:50 +02:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
2016-08-18 00:23:49 +02:00
import unittest
2016-08-17 18:21:50 +02:00
import requests_mock
import json
2016-09-27 19:47:22 +02:00
import os
2016-08-17 18:21:50 +02:00
2016-08-18 13:18:58 +02:00
import pymisp as pm
2016-08-17 18:21:50 +02:00
from pymisp import PyMISP
2016-09-27 19:47:22 +02:00
from pymisp import NewEventError
from pymisp import MISPEvent
from pymisp import EncodeUpdate
from pymisp import EncodeFull
2016-08-17 18:21:50 +02:00
@requests_mock.Mocker ( )
2016-08-18 00:23:49 +02:00
class TestOffline ( unittest . TestCase ) :
2016-08-17 18:21:50 +02:00
def setUp ( self ) :
2016-08-18 00:40:30 +02:00
self . maxDiff = None
2016-08-17 18:21:50 +02:00
self . domain = ' http://misp.local/ '
self . key = ' aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa '
2016-08-18 00:40:30 +02:00
self . event = { ' Event ' : json . load ( open ( ' tests/misp_event.json ' , ' r ' ) ) }
2016-08-26 18:23:02 +02:00
self . new_misp_event = { ' Event ' : json . load ( open ( ' tests/new_misp_event.json ' , ' r ' ) ) }
2016-09-27 19:47:22 +02:00
self . ressources_path = os . path . join ( os . path . abspath ( os . path . dirname ( __file__ ) ) , ' ../pymisp/data ' )
self . types = json . load ( open ( os . path . join ( self . ressources_path , ' describeTypes.json ' ) , ' r ' ) )
2016-08-18 13:18:58 +02:00
self . sharing_groups = json . load ( open ( ' tests/sharing_groups.json ' , ' r ' ) )
2016-08-19 10:13:00 +02:00
self . auth_error_msg = { " name " : " Authentication failed. Please make sure you pass the API key of an API enabled user along in the Authorization header. " ,
" message " : " Authentication failed. Please make sure you pass the API key of an API enabled user along in the Authorization header. " ,
" url " : " \ /events \ /1 " }
2016-08-17 18:21:50 +02:00
def initURI ( self , m ) :
2016-08-19 10:13:00 +02:00
m . register_uri ( ' GET ' , self . domain + ' events/1 ' , json = self . auth_error_msg , status_code = 403 )
2016-08-18 13:18:58 +02:00
m . register_uri ( ' GET ' , self . domain + ' servers/getVersion.json ' , json = { " version " : " 2.4.50 " } )
m . register_uri ( ' GET ' , self . domain + ' sharing_groups/index.json ' , json = self . sharing_groups )
2016-08-17 18:21:50 +02:00
m . register_uri ( ' GET ' , self . domain + ' attributes/describeTypes.json ' , json = self . types )
m . register_uri ( ' GET ' , self . domain + ' events/2 ' , json = self . event )
2016-08-18 00:23:49 +02:00
m . register_uri ( ' POST ' , self . domain + ' events/2 ' , json = self . event )
m . register_uri ( ' DELETE ' , self . domain + ' events/2 ' , json = { ' message ' : ' Event deleted. ' } )
m . register_uri ( ' DELETE ' , self . domain + ' events/3 ' , json = { ' errors ' : [ ' Invalid event ' ] , ' message ' : ' Invalid event ' , ' name ' : ' Invalid event ' , ' url ' : ' /events/3 ' } )
2016-08-18 00:40:30 +02:00
m . register_uri ( ' DELETE ' , self . domain + ' attributes/2 ' , json = { ' message ' : ' Attribute deleted. ' } )
2016-08-17 18:21:50 +02:00
def test_getEvent ( self , m ) :
self . initURI ( m )
2016-08-26 18:23:02 +02:00
pymisp = PyMISP ( self . domain , self . key )
2016-08-18 00:23:49 +02:00
e1 = pymisp . get_event ( 2 )
e2 = pymisp . get ( 2 )
self . assertEqual ( e1 , e2 )
self . assertEqual ( self . event , e2 )
def test_updateEvent ( self , m ) :
self . initURI ( m )
2016-08-26 18:23:02 +02:00
pymisp = PyMISP ( self . domain , self . key )
2016-08-18 00:23:49 +02:00
e0 = pymisp . update_event ( 2 , json . dumps ( self . event ) )
e1 = pymisp . update_event ( 2 , self . event )
self . assertEqual ( e0 , e1 )
2016-08-18 00:40:30 +02:00
e2 = pymisp . update ( e0 )
2016-08-18 00:23:49 +02:00
self . assertEqual ( e1 , e2 )
self . assertEqual ( self . event , e2 )
def test_deleteEvent ( self , m ) :
self . initURI ( m )
2016-08-26 18:23:02 +02:00
pymisp = PyMISP ( self . domain , self . key )
2016-08-18 00:23:49 +02:00
d = pymisp . delete_event ( 2 )
self . assertEqual ( d , { ' message ' : ' Event deleted. ' } )
d = pymisp . delete_event ( 3 )
self . assertEqual ( d , { ' errors ' : [ ' Invalid event ' ] , ' message ' : ' Invalid event ' , ' name ' : ' Invalid event ' , ' url ' : ' /events/3 ' } )
def test_deleteAttribute ( self , m ) :
self . initURI ( m )
2016-08-26 18:23:02 +02:00
pymisp = PyMISP ( self . domain , self . key )
2016-08-18 00:23:49 +02:00
d = pymisp . delete_attribute ( 2 )
2016-08-18 00:40:30 +02:00
self . assertEqual ( d , { ' message ' : ' Attribute deleted. ' } )
def test_publish ( self , m ) :
self . initURI ( m )
2016-08-26 18:23:02 +02:00
pymisp = PyMISP ( self . domain , self . key )
2016-09-27 19:47:22 +02:00
e = pymisp . publish ( self . event ) # requests-mock always return the non-published event
2016-08-18 00:40:30 +02:00
pub = self . event
pub [ ' Event ' ] [ ' published ' ] = True
2016-09-27 19:47:22 +02:00
# self.assertEqual(e, pub) FIXME: broken test, not-published event returned
2016-08-18 00:40:30 +02:00
e = pymisp . publish ( self . event )
self . assertEqual ( e , { ' error ' : ' Already published ' } )
2016-08-18 13:18:58 +02:00
def test_getVersions ( self , m ) :
self . initURI ( m )
2016-08-26 18:23:02 +02:00
pymisp = PyMISP ( self . domain , self . key )
2016-08-18 13:18:58 +02:00
api_version = pymisp . get_api_version ( )
self . assertEqual ( api_version , { ' version ' : pm . __version__ } )
server_version = pymisp . get_version ( )
self . assertEqual ( server_version , { " version " : " 2.4.50 " } )
def test_getSharingGroups ( self , m ) :
self . initURI ( m )
2016-08-26 18:23:02 +02:00
pymisp = PyMISP ( self . domain , self . key )
2016-08-18 13:18:58 +02:00
sharing_groups = pymisp . get_sharing_groups ( )
self . assertEqual ( sharing_groups , self . sharing_groups [ ' response ' ] [ 0 ] )
2016-08-19 10:13:00 +02:00
def test_auth_error ( self , m ) :
self . initURI ( m )
2016-08-26 18:23:02 +02:00
pymisp = PyMISP ( self . domain , self . key )
2016-08-19 10:13:00 +02:00
error = pymisp . get ( 1 )
response = self . auth_error_msg
response [ ' errors ' ] = [ response [ ' message ' ] ]
2016-08-26 18:23:02 +02:00
self . assertEqual ( error , response )
def test_newEvent ( self , m ) :
error_empty_info = { ' message ' : ' The event could not be saved. ' , ' name ' : ' Add event failed. ' , ' errors ' : { ' Event ' : { ' info ' : [ ' Info cannot be empty. ' ] } } , ' url ' : ' /events/add ' }
2016-08-27 18:13:15 +02:00
error_empty_info_flatten = { u ' message ' : u ' The event could not be saved. ' , u ' name ' : u ' Add event failed. ' , u ' errors ' : [ u " Error in info: Info cannot be empty. " ] , u ' url ' : u ' /events/add ' }
2016-08-26 18:23:02 +02:00
self . initURI ( m )
pymisp = PyMISP ( self . domain , self . key )
m . register_uri ( ' POST ' , self . domain + ' events ' , json = error_empty_info )
2016-09-28 18:20:37 +02:00
# TODO Add test exception if info field isn't set
response = pymisp . new_event ( 0 , 1 , 0 , ' Foo ' )
2016-08-26 18:23:02 +02:00
self . assertEqual ( response , error_empty_info_flatten )
m . register_uri ( ' POST ' , self . domain + ' events ' , json = self . new_misp_event )
response = pymisp . new_event ( 0 , 1 , 0 , " This is a test. " , ' 2016-08-26 ' , False )
self . assertEqual ( response , self . new_misp_event )
2016-09-27 19:47:22 +02:00
def test_eventObject ( self , m ) :
self . initURI ( m )
pymisp = PyMISP ( self . domain , self . key )
2016-10-10 13:42:06 +02:00
misp_event = MISPEvent ( pymisp . describe_types )
2016-09-27 19:47:22 +02:00
misp_event . load ( open ( ' tests/57c4445b-c548-4654-af0b-4be3950d210f.json ' , ' r ' ) . read ( ) )
json . dumps ( misp_event , cls = EncodeUpdate )
json . dumps ( misp_event , cls = EncodeFull )
2016-08-19 10:13:00 +02:00
if __name__ == ' __main__ ' :
unittest . main ( )