Algorithm For Longest Palindrome
It's good to see code that comes with tests - well done!
I would add some more tests in places.  Specifically, we ought to test is_palindrome() with a single-letter input, as that's something that could easily get broken, and find_palindrome() needs testing with some strings where the longest palindrome is at beginning, middle or end.
I'm concerned at

assert find_palindrome('ab') == 'b'


There's nothing in the problem statement that says we couldn't return 'a' instead, so this is actually over-testing the code.  There's something similar going in in test_generate_substrings() where we require a specific order (we'd be better testing the result converted to set rather than list, to make the test more reasonable).

In terms of the algorithm, I see an obvious candidate for improvement:

for string in generate_substrings(string):
    if is_palindrome(string):
        vec.append(string)

for string in vec:
    if len(answer) &lt;= len(string):
        answer = string


We store all of the palindromes in vec, even though we only want the longest one.  So we don't really need vec:
for string in generate_substrings(string):
    if is_palindrome(string) and len(answer) &lt;= len(string):
        answer = string

We could do even better if we arrange for generate_substrings() to return all the substrings longest first.  Then we wouldn't need to generate or use all the shorter substrings:
for string in generate_substrings_longest_first(string):
    if is_palindrome(string):
        return string