Démonstration

From air
Jump to: navigation, search

Démonstration de Elixir et Phoenix

Cette démonstration nécessite d'avoir au préalable installé tout ce qu'il faut pour que Elixir et Phoenix fonctionnent correctement.

Génération d'un nouveau projet

mix phx.new project --app project

Lorsqu'il est demandé : Fetch and install dependencies? entrer Y

Entrer dans le dossier crée : cd project

Configurer la base de données si besoin puis entrer : mix ecto.create

Générer un CRUD

mix phoenix.gen.html Accounts user name:string mail:string phone:string address:string age:integer

Ensuite, ajouter dans le router web/router.ex le chemin vers la page /user.

 scope "/", helloPhoenix do
    pipe_through :browser

    get "/", PageController, :index
    + resources "/user", AccountsController #à ajouter
end

Puis migrer la base de données avec la commande mix ecto.migrate

Visualisation de l'app

mix phx.server

sur le serveur local localhost:4000.

Vous pouvez accéder à la page : localhost:4000/user et créer de nouveaux utilisateurs, les modifier, les supprimer, etc.

Lancement des tests

Ajout d'un test dans : test/{le-dossier-de-votre-choix}, par exemple test/models/accounts_test.exs

test "the truth" do
	assert 1+1 == 2
end

Puis exécuter :

mix test

À la fin il y aura : 17 tests, 0 failures

Et si on ajoute un test qui ne fonctionne pas :

test "won't work" do
	assert 1+1 == 3
end

Après avoir lancé mix test on obtient alors 18 tests, 1 failures et les détails suivants :

 1) test won't work (Project.AccountsTest)
    project/models/accounts_test.exs:23
    Assertion with == failed
    code:  assert 1 + 1 == 3
    left:  2
    right: 3
    stacktrace:
      project/models/accounts_test.exs:24: (test)

Ajout de changeset

Dans web/models/accounts.ex, on ajoute les lignes suivantes :

def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [:name, :mail, :phone, :address, :age])
    |> validate_required([:name, :mail, :phone, :address, :age])
+   |> validate_format(:mail, ~r/@/)  #à ajouter
+   |> validate_inclusion(:age, 0..100) #à ajouter

Et on voit alors sur l'app web qu'il n'est plus possible d'insérer un nouvel utilisateur avec un age qui n'est pas compris entre 0 et 100 ou dont l'adresse email n'a pas un format valide.

Maintenant si on lance mix test on voit que certains tests ne passent plus. Si on regarde les premières lignes des fichiers test/models/accounts_test.exs et test/controllers/accounts_controller_test.exs on voit alors que les données entrées ne correspondent pas aux requirements du changeset :

@valid_attrs %{address: "some content", age: 42, mail: "some content", name: "some content", phone: "some content"}

doit être remplacé par :

@valid_attrs %{address: "Polytech", age: 42, mail: "toto@titi.fr", name: "Toto", phone: "0600000000"}

Problèmes / Solutions

Quelques erreurs rencontrées lors de l'utilisation de Phoenix et leurs solutions

Commande Erreur Solution

mix ecto.create

FATAL 3D000: database "postgres" does not exist. The database couldn't be created, database "postgres" does not exist

createdb postgres

mix ecto.migrate

ERROR 42P07 (duplicate_table): relation "table" already exists

Depuis Postico, supprimer la base de donnée en question