Skip to content

Commit

Permalink
implemented password generation functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
chr-peters committed Mar 19, 2021
1 parent 8372902 commit a21f37d
Show file tree
Hide file tree
Showing 2 changed files with 165 additions and 1 deletion.
50 changes: 50 additions & 0 deletions strong_but_simple_passwords/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,56 @@
"I love the taste of a pice of chocolate cake",
]

symbols = "!?@#$%^&*"


def get_random_sentence():
return random.choice(sentences)


def get_first_letters_from_word(word, num_letters):
if num_letters < 0:
raise ValueError(
f"num_letters={num_letters} is invalid. "
"The number of letters must be positive!"
)

new_word_length = min(len(word), num_letters)
return word[:new_word_length]


def get_first_letters_from_each_word(sentence, num_letters=1):
words = sentence.split()
first_letters = [get_first_letters_from_word(word, num_letters) for word in words]
return first_letters


def get_random_symbol():
return random.choice(symbols)


def put_symbol_between_words(list_of_words, symbol, position):
if position > len(list_of_words):
raise ValueError(
"Position can't be greater than length! "
f"length={len(list_of_words)}, position={position}"
)

if position < 0:
raise ValueError("Position can't be negative!")

copy = list_of_words.copy()
copy.insert(position, symbol)

return copy


def generate_password_from_sentence(sentence, letters_per_word=1):
first_letters = get_first_letters_from_each_word(sentence, letters_per_word)

symbol = get_random_symbol()
symbol_position = random.randint(0, len(first_letters))
words_with_symbol = put_symbol_between_words(first_letters, symbol, symbol_position)

# convert the list of words with the symbol to a single string
return "".join(words_with_symbol)
116 changes: 115 additions & 1 deletion tests/test_core.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,121 @@
from strong_but_simple_passwords.core import get_random_sentence, sentences
import pytest
from strong_but_simple_passwords.core import (
get_random_sentence,
get_random_symbol,
sentences,
symbols,
get_first_letters_from_word,
get_first_letters_from_each_word,
put_symbol_between_words,
generate_password_from_sentence,
)
from strong_but_simple_passwords import core
import random


def test_get_random_sentence():
random_sentence = get_random_sentence()

assert random_sentence in sentences


def test_get_first_letters_from_word():
word = "Candy"
assert get_first_letters_from_word(word, 0) == ""
assert get_first_letters_from_word(word, 1) == "C"
assert get_first_letters_from_word(word, 2) == "Ca"
assert get_first_letters_from_word(word, 3) == "Can"
assert get_first_letters_from_word(word, 10) == "Candy"

word = ""
assert get_first_letters_from_word(word, 0) == ""
assert get_first_letters_from_word(word, 1) == ""
assert get_first_letters_from_word(word, 10) == ""

with pytest.raises(ValueError):
get_first_letters_from_word("oops", -1)


def test_get_first_letters_from_each_word():
sentence = "I like cute dogs"
assert get_first_letters_from_each_word(sentence, 1) == ["I", "l", "c", "d"]
assert get_first_letters_from_each_word(sentence, 2) == ["I", "li", "cu", "do"]
assert get_first_letters_from_each_word(sentence, 3) == ["I", "lik", "cut", "dog"]
assert get_first_letters_from_each_word(sentence, 0) == ["", "", "", ""]

sentence = "Hello"
assert get_first_letters_from_each_word(sentence, 1) == ["H"]
assert get_first_letters_from_each_word(sentence, 2) == ["He"]
assert get_first_letters_from_each_word(sentence, 0) == [""]

with pytest.raises(ValueError):
get_first_letters_from_each_word(sentence, -1)


def test_get_random_symbol():
random_symbol = get_random_symbol()

assert random_symbol in symbols


def test_put_symbol_between_words():
words = ["I", "like", "cute", "dogs"]
symbol = "!"

assert put_symbol_between_words(words, symbol, 0) == [
"!",
"I",
"like",
"cute",
"dogs",
]

assert put_symbol_between_words(words, symbol, 1) == [
"I",
"!",
"like",
"cute",
"dogs",
]

assert put_symbol_between_words(words, symbol, 3) == [
"I",
"like",
"cute",
"!",
"dogs",
]

assert put_symbol_between_words(words, symbol, 4) == [
"I",
"like",
"cute",
"dogs",
"!",
]

with pytest.raises(ValueError):
put_symbol_between_words(words, symbol, 10)

with pytest.raises(ValueError):
put_symbol_between_words(words, symbol, -1)


def test_generate_password_from_sentence(monkeypatch):
monkeypatch.setattr(core, "get_random_symbol", lambda: "!")
monkeypatch.setattr(random, "randint", lambda x, y: 1)

sentence = "I like cute dogs and cats"
assert generate_password_from_sentence(sentence) == "I!lcdac"

monkeypatch.setattr(random, "randint", lambda x, y: 0)
assert generate_password_from_sentence(sentence) == "!Ilcdac"

monkeypatch.setattr(random, "randint", lambda x, y: 6)
assert generate_password_from_sentence(sentence) == "Ilcdac!"

monkeypatch.setattr(random, "randint", lambda x, y: 3)
assert (
generate_password_from_sentence(sentence, letters_per_word=3)
== "Ilikcut!dogandcat"
)

0 comments on commit a21f37d

Please sign in to comment.